Как избежать SQL-инъекций с параметрами с помощью C #?

#c# #sql #sql-injection

#c# #sql #sql-инъекция

Вопрос:

Недавно я скорректировал свой код, чтобы избежать SQL-инъекций для maria db, и мне помогли с добавлением параметров, когда я использовал страницу метода parameters, возникла ошибка времени выполнения

 strSQL = "SELECT * from user where uid = @uid AND start >= @StartDate AND end <= @EndDate ";
DataSet ds = QueryDataSet(strSQL, uid , StartDate, EndDate);


public DataSet QueryDataSet(string strSQL,string uid , string StartDate, string EndDate)
{
    try
    {
        MySqlDataAdapter da = new MySqlDataAdapter(strSQL, DBconn);
        da.SelectCommand.Parameters.AddWithValue("@uid", uid );
        da.SelectCommand.Parameters.AddWithValue("@StartDate", StartDate);
        da.SelectCommand.Parameters.AddWithValue("@EndDate", EndDate);
        DataSet ds = new DataSet();
        da.Fill(ds);
        return ds;
    }
    catch (Exception ex)
    //catch
    {
        throw (new System.Exception(ex.Message));

    }
}
  

Я относительно новичок в использовании maria db, поэтому любая помощь приветствуется

Комментарии:

1. В чем ваш вопрос?

2. TBH Я не знаю, почему это было помечено, поскольку даже нет вопроса для начала …

3. @MichaelRandall Мне просто интересно, что заставляет вас думать, что это дубликат выбранного вами вопроса. Я имею в виду, это даже не вопрос — просто дамп кода — и явно не о том, зачем использовать параметры… Если его нужно закрыть, это из-за неясности.

4. «ошибка во время выполнения» — обычно такие ошибки содержат, как вы знаете, полезную информацию в сообщении об ошибке . Вы не сказали нам, какую ошибку вы получаете .

5. Почему вы отправляете даты в виде строк в базу данных? Хотя я не могу быть уверен, не увидев сообщение об ошибке, и даже если это не причина вашей ошибки, вы не должны этого делать. Отправляйте даты как даты (экземпляры структуры DateTime), а не как строки.

Ответ №1:

Если вы хотите избежать SQL-инъекций, другим подходом, помимо параметризованных запросов, являются хранимые процедуры.

Вы можете прочитать это здесь => https://www.techonthenet.com/mariadb/procedures.php или вы можете исследовать самостоятельно.

Демонстрационный способ вызова хранимой процедуры в ASP.NET приложение:

 using (MySqlConnection con = new MySqlConnection(constr))
{
    using (MySqlCommand cmd = new MySqlCommand("Customers_GetCustomer", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@CustId", customerId);

        using (MySqlDataAdapter sda = new MySqlDataAdapter(cmd))
        {
            DataTable dt = new DataTable();
            sda.Fill(dt);

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
}
  

(Код взят из https://www.aspsnippets.com/Articles/Call-MySql-Stored-Procedure-with-Parameters-in-ASPNet-C-and-VBNet.aspx )