$ var_to_use_in_app = mysql_escape_string (trim ($ _ GET ['variableNameX']));
Обычно это неправильно. Строка, используемая внутри вашего приложения, всегда должна быть текстовой версией. Тогда вы можете быть уверены, что ни одна из ваших строковых манипуляций не сломает его, и вы не будете выводить на страницу не то, что нужно.
Например, если у вас есть отправленная строка:
O'Reilly
mysql_escape_string избежит его до:
O\'Reilly
, который при выводе этой строки на страницу HTML будет выглядеть глупо. И если вы выведете его в поле формы, которое затем было отправлено снова, вы получите еще один обратный слеш, который превратится в два черных слеша, которые при повторном редактировании превратятся в четыре, восемь ... и в не долго у вас есть строки, состоящие из сотен обратных косых черт. Это часто встречающаяся проблема в плохо написанных CMS и серверах с включенной функцией evil magic_quotes.
Если затем вы хотите взять первые две буквы имени, чтобы вставить их в запрос к базе данных, вы должны отсканировать подстроку:
O\
и затем объединить это в запрос:
SELECT * FROM users WHERE namefirst2='O\';
упс, синтаксическая ошибка, эта строка теперь не определена. Варианты обработки строк в предварительно экранированных строках могут так же легко привести к проблемам с безопасностью.
Вместо этого подхода сохраняйте ваши строки как простые неэкранированные текстовые строки в вашем приложении везде, кроме последнего этапа вывода, где вы объединяете их в литерал с разделителями в SQL или HTML. Для SQL:
"SELECT * FROM users WHERE name='".mysql_real_escape_string($name)."';"
Обратите внимание на «реальное» имя функции - обычная старая mysql_escape_string не работает в некоторых угловых случаях, таких как наборы символов восточной Азии и соединения / базы данных с набором ANSI SQL_MODE, поэтому в общем случае вы всегда должны использовать «реальную» версию.
Вы можете определить функцию, которая совпадает с mysql_real_escape_string, но имеет более короткое имя (например, m ()), чтобы сделать ее немного менее уродливой. Или, лучше, посмотрите на параметризованные запросы mysqli .
Для HTML экранирование должно выполняться с помощью функции htmlspecialchars ():
<div id="greeting">
Hello, Mr. <?php echo htmlspecialchars($name); ?>!
</div>
Вы можете определить функцию, которая выполняет эхо (htmlspecialchars ()), но имеет более короткое имя (например, h ()), чтобы сделать это немного менее уродливым.
Если вы пропустили звонок на htmlspecialchars, то ваш сканер абсолютно правильно скажет вам, что ваш сайт уязвим для XSS. Но не расстраивайтесь, почти любой другой PHP-программист совершает ту же ошибку.
mysql_ [real_] escape_string здесь вам совсем не помогает, потому что символы, выделяющиеся из текста в HTML, это '&', '<' и, в атрибутах, '"'. Ни один из них не является особенным в строковых литералах SQL, mysql_escape_string не затрагивает их вообще. Вредонос: </p>
<script>alert("I'm stealing your cookies! "+document.cookie);</script>
Экранируется только до:
<script>alert("I\'m stealing your cookies! "+document.cookie);</script>
Что касается безопасности, то это ничем не поможет.