简单问题:如何保护,以便当用户在字段中输入“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%'
答案 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}%"));