该代码在PDO中是sql注入安全的吗?


Is this code sql-injection-safe in PDO?

code (newbie):

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

从学术上讲,它不是100%安全的(通常从准备好的语句中获得)。这是因为在MySQL中,PDO在内部模拟预处理语句。这意味着数据被转义了,所以当涉及到PDO(至少在默认设置下)时,使用预处理语句没有任何好处。

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

MySQLi确实使用真正的准备语句,所以我建议使用它。

看起来像是在动态地进行参数化查询。

参数化查询是注入安全的

但是也要注意内容本身

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

您正在正确使用?prepare。注意,PDO不能保护您不受动态表/列名的影响。PDO(和mysql_real_escape_string)不会转义反引号',所以尽量不要使用动态表或列名。