Лучший способ защитить от инъекций 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 Не совсем уверен, как реагировать на эти отрицательные голоса. Вы, люди, действительно читаете мой ответ?