2012-04-21 7 views
5

Я разрабатываю свой персональный сайт, используя php. все в порядке, но я только что прочитал mysql_real_escape_string руководство в php.net и обнаружили две вещи:вопросы о mysql_real_escape_string

  1. Эта функция должна всегда (с немногими исключениями) будут использоваться, чтобы сделать данные в безопасности перед отправкой запроса к MySQL.
  2. mysql_real_escape_string() не исчезает% и _. Это подстановочные знаки в MySQL, если они объединены с LIKE, GRANT или REVOKE.

У меня есть два вопроса:
1-то, что эти исключения?
2- как избежать этих персонажей?

+1

Вы должны использовать [PDO] (http://php.net/manual/en/book.pdo.php). Делать свой личный сайт - отличная возможность изучить его. – kapa

+0

Пункт 2 относится к предложениям 'LIKE' и не имеет значения для использования строковых данных в других контекстах. – mario

+0

Одним из исключений может быть уже экранированная строка. – hjpotter92

ответ

5

Эта функция должна всегда (за небольшим исключением) использоваться для обеспечения безопасности данных перед отправкой запроса в MySQL.

К моему большому разочарованию, на странице руководства говорится, что полный мусор, и they refuse to make it correct.
Итак, довольно просто, если вам нужна эта функция. Итак, ТОЛЬКО ОДИН: когда вы добавляете строку в SQL-запрос.

mysql_real_escape_string() не пропускает% и _. Это подстановочные знаки в MySQL, если они объединены с LIKE, GRANT или REVOKE.

Это не имеет большого значения. Пока вы используете специально для этого LIKE-оператора, эти персонажи не нанесут никакого вреда.

Но если вы хотите, чтобы избежать строки собирается НРАВИТСЯ заявление, вы можете использовать этот код

$like = addCslashes($like,'\%_'); 

(обратите внимание на косую черту. - это также должны быть экранированы, как ручной изложив его также отметить C буква в имени функции).
После этой процедуры вы можете использовать результирующую переменную $like независимо от того, как вы используете для построения своих запросов - либо цитаты, либо избегайте их, либо используйте в подготовленном операторе.

+0

спасибо, но как их избежать ('%', '_')? – undone

+1

просто с той же чертой. 'addCslashes ($ data,"% _ ");' будет делать трюк. –

+1

Но сделайте это только для частей, попадающих в контекст соответствия шаблону. В противном случае вы увидите буквальный '\%' в вашем SQL. – Matthew

3

Я не уверен, какие исключения упоминается в руководстве, когда речь заходит об обеспечении безопасности данных. Можно сказать, что исключение - это когда данные уже известны как безопасные. Например, вот несколько случаев, которые приходят на ум:

  • данные набрана как число (это действительно специализация следующего пункта)
  • вы уже знаете, он не содержит каких-либо символов, должны быть экранированы (например, это происходит от поиска чего-либо в «белый список» массив, который содержит несколько вариантов вы жёстко прописанные)

Например, если у вас есть $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 - два хороших варианта для этого.

+0

mysql_real_escape_string не имеет никакого отношения к * безопасности *. Я совершенно согласен с тем, что это совершенно разные вопросы (которые часто ошибаются люди PHP). На самом деле, ускользая, но просто средство форматирования строк и ничего больше. Даже любые «безопасные» данные могут содержать строку, которая должна быть заменена для читаемости журналов. не говоря уже о том, что для небезопасного идентификатора это не принесет ни малейшего эффекта. –

+0

@YourCommonSense: упаковка в кавычки + 'mysql_real_escape_string' = безопасная. У этого есть * все *, чтобы сделать с безопасностью * косвенно *, потому что это является предварительным условием того, что обеспечивает безопасность * непосредственно * (цитирование). Спасибо за DV в любом случае. – Jon

+0

'Однако! Это никогда не повредит вам, чтобы избежать всех входных данных, «поздравления, вы только что придумали« волшебные кавычки »! –

1

Вы можете получить write your own function;) См. this thread для получения дополнительной информации.

Иначе вы можете использовать PDO library или любые другие подобные библиотеки.

+0

первая ссылка для 'MSSQL' не' mysql' :-) – undone

+0

Да, это было просто для того, чтобы дать представление о том, как реализовать логику для написания функции вручную для mysql. Та же логика может быть реализована и для MySQL. – gopi1410