Подтвердить что ты не робот

Лучший способ защитить от инъекций mysql и межсайтового скриптинга

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

function madSafety($string)
{

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

}

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

Думаю, я спрашиваю, какие методы вы используете, и насколько они успешны? Благодаря

4b9b3361

Ответ 1

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

В пунктах пули:

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

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

Ответ 3

Dont! Использовать 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.

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

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

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

Ответ 4

Этот вопрос настолько ошибочен!

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

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

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

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

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

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

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

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

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

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