Лучший способ защиты от внедрения MySQL и межсайтового скриптинга - PullRequest
15 голосов
/ 20 февраля 2009

В данный момент я применяю метод «брось все на стену и посмотри, что прилипнет», чтобы остановить вышеупомянутые проблемы. Ниже приведена функция, которую я собрал вместе:

function madSafety($string)
{

$string = mysql_real_escape_string($string);
$string = stripslashes($string);
$string = strip_tags($string);
return $string;

}

Однако я убежден, что есть лучший способ сделать это. Я использую FILTER_ SANITIZE_STRING, и это не похоже на полную безопасность.

Наверное, я спрашиваю, какие методы вы, ребята, используете и насколько они успешны? Спасибо

Ответы [ 4 ]

35 голосов
/ 20 февраля 2009

Просто делать много вещей, которые вы на самом деле не понимаете, не поможет вам. Вы должны понимать, что такое инъекционные атаки, и как именно и что и где вы должны делать.

в пунктах:

  • Отключить магические кавычки . Это неадекватное решение, и они путают вещи.
  • Никогда не вставляйте строки непосредственно в SQL. Используйте связанные параметры или экранируйте (используя mysql_real_escape_string).
  • Не unescape (например, stripslashes) при извлечении данных из базы данных.
  • Когда вы встраиваете строки в html (например, когда вы echo), вы должны по умолчанию экранировать строку (используя htmlentities с ENT_QUOTES).
  • Если вам нужно встроить html-строки в html, вы должны учитывать источник строки. Если это не заслуживает доверия, вы должны пропустить через фильтр. strip_tags в теории то, что вы должны использовать, но оно некорректно; Вместо этого используйте HtmlPurifier .

См. Также: Какой самый лучший метод для очистки ввода пользователя с помощью PHP?

10 голосов
/ 20 февраля 2009

Лучший способ против SQL-внедрения - это связывать переменные, а не «вставлять» их в строку. http://www.php.net/manual/en/mysqli-stmt.bind-param.php

3 голосов
/ 20 февраля 2009

Не ! Использование mysql_real_escape_string достаточно для защиты вас от внедрения SQL, а stropslashes, который вы делаете после , делает вас уязвимым для внедрения SQL. Если вы действительно этого хотите, поставьте перед , как в:

function madSafety($string)
{
    $string = stripslashes($string);
    $string = strip_tags($string);
    $string = mysql_real_escape_string($string);
    return $string;
}

stripslashes не очень полезен, если вы делаете mysql_real_escape_string.

strip_tags защищает от внедрения HTML / XML, а не SQL.

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

Когда вы выполняете запросы MYSQL, используйте mysql_real_escape_string. Когда вы выводите веб-страницы, используйте htmlentities. Для создания веб-ссылок используйте urlencode

Как заметил vartec, если вы можете использовать заполнители любым способом, сделайте это.

1 голос
/ 01 ноября 2013

Эта тема такая неправильная!

Вы НЕ должны фильтровать ввод пользователя! Это информация, которую он ввел. Что вы будете делать, если я хочу, чтобы мой пароль был таким: '"'>s3cr3t<script>alert()</script>

Отфильтруйте символы и оставьте меня с измененным паролем, чтобы я не смог даже преуспеть в первом входе? Это плохо.

Правильное решение - использовать подготовленные операторы или mysql_real_escape_string(), чтобы избежать SQL-инъекций, и использовать экранированное экранирование символов, чтобы избежать путаницы в вашем HTML-коде.

Напомню, что Интернет - это только один из способов представления информации, введенной пользователем. Вы бы согласились на такую ​​зачистку, если бы какое-то программное обеспечение для настольных компьютеров делало это? Я надеюсь, что ваш ответ НЕТ, и вы поймете, почему это не правильный путь.

Обратите внимание, что в разных контекстах необходимо экранировать разные символы. Например, если вам нужно отобразить имя пользователя в виде всплывающей подсказки, вы будете использовать что-то вроде:

<span title="{$user->firstName}">{$user->firstName}</span>

Однако, если пользователь установил свое имя как '"><script>window.document.location.href="http://google.com"</script>, что ты собираешься делать? Убрать цитаты? Это было бы так неправильно! Вместо того чтобы делать это бессмысленно, рассмотрите возможность экранирования кавычек при отображении данных, а не при сохранении их!

Другой контекст, который вы должны учитывать, - это отображение самого значения. Рассмотрим ранее использованный HTML-код и представьте, что имя пользователя будет похоже на <textarea>. Это обернет весь HTML-код, который следует за этим элементом textarea, что приведет к разбивке всей страницы.

Еще раз - рассмотрите возможность экранирования данных в зависимости от контекста, в котором вы их используете!

P.S Не совсем уверен, как реагировать на эти отрицательные голоса. Вы, люди, действительно читаете мой ответ?

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