如何保护免受mysql“联合选择”注入

时间:2011-06-23 15:41:37

标签: php mysql code-injection

简单问题:如何保护,以便当用户在字段中输入“union select”然后将其作为参数发送给查询时,mysql不会出错。

我应该只检查是否输入了“union select”,还是还有其他可能导致mysql错误的关键字?

这是我现在使用的SQL保护功能:

function sql_protect(&$n){ 
  $n=stripslashes($n);
  $n=mysql_real_escape_string($n);
  $dntwant = array("\'","\\", "/","\"",")","(","<",">","\\r\\n",";","*","%");
  $n = str_replace($dntwant,"", $n);
}

查询中有类似的内容:

where column1 like '%$user_input%'

2 个答案:

答案 0 :(得分:4)

你需要两件事

使用PDO,不需要检查PDO可以做任何事情。

或使用:

$var = mysql_real_escape_string($_POST['var']);
$query = "SELECT * FROM test WHERE var = '$var' ";
//                                       ^    ^  These single quotes are vital!!

这就是你需要做的,忘掉striplashes和str_replace。

如果要使用动态数据库/表/列名称,或者要为limit子句注入数字,请警告 mysql_real_escape_string将不起作用。 PDO也不会 除了检查您要对预先批准的白名单注入的输入外,什么都不会有效。

请参阅此问题:How to prevent SQL injection with dynamic tablenames?

答案 1 :(得分:0)

尝试准备并执行查询:

$stmt = $db->prepare("SELECT * FROM test WHERE column1 LIKE ?");
$stmt->execute(array("%{$user_input}%"));