Как справиться с инъекцией sql из asp.net - PullRequest
0 голосов
/ 16 декабря 2011

Какой из asp.net лучший способ избежать инъекций sql, но в то же время я хочу, чтобы мой пользователь мог свободно вводить любой специальный символ.

Редактировать

Я не использую какой-либо параметризованный запрос, я использую корпоративную библиотеку и хранимую процедуру

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Параметризованные запросы. Используйте их везде, где у вас есть запрос, и ваш пользователь может ввести любой символ, который ему особенно нравится.

Если вы используете ORM, это в значительной степени для вас, но если нет, то вам нужно сделать что-то вроде этого:

comm.CommandText = "insert into MyTable (col1, col2) values (@col1, @col2)";
comm.Parameters.AddWithValue("@col1", 123);
comm.Parameters.AddWithValue("@col2", "; drop table whatever; --");
comm.ExecuteNonQuery();

Этот запрос на 100% безопасен для запуска до тошноты. Пусть .NET просто обработает параметры для вас, и все будет готово.

Кроме того, убедитесь, что вы используете nvarchar (Unicode) столбцы вместо varchar, если ваши пользователи будут вставлять символы за пределы набора символов ANSI.

1 голос
/ 16 декабря 2011

Используйте метод SqlCommand.Prepare , как указано в Бобби-столах .

private static void SqlCommandPrepareEx(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand(null, connection);

        // Create and prepare an SQL statement.
        command.CommandText =
            "INSERT INTO Region (RegionID, RegionDescription) " +
            "VALUES (@id, @desc)";
        SqlParameter idParam = new SqlParameter("@id", SqlDbType.Int, 0);
        SqlParameter descParam = 
            new SqlParameter("@desc", SqlDbType.Text, 100);
        idParam.Value = 20;
        descParam.Value = "First Region";
        command.Parameters.Add(idParam);
        command.Parameters.Add(descParam);

        // Call Prepare after setting the Commandtext and Parameters.
        command.Prepare();
        command.ExecuteNonQuery();

        // Change parameter values and call ExecuteNonQuery.
        command.Parameters[0].Value = 21;
        command.Parameters[1].Value = "Second Region";
        command.ExecuteNonQuery();
    }
}
...