oci_bind_by_name是否安全地阻止了SQL注入?

时间:2014-08-27 17:23:33

标签: php sql oracle sql-injection

我已阅读oracle here提供的文档,其中声明:

Binding is important for Oracle database performance and also as a way to avoid SQL Injection security issues.

使用oci_bind_by_name来逃避变量有多安全?有没有更好的做法来避免SQL注入,或者oci_bind_by_name是否足够?

TIA!

1 个答案:

答案 0 :(得分:3)

在常见情况下使用绑定参数就足够了,这也是避免SQL注入的良好做法。

但是,预准备语句中的参数只能用于SQL表达式中的。换句话说,您通常会在其中编写带引号的字符串文字,引用日期文字或数字文字。一个参数==一个值(无列表)。

你应该对这些案例使用绑定参数。如果你提出这个问题,因为你认为如果有人回答说他们不够,你可能想跳过使用绑定参数,对不起,你不会免于安全编程实践。

然而,还有其他(可能不太常见)的情况,绑定参数不起作用。如果需要使用动态表名,列名或其他标识符,整个表达式或SQL关键字编写查询,则需要另一种方法。必须在 prepare 时在SQL语法中修复这些情况,因此无法对它们进行参数化。

例如,这里是一个使用变量表示的动态部分的查询,这些变量不能是参数:

$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";

您应该对这些案例使用白名单。换句话说,确保作为动态表名插入查询的字符串实际上是数据库中存在的表之一。确保SQL关键字是合法关键字。

从不逐字地接受用户输入并将其插入到SQL(或在运行时解析的任何其他代码,例如您提供给eval()shellexec()的参数)。并且不仅仅是用户输入可能是不安全的内容。

有关更多说明,另请参阅我的演示文稿SQL Injection Myths and Fallacies