Как предотвратить «DROP BOBBY TABLES», когда пользователь вводит пароль со специальными символами? - PullRequest
3 голосов
/ 03 сентября 2010

В нашей древней классической среде ASP мы используем OWASP для получения пароля от объекта запроса и шифрования не алфавитно-цифровых символов. Это первая линия защиты от внедрения SQL-инъекций. Мы используем другие методы для полного предотвращения инъекций sql.

Проблема в том, что когда мы собираем данные, чтобы собрать сообщение HTTP и просто взять пароль из пользовательского ввода, OWASP и отправить его вместе. Поэтому пароль неверный.

Пример: пароль freddie $ cougar становится freddie & 36; cougar

То, что мы в итоге сделали, предполагало, что текстовое поле из 50 символов не было достаточно места для большой SQL-инъекции и изменило код, чтобы мы не OWASP вводил пароль.

Это лучший способ?

Код написан на vbScript.

Ответы [ 4 ]

4 голосов
/ 03 сентября 2010

Лучшее решение - преобразовать все запросы в параметризованные.

Вот статья 12 лет, объясняющая, как :)

3 голосов
/ 03 сентября 2010

Почему вы отправляете пароль открытым текстом?Рассчитайте хеш-значение для пароля и отправьте его.Это позволит вам предотвратить внедрение SQL-кода и избежать атак типа «человек посередине».

В любом случае вам также необходимо очистить данные, поступающие на ваш сервер.Даже если ваш vbscripts выполняет проверку на стороне клиента, было бы тривиально атаковать ваш сервис, обходя ваш скрипт и создавая вручную пакет со злонамеренным вводом в него.

2 голосов
/ 03 сентября 2010

Подумайте о переносе операторов SQL в хранимые процедуры и убедитесь, что вы не используете динамический SQL в этих хранимых процессах.

Dim userPwd = Trim(Request.QueryString("userPwd"))
'--- Create and append parameter for Password
Set pwdParameter = cmd.CreateParameter("@UserPassword", ad_nVarChar, adParamInput, 50, userPwd)
cmd.Parameters.Append pwdParameter

Кроме того, определенно лучше даже не хранить pwd в вашей базе данных, а скорее соленый хеш.

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

1 голос
/ 03 сентября 2010

Многие сайты ограничивают набор символов, которые можно использовать в паролях - выберите набор, который не вызовет у вас горя.Это, вероятно, означает буквенно-цифровые символы и некоторые знаки препинания (запятая, точка, тире).Предполагая, что эти сайты меня раздражают - я использую богатый набор символов в своих паролях, когда мне предоставляется такая возможность, и на сайтах, предназначенных только для буквенно-цифровых символов, я обычно использую в качестве пароля глупость, например «IHateNoPunctSites».

А как насчет отправки пароля в виде шестнадцатеричной строки или строки в кодировке base-64?Затем вы можете декодировать строку в конце, будучи настолько осторожным, насколько это необходимо, чтобы предотвратить любое внедрение без ограничения набора символов, используемого в пароле.Когда вам нужно проверить пароль, вы можете убедиться, что делаете это правильно, используя параметризованный запрос.Или вы можете хешировать пароль с его солью перед отправкой запроса в файл паролей.В любом случае, вы не должны делать много с паролями.

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