Что передает параметры SQL и почему мне нужен он?

Новичок здесь:

В этом ответе на мой вопрос того, как вставить данные в 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(); 


    }

}

13
задан Community 23 May 2017 в 12:31
поделиться

5 ответов

Передача параметров в 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 объект для передачи значения.

18
ответ дан 1 December 2019 в 19:58
поделиться

Это защитит вас от маленьких столиков Бобби.

http://xkcd.com/327/

8
ответ дан 1 December 2019 в 19:58
поделиться

В дополнение к SQL-инъекции и т.п. параметризованные запросы всегда выглядят одинаково для SQL-сервера. Скорее всего, план выполнения запроса будет кэширован, поэтому, если вы отправите тот же запрос еще раз, он будет работать быстрее. Это будет очень заметно, если вы выполняете один и тот же запрос много раз в цикле или у вас много клиентов, запрашивающих ваш сервер.

1
ответ дан 1 December 2019 в 19:58
поделиться

Вот пример:

        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 возвращается со значением, к которому я могу получить доступ.

3
ответ дан 1 December 2019 в 19:58
поделиться

Основная проблема с простым сцепляемыми строками заключается в том, что они часто оставляют вас уязвимыми для атак SQL Injection.

Google SQL Injection или прочитайте здесь.

2
ответ дан 1 December 2019 в 19:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: