代码(新手):
if(isset($_POST['selection']))
{
include_once 'pdo_init.php';
$params_str = str_repeat('?,',count($_POST['selection']));
$params_str = substr($params_str,0,-1);
$res = $pdo->prepare('DELETE FROM funcionario WHERE codigo in ('.$params_str.')');
if($res->execute($_POST['selection']))
{
return json_encode(array(
'success' => 1,
'msg' => 'os registros foram deletados com sucesso!'
));
} else {
return json_encode(array(
'success' => 0,
'msg' => 'nao admitimos sql-injection aqui seu safado!'
));
}
} else {
# error out
break;
}
答案 0 :(得分:4)
小心地说,不是它不是100%安全的(通常你从准备好的陈述中获得)。这是因为MySQL内部有PDO emulates prepared statements。这意味着数据被转义,因此在涉及PDO时使用预准备语句而不是转义(至少使用默认设置)没有任何好处。
您可以通过在连接上设置PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, 0)
来更改此设置。
MySQLi确实使用了真实的预处理语句,因此我建议使用它。
答案 1 :(得分:3)
答案 2 :(得分:1)
似乎注射安全,只要允许用户删除表中的所有行(因为如果她愿意,她可以在表中发送包含所有codigo的POST)。
无法欺骗您的查询以触及其他表格。
答案 3 :(得分:1)
您使用?
和prepare
正确执行此操作。请注意,PDO无法保护您的一种情况是动态表/列名称。 PDO(和mysql_real_escape_string)不会esacape反引号,`,所以尽量不要使用动态表或列名。