Как строки сбрасываются для каждого расширения базы данных в php?

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


Я заинтересован в работе с базами данных, отличными от MySQL, но я не могу легко найти хорошие источники о том, как избежать строк для каждого расширения базы данных, чтобы предотвратить SQL Injection .

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

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

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

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

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

PostgreSQL и другие (PDO)

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

Для PostgreSQL вам не нужно ускользать благодаря pg_query_params()

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

MongoDB

В MongoDB вы не пишете SQL, а работаете с объектами («документы») – вам не нужно избегать вещей, поскольку вы никогда не используете строки, кроме данных.

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

MySQL

Используйте mysql_real_escape_string .

MySQLi

Используйте mysqli_real_escape_string .

OCI8

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

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

Должен делать трюк , игнорируя символы подстановочных знаков для предложений LIKE.

CUBRID

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