Подтвердить что ты не робот

Что делает mysql_real_escape_string(), что делает addlashes()?

Зачем нужны функции, специфичные для БД, такие как mysql_real_escape_string()? Что это может сделать, что addlashes() не делает?

Игнорируя на данный момент превосходную альтернативу параметризованных запросов, является webapp, который использует addlashes(), исключительно все еще уязвимый для SQL-инъекции, и если да, то как?

4b9b3361

Ответ 1

Вложения, как правило, недостаточно хороши при работе с многобайтовыми закодированными строками.

Ответ 2

Он добавляет косые черты в:

\x00, \n, \r, \, ', " and \x1a. characters.

Если addlashes добавляет косые черты к

' \ and NUL

Статья Ilias также довольно подробно описывает его функциональность

Ответ 3

gs резко сокращенный ответ на самом деле правдоподобен.

Стандартный SQL использует удвоение, чтобы избежать буквального апострофа. MySQL нестандартное использование обратных косых черт для экранирования является настройкой по умолчанию, но его можно отключить и часто, в частности, в sql_mode ANSI.

В этом случае будет работать только удвоенный синтаксис, и любое приложение, которое вы используете с помощью addlashes (или другого ad-hoc-метода экранирования), будет ломаться. mysql_real_escape_string будет использовать тот способ, который лучше всего подходит для соединения sql_mode.

Проблема многобайтового кодирования также важна, если вы все еще используете эти неприятные восточно-азиатские кодировки, которые используют более 128 символов, но тогда вы действительно хотите использовать UTF-8.\n-escaping, с другой стороны, не вызывает беспокойства, так как MySQL вполне может справиться с исходной новой строкой в ​​инструкции.

Ответ 4

mysql_real_escape_string делает намного больше, чем addslashes делает.

addslashes работает на чистом ascii, ничего не зная о базе данных. Он ускользает:

  • '\'
  • "\"
  • \\\
  • ASCII 0\0.

mysql_real_escape_string Цель состоит в том, чтобы "создать юридическую строку SQL, которую вы можете использовать в SQL-заявлении". mysql_real_escape_string учитывает текущий набор символов соединения (поэтому вы всегда должны передавать действительный объект $mysql).

Он выполняет следующее (взятое из документации API MySQL C):

  • Кодирует: \, ', ", ASCII 0, \n, \r и Control+Z таким образом, чтобы не возникало проблем
  • гарантирует, что байт 0 завершает строку (в C api)
  • может выполнять многобайтовое (ascii) преобразование широкого символа, если DB, связанная с $mysql, использует широкий набор символов.

Я действительно не знаю, как PHP хранит строки внутри, но все дело в PHP, когда вы используете mysql_real_escape_string. Я предполагаю, что главная точка различия mysql_real_escape_string рассматривает набор символов соединения, где addslashes не может (он даже не знает, к какой базе данных вы подключены).

Ответ 5

somedb_real_escape_string() является специфичным для базы данных, addslashes() нет.

В случае MySQL это означает:

mysql_real_escape_string() Функция библиотеки MySQL mysql_real_escape_string, который добавляет обратную косую черту к следующему символов:\x00,\n,\r, \, ', "и \ X1a.

(Из руководства.)

Ответ 6

Зачем нужны функции, специфичные для БД, такие как mysql_real_escape_string()?

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

- это webapp, который использует addslashes(), исключительно уязвимый для SQL-инъекции?

До тех пор, пока он использует любую однобайтную кодировку или utf8 - , она абсолютно безопасна с помощью addslashes().

Что это может сделать, что addlashes() не делает?

Он может защищать строковый литерал SQL в случае некоторых редких кодировок.

Однако он не может сделать это сам по себе. Правильная кодировка должна быть установлена ​​с использованием функции mysql_set_charset(). Если эта функция не была использована, mysql_real_escape_string() будет вести себя точно так же, как addslashes() с точки зрения обработки кодировки - не было бы никакой разницы вообще.

Ответ 7

Единственное реальное отличие, о котором я знаю, это то, что mysql_real_escape_string() примет во внимание набор символов базы данных при выходе из входной строки. Ни одна из функций не будет удалять символы wild card% и _, которые все еще оставляют script открытыми для некоторой инъекции SQL.

Ответ 8

В соответствии с руководство по PHP:

mysql_real_escape_string() вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам:\x00,\n,\r, \, ', "и\x1a.

Ответ 9

Функция mysql_real_escape_string PHP будет, более или менее, запросить mysql, какой символ должен быть экранирован, где функция addlashses просто добавит обратную косую черту перед и любую одинарную цитату ('), символ двойной кавычки ("), обратную косую черту() или символ NUL (NULL).

Два практических эффекта: addlashes имеет тенденцию плохо работать с многобайтными символами и, что более важно, задавать mysql, какие символы нужно избегать, вы избегаете возможной будущей совместимости. Использование assslashes вроде как hardcoding несколько специфических символов в escape-последовательность.

Ответ 10

Он должен избегать строк для MySQL так, как это делают другие средства цитирования.

Однако гораздо предпочтительнее использовать интерфейс mysqli и использовать параметризованные подготовленные запросы, а не пытаться убедиться, что все ваши строки правильно экранированы. Использование параметризованных запросов устраняет необходимость в такой беспорядочной работе строки и сильно снижает риск внедрения SQL.

Изменить: я немного разъясню, почему я считаю, что цитирую плохую идею: легко забыть, когда и где вам нужно указывать, должна ли ваша переменная быть строкой или номером, независимо от того, была ли она уже указана, и т.д. В параметризованном запросе нет ни одной из этих проблем, и необходимость цитирования полностью устранена.

Ответ 11

В соответствии с моим пониманием mysql_real_escape_string() делает работу более точно, поскольку она обменивается данными с db, чтобы сначала проверить, что нужно кодировать и затем кодировать соответственно, не так ли? Таким образом, для этого он работает более эффективно

почему вы хотите сначала сделать addlashes, а затем вы удалите эти косые черты, прежде чем показывать, что данные и все еще addlashes не так эффективны, как mysql_real_escape_string, используйте mysql_real_escape_string, если вы используете mysql_query, например, функции db для запроса, или я думаю, что PDO с подготовкой лучший способ, поскольку mysql_real_escape_string имеет специфический db