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

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

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

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

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

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

В пунктах:

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

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

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

Не надо ! Использование 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

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

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

Вы НЕ должны фильтровать вход пользователя! Это информация, введенная им. Что вы собираетесь делать, если я хочу, чтобы мой пароль был следующим: '"'>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, тем самым разбив всю страницу.

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

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