предотвращение моего приложения от инъекций sql? - PullRequest
2 голосов
/ 08 ноября 2010

Я делаю проект, в котором у меня есть страница входа.

Я ограничиваю пользователя вводом

ИЛИ НЕ XOR & |^

достаточно ли этого, чтобы запретить моему приложению инъекцию SQL?

Ответы [ 7 ]

12 голосов
/ 08 ноября 2010

Нет, совсем нет.

Например, я все еще могу ввести свое имя пользователя как:

; DELETE FROM Users --

Что может, в зависимости от структуры вашей БД и кода приложения, стереть всю таблицу пользователей.

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

6 голосов
/ 08 ноября 2010

Вам не нужно искать специальные слова / символы в их имени пользователя / пароле. Потому что вы ВСЕГДА будете что-то упускать.

Вместо этого, если вы встроили SQL, вам следует использовать параметризованные запросы. Если вы сделаете это для всех ваших запросов, то вы будете защищены от внедрения SQL. Теперь XSS - это совсем другое дело ..;)

Это было подробно рассмотрено на этом сайте, просто поиск SQL инъекций.

2 голосов
/ 08 ноября 2010

Использование хранимых процедур или параметризованных запросов предотвратит внедрение SQL.

1) Кроме того, если вы используете ASP.NET, вы можете включить атрибут уровня страницы «ValidateRequest = True», который может проверять, может ли какая-либо из входных строк привести к внедрению скрипта

2) Убедитесь, что вы не отображаете фактическую системную ошибку для конечного пользователя. Это приведет к тому, что хакер зайдет дальше и сломает систему.

3) Если вы используете веб-сервис для использования и синхронизации данных с вашей базой данных, проверьте все необходимые поля перед сохранением данных.

1 голос
/ 08 ноября 2010

Определенно нет!

Самым простым способом избежать внедрения SQL-кода является использование параметризованных запросов.

См. Этот вопрос ТАК: Preventing SQL Injection in ASP.Net VB.Net и все его ответы, чтобы дать вам представление.

Короче говоря, я никогда не использую сцепленные строковые запросы, но ВСЕГДА параметры. Таким образом, никакой опасности нет, и это самый безопасный способ предотвратить внедрение SQL.

0 голосов
/ 08 ноября 2010

Как говорили другие.Параметризованные входы.

Вот фрагмент кода, который я написал на работе (удален код, специфичный для работы).Это не идеально, но моя основная работа - не программирование, и я все еще изучал C #, когда писал это.Если бы я написал это сейчас, я бы использовал вместо набора данных средство чтения данных.

Но обратите внимание, как я использую переменные в фактической строке SQL и назначаю переменные с помощью "da.SelectCommand.Parameters.AddWithValue"

public Boolean Login(string strUserName, string strPassword)
        {
            SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();
            DataSet ds = null;
            SqlDataAdapter da = null;

            sqlConn.ConnectionString = strConnString;

            try
            {
                blnError = false;
                sqlConn.Open();

                ds = new DataSet();
                da = new SqlDataAdapter("select iuserid from tbl_Table where vchusername = @vchUserName and vchpassword = @vchPassword", sqlConn);

                da.SelectCommand.Parameters.AddWithValue("@vchUserName", strUserName);
                da.SelectCommand.Parameters.AddWithValue("@vchPassword", strPassword);

                da.SelectCommand.CommandTimeout = 30;
                da.Fill(ds);

                if (ds.Tables[0].Rows.Count > 0)
                {
                    iUserId = (int)ds.Tables[0].Rows[0]["iuserid"];
                }
            }
            catch (Exception ex)
            {
                blnError = true;
                Log("Login: " + ex.Message);
            }
            finally
            {
                if (sqlConn.State != ConnectionState.Closed)
                    sqlConn.Close();
                if (da != null)
                    da.Dispose();
                if (ds != null)
                    ds.Dispose();
            }
            if (blnError)
                return false;
            if (iUserId > 0)
                return true;
            return false;
        }
0 голосов
/ 08 ноября 2010

Вот хорошая ссылка для переполнения стека: Что такое SQL-инъекция?

Во-вторых, не забывайте, что не имеет значения, какую проверку вы выполняете в пользовательском интерфейсе, люди могутвсегда создавайте собственные HTTP-запросы и отправляйте их на ваш сервер (тривиально, как редактирование с использованием firebug).

0 голосов
/ 08 ноября 2010

Вы должны передать значения в качестве параметров хранимой процедуре.Таким образом, все, что вводит пользователь, просто обрабатывается как значение, а не добавляется в оператор и выполняется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...