Создать регулярное выражение, чтобы избавиться от недопустимых шаблонов символов в PHP - PullRequest
1 голос
/ 22 августа 2009

В PHP, что это за список потенциально опасных символов, которые можно использовать для разбиения страницы PHP? И, используя регулярные выражения, как я могу отфильтровать неверную последовательность символов из всего моего пользовательского ввода?

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

preg_match("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email);

Это выше проверяет конкретный шаблон электронной почты.

Но так же, как когда вы проверяете, является ли электронная почта действительной, используя регулярное выражение, как я могу проверить, есть ли на входе какие-либо недопустимые шаблоны символов, используя одно выражение для каждого ввода? Я хотел бы разместить эту строку в самом верху моей php-страницы, которая принимает $_GET или $_POST, чтобы предотвратить любые хакерские вводы от сбоя страницы.

Надеюсь, это имеет смысл. Спасибо PG

Ответы [ 3 ]

4 голосов
/ 22 августа 2009

Не существует «одного-единственного» способа фильтрации ввода, как вы описали, так как ни один ввод не является недействительным или даже обязательно вредоносным. Это полностью то, что вы делаете с помощью ввода.

Например, предположим, у вас есть текст в $_GET['field'], и вы собираетесь составить SQL-запрос. Вам нужно экранировать значение, используя mysql_real_escape_string() (для MySQL, конечно), например:

$sql = "INSERT INTO some_table (some_field) VALUES ('" . mysql_real_escape_string($_GET['field']) . "')";

Это экранирование абсолютно необходимо для ввода, которое вы используете в запросе SQL. После применения, как вы видите здесь, даже злонамеренный ввод данных от хакера не окажет вредного воздействия на вашу базу данных.

Однако эта функция бесполезна и прямолинейна. Неправильно использовать, если вы включаете $_GET['field] в некоторые выходные данные HTML со своей страницы. В этом случае функция htmlspecialchars() полезна. Вы можете сделать что-то вроде:

echo "<p>Your comments were: " . htmlspecialchars($_GET['field']) . "</p>";

Оба эти примера довольно безопасны от "хакерских вводов". Вы не будете вставлять вредоносные данные в вашу базу данных или в ваш HTML. Тем не менее, обратите внимание, что две формы выхода - это совершенно разные функции, каждая из которых подходит для своего использования.

Напротив, представьте, что вы пытались «проверить» входные данные для этих двух применений одновременно. Вы, конечно, не можете разрешить < или > символов, так как они могут быть частью вредоносной атаки HTML, такой как межсайтовый скриптинг. Таким образом, посетители, которые хотят написать «Я думаю 1 <3», будут забиты. Точно так же нельзя было допускать кавычки из-за боязни вредоносных атак SQL-инъекций, поэтому бедный «Майлз О'Брайен» никогда не сможет заполнить вашу форму! </p>

Правильный ввод экранирование очень легко сделать, так как вы используете его в разных контекстах (это часто даже проще, чем проверка ввода!), Но результаты намного лучше.

0 голосов
/ 22 августа 2009

Если вас беспокоит ввод пользователя, который будет содержать символы HTML и / или типы атак SQL-инъекций, посмотрите на встроенные функции PHP, такие как htmlentities () и mysql_real_escape_string ().

Пожалуйста, прочитайте документы для деталей: http://us2.php.net/manual/en/security.database.sql-injection.php

0 голосов
/ 22 августа 2009

Есть гораздо лучшие способы очистки ввода. Встроенная функция strip_tags будет быстрее.

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