Новичок здесь:
В этом ответе на мой вопрос того, как вставить данные в SQL Server, как который он упомянул передающие параметры вместо конкатенации строк, я в настоящее время имею.
Это действительно необходимо для безопасности? Если так, что точно передает параметры? Когда я гуглю его, я добираюсь много о хранимых процедурах. Это, что я хочу, я еще не знаю о хранимых процедурах.....
Если бы можно указать на меня в правильном направлении, я ценил бы это.
Спасибо.
Править:
Хорошо, вот то, что я получил. Это, кажется, обновляет базу данных правильно, и в конечном счете я изменюсь, твердое кодировало ints к исходным данным от маркировки. Подтвердите, не ли, как я, это уязвимо ни для какого внедрения SQL или взломов.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
public partial class Stats : System.Web.UI.Page
{
public SqlDataReader DataReader;
public SqlCommand Command;
string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES (@UID, @CL, @LL, @HL);");
//string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES ('a051fc1b-4f51-485b-a07d-0f378528974e', 2, 2, 2);");
protected void Page_Load(object sender, EventArgs e)
{
LabelUserID.Text = Membership.GetUser().ProviderUserKey.ToString();
}
protected void Button1_Click(object sender, EventArgs e)
{
//connect to database
MySqlConnection database = new MySqlConnection();
database.CreateConn();
//create command object
Command = new SqlCommand(queryString, database.Connection);
//add parameters. used to prevent sql injection
Command.Parameters.Add("@UID", SqlDbType.UniqueIdentifier);
Command.Parameters["@UID"].Value = Membership.GetUser().ProviderUserKey;
Command.Parameters.Add("@CL", SqlDbType.Int);
Command.Parameters["@CL"].Value = 9;
Command.Parameters.Add("@LL", SqlDbType.Int);
Command.Parameters["@LL"].Value = 9;
Command.Parameters.Add("@HL", SqlDbType.Int);
Command.Parameters["@HL"].Value = 9;
Command.ExecuteNonQuery();
}
}
Передача параметров в SQL избавляет вас от необходимости создавать динамическую строку SQL.
Создание динамических операторов SQL - это ОГРОМНАЯ угроза безопасности, потому что люди могут внедрить свой собственный код SQL в ваше приложение, возможно, выполняя нежелательные команды для ваших данных.
Есть несколько хороших примеров возможных атак SQL-инъекций по адресу:
SQL-инъекционные атаки на примере
Есть два способа передачи параметров в операторы SQL. Один из них - использовать хранимые процедуры, как вы упомянули. Другой - использовать параметризованные запросы (что на самом деле я предпочитаю).
Параметризованный запрос на самом деле довольно прост в .NET:
using(SqlConnection conn = new SqlConnection(connString))
{
SqlCommand command =
new SqlCommand("SELECT * FROM Users WHERE Username = @Username", conn);
command.Parameters.Add(new SqlParameter("@Username", "Justin Niessner"));
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataTable dt = new DataTable();
adapter.Fill(dt);
}
В этом примере параметр был @Username
, и мы использовали коллекцию Parameters
из SqlCommand
объект для передачи значения.
В дополнение к SQL-инъекции и т.п. параметризованные запросы всегда выглядят одинаково для SQL-сервера. Скорее всего, план выполнения запроса будет кэширован, поэтому, если вы отправите тот же запрос еще раз, он будет работать быстрее. Это будет очень заметно, если вы выполняете один и тот же запрос много раз в цикле или у вас много клиентов, запрашивающих ваш сервер.
Вот пример:
SqlConnection myConn = new SqlConnection("my connection string");
SqlCommand myCmd = new SqlCommand("myStoredProcName", myConn);
myCmd.CommandType = CommandType.StoredProcedure;
myCmd.Parameters.AddWithValue("@cGroupID", 0).Direction = ParameterDirection.InputOutput;
myCmd.Parameters.AddWithValue("@gType", "C");
myCmd.Parameters.AddWithValue("@requirement", "Y");
myCmd.Parameters.AddWithValue("@usercode", "XX");
myConn.Open();
myCmd.ExecuteNonQuery();
int covID = (int)myCmd.Parameters["@cGroupID"].Value;
Использование параметров — это хороший способ предотвратить некоторые ошибки и помочь остановить векторы инъекций. Он также позволяет использовать параметры OUTPUT, как в примере выше, где cGroupID возвращается со значением, к которому я могу получить доступ.
Основная проблема с простым сцепляемыми строками заключается в том, что они часто оставляют вас уязвимыми для атак SQL Injection.
Google SQL Injection или прочитайте здесь.