这个代码在PDO中是sql-injection-safe吗?

时间:2011-05-04 17:01:44

标签: php pdo sql-injection

代码(新手):

        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;
        }

4 个答案:

答案 0 :(得分:4)

小心地说,不是它不是100%安全的(通常你从准备好的陈述中获得)。这是因为MySQL内部有PDO emulates prepared statements。这意味着数据被转义,因此在涉及PDO时使用预准备语句而不是转义(至少使用默认设置)没有任何好处。

您可以通过在连接上设置PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, 0)来更改此设置。

MySQLi确实使用了真实的预处理语句,因此我建议使用它。

答案 1 :(得分:3)

看起来你正在动态地进行参数化查询。

参数化查询是注入安全的。

但请记住要注意content itself

答案 2 :(得分:1)

似乎注射安全,只要允许用户删除表中的所有行(因为如果她愿意,她可以在表中发送包含所有codigo的POST)。

无法欺骗您的查询以触及其他表格。

答案 3 :(得分:1)

您使用?prepare正确执行此操作。请注意,PDO无法保护您的一种情况是动态表/列名称。 PDO(和mysql_real_escape_string)不会esacape反引号,`,所以尽量不要使用动态表或列名。