如何在php中为每个数据库扩展转义字符串?

时间:2011-02-08 23:42:42

标签: php database escaping sql-injection

在有人对这个问题的性质做出结论之前,我已经知道了parameterized/prepared statements并尽可能地使用它们。不幸的是,在构建动态查询时并不总是可以使用它们。


我对使用MySQL以外的数据库感兴趣,但我无法轻易找到有关如何为每个数据库扩展转义字符串以防止SQL Injection的良好来源。

PHP文档列出了以下特定于供应商的数据库扩展。我把我最感兴趣的那些加剧了:

  • CUBRID
  • 的dBase
  • DB ++
  • FrontBase
  • filePro
  • 火鸟/ IB的
  • 的Informix
  • IBM DB2
  • 的Ingres
  • MaxDB的
  • 蒙戈
  • mSQL的
  • Mssql中
  • 的MySQL
  • 的mysqli
  • Mysqlnd
  • mysqlnd_ qc
  • OCI8
  • Ovrimos SQL
  • 悖论
  • 的PostgreSQL
  • SQLite的
  • SQLite3的
  • 的Sybase
  • tokyo_ tyrant

对大多数参数化语句不起作用的动态查询示例:

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

$col1$col2$table转义后,该语句可用于预先准备好的声明中。

6 个答案:

答案 0 :(得分:2)

PostgreSQL和其他人(PDO)

PostgreSQL可以使用pg_escape_string进行字符串转义。

对于PostgreSQL,由于pg_query_params()

,您不需要任何转义

除此之外,您应该将PDOprepared statements一起使用。他们照顾它,你可以分开传递参数;与pg_query_params()

一样

答案 1 :(得分:2)

MongoDB的

在MongoDB中,你不是编写SQL而是使用对象(“文档”) - 你不必转义,因为你从不使用除数据之外的字符串。

但是,需要确保实际将字符串而不是数组传递给MongoDB API。至少在PHP中传递array('$ne' => 1)这样的数组会导致!= 1检查,因此与SQL注入一样危险。不幸的是,PHP允许客户端在$_POST等内部创建数组,只需使用PHP数组语法(如password[$ne])提供一个名称字段即可。 [Source]

答案 2 :(得分:0)

的MySQL

使用mysql_real_escape_string

答案 3 :(得分:0)

库MySQLi

使用mysqli_real_escape_string

答案 4 :(得分:0)

OCI8

据我所知:

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

Should do the trick,忽略LIKE语句的通配符。

答案 5 :(得分:0)

CUBRID

根据其手册,CUBRID PHP API具有与MySQL相同的语法,即cubrid_real_escape_string。凭借其新的CUBRID 8.4.0版本,它为90% compatibility提供了MySQL。