На данный момент я применяю «брось все на стену и вижу, какой метод палочки останавливает вышеупомянутые проблемы». Ниже приведена функция, которую я объединил:
function madSafety($string) { $string = mysql_real_escape_string($string); $string = stripslashes($string); $string = strip_tags($string); return $string; }
Однако я убежден, что есть лучший способ сделать это. Я использую FILTER_ SANITIZE_STRING, и это, похоже, не полностью защищает.
Наверное, я спрашиваю, какие методы вы используете, и насколько они успешны? благодаря
Просто делать много вещей, которые вы действительно не понимаете, не поможет вам. Вам нужно понять, что такое инъекции и как именно и где вы должны что-то делать.
В пунктах:
mysql_real_escape_string
). stripslashes
данные (например, stripslashes
) при извлечении данных из базы данных. echo
), вы должны по умолчанию избегать строки (используя htmlentities
с ENT_QUOTES
). 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 Не совсем уверен, как реагировать на эти отрицательные голоса. Вы, люди, действительно читаете мой ответ?