Я не уверен, какие исключения упоминается в руководстве, когда речь заходит об обеспечении безопасности данных. Можно сказать, что исключение - это когда данные уже известны как безопасные. Например, вот несколько случаев, которые приходят на ум:
- данные набрана как число (это действительно специализация следующего пункта)
- вы уже знаете, он не содержит каких-либо символов, должны быть экранированы (например, это происходит от поиска чего-либо в «белый список» массив, который содержит несколько вариантов вы жёстко прописанные)
Например, если у вас есть $id = intval($_GET['id'])
, то вам не нужно бежать $id
перед впрыскиванием в запрос.
Однако! Это не может помешать вам избежать всего ввода, и это устраняет вероятность того, что вы вводите уязвимости в свой код (например, если вы забудете убежать, если требования меняются или что-то действительно). Поэтому я рекомендую привыкнуть избегать всего и забыть о «исключениях».
Что касается %
и _
персонажей как часть входных данных, они не должны быть экранированы , если вы не собираетесь кормить этот вход в команду, которая признает их. Так, например, если у вас есть запрос, как это:
$term = $_GET['term'];
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'",
mysql_real_escape_string($term));
В этом случае, если пользователь печатает %
как часть $term
разумно предположить, что они хотят на самом деле искать буквальный %
. Поэтому в таких случаях вам следует избегать %
, заменив его на \%
(\
- символ запуска по умолчанию). str_replace
или strtr
- два хороших варианта для этого.
Вы должны использовать [PDO] (http://php.net/manual/en/book.pdo.php). Делать свой личный сайт - отличная возможность изучить его. – kapa
Пункт 2 относится к предложениям 'LIKE' и не имеет значения для использования строковых данных в других контекстах. – mario
Одним из исключений может быть уже экранированная строка. – hjpotter92