【发布时间】:2012-07-03 23:49:27
【问题描述】:
我已经多次使用 mysqli_stmt_bind_param 函数。但是,如果我将试图防止 SQL 注入的变量分开,我会遇到错误。
这是一些代码示例:
function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
$statement = $mysqli->prepare("INSERT INTO " .$new_table . " VALUES (?,?,?,?,?,?,?);");
mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
$statement->execute();
}
是否可以以某种方式将.$new_table. 连接替换为另一个问号语句、创建另一个绑定参数语句或添加到现有语句以防止 SQL 注入?
像这样或这样的某种形式:
function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
$statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
$statement->execute();
}
【问题讨论】:
-
不,参数化查询不只是将参数值放入查询字符串中,它还分别为 RDBMS 提供参数化查询和参数。但是这样的查询不能有表名或字段名作为参数。这样做的唯一方法是将表名动态编码到查询字符串中,就像您已经完成的那样。如果此字符串可能受到攻击,则应首先对其进行验证;例如针对允许表的白名单。
-
使用mysqli扩展是安全的,加油!但是不要忘记清理和验证所有字符串。如果表或字段名称或任何与您的数据库相对的名称!
-
您喜欢用什么特殊功能来消毒?
-
@user1475765 在您的表名上使用转义函数并不能保护您免受任何侵害,请使用白名单。