Как экранируются строки для каждого расширения базы данных в php? - PullRequest
4 голосов
/ 09 февраля 2011

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


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

В документации PHP перечислены следующие расширения баз данных, специфичные для разных поставщиков. Я ободрил те, которые меня больше всего интересуют:

  • CUBRID
  • Dbase
  • DB ++
  • FrontBase
  • FilePro
  • Firebird / InterBase
  • Informix
  • IBM DB2
  • Энгр
  • MaxDB
  • Монго
  • Msql
  • Mssql
  • MySQL
  • Mysqli
  • Mysqlnd
  • mysqlnd_ qc
  • OCI8
  • Ovrimos SQL
  • Paradox
  • PostgreSQL
  • SQLite
  • SQLite3
  • Sybase
  • Токио_ тиран

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

"Select $col1, $col2 from $table where $col1 = ?"

После экранирования $col1, $col2 и $table оператор может использоваться в подготовленном операторе.

Ответы [ 6 ]

2 голосов
/ 09 февраля 2011

MongoDB

В MongoDB вы не пишете SQL, а работаете с объектами («документами») - вам не нужно избегать вещей, поскольку вы никогда не используете строки, за исключением данных.Однако вам do необходимо убедиться, что вы действительно передаете строки, а не массивы в API MongoDB.По крайней мере, в PHP передача массива, такого как array('$ne' => 1), приведет к проверке != 1 и будет таким же опасным, как внедрение SQL.И, к сожалению, PHP позволяет клиенту создавать массивы внутри $_POST и т. Д., Просто предоставляя поле с именем, используя синтаксис массива PHP, такой как password[$ne]. [Источник] * * 1015

2 голосов
/ 09 февраля 2011

PostgreSQL и другие (PDO)

PostgreSQL может использовать pg_escape_string для экранирования строк.

Для PostgreSQL вам не нужно любой экранированиеспасибо pg_query_params()

Кроме того, вы должны использовать PDO с подготовленными заявлениями .Они позаботятся об этом, и вы можете передать аргументы отдельно;так же, как с pg_query_params()

0 голосов
/ 18 мая 2011

CUBRID

Согласно своему руководству, CUBRID PHP API имеет тот же синтаксис, что и MySQL, т.е. cubrid_real_escape_string .С новым выпуском CUBRID 8.4.0 он обеспечивает 90% совместимость с MySQL.

0 голосов
/ 09 февраля 2011

OCI8

Насколько я могу сказать:

function oci_escape_string( $str )
{
  return strtr( $str, array( "'" => "''" ) );
}

Следует выполнить трюк , игнорируя символы подстановки для операторов LIKE.

0 голосов
/ 09 февраля 2011

MySQLi

Использовать mysqli_real_escape_string .

0 голосов
/ 09 февраля 2011

MySQL

Использование mysql_real_escape_string .

...