在有人对这个问题的性质做出结论之前,我已经知道了parameterized/prepared statements并尽可能地使用它们。不幸的是,在构建动态查询时并不总是可以使用它们。
我对使用MySQL以外的数据库感兴趣,但我无法轻易找到有关如何为每个数据库扩展转义字符串以防止SQL Injection的良好来源。
PHP文档列出了以下特定于供应商的数据库扩展。我把我最感兴趣的那些加剧了:
对大多数参数化语句不起作用的动态查询示例:
"Select $col1, $col2 from $table where $col1 = ?"
在$col1
,$col2
和$table
转义后,该语句可用于预先准备好的声明中。
答案 0 :(得分:2)
PostgreSQL可以使用pg_escape_string进行字符串转义。
对于PostgreSQL,由于pg_query_params()
除此之外,您应该将PDO与prepared statements一起使用。他们照顾它,你可以分开传递参数;与pg_query_params()
答案 1 :(得分:2)
在MongoDB中,你不是编写SQL而是使用对象(“文档”) - 你不必转义,因为你从不使用除数据之外的字符串。
但是,做需要确保实际将字符串而不是数组传递给MongoDB API。至少在PHP中传递array('$ne' => 1)
这样的数组会导致!= 1
检查,因此与SQL注入一样危险。不幸的是,PHP允许客户端在$_POST
等内部创建数组,只需使用PHP数组语法(如password[$ne]
)提供一个名称字段即可。 [Source]
答案 2 :(得分:0)
答案 3 :(得分:0)
答案 4 :(得分:0)
据我所知:
function oci_escape_string( $str )
{
return strtr( $str, array( "'" => "''" ) );
}
Should do the trick,忽略LIKE语句的通配符。
答案 5 :(得分:0)
根据其手册,CUBRID PHP API具有与MySQL相同的语法,即cubrid_real_escape_string。凭借其新的CUBRID 8.4.0版本,它为90% compatibility提供了MySQL。