在任何人得出关于这个问题的性质的结论之前,我已经知道了parameterized/prepared statements并且尽可能地使用它们.不幸的是,在构建动态查询时并不总是可以使用它们.
我有兴趣使用除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
> tokyo_ tyrant
对大多数参数化语句不起作用的动态查询示例:
"Select $col1, $col2 from $table where $col1 = ?"
在$col1,$col2和$table被转义之后,该语句可以在预准备语句中使用.
解决方法:
PostgreSQL和其他人(PDO)
PostgreSQL可以使用pg_escape_string进行字符串转义.
对于PostgreSQL,由于pg_query_params()
,您不需要任何转义
除此之外,你应该使用PDO和prepared statements.他们会照顾它,你可以单独传递参数;就像pg_query_params()一样