Этот код sql-инъекция безопасна в PDO? - PullRequest
0 голосов
/ 04 мая 2011

код (новичок):

        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 ]

4 голосов
/ 04 мая 2011

Педантически, нет, это не на 100% безопасно (что вы обычно получаете из подготовленных заявлений в целом). Это связано с тем, что в MySQL PDO внутренне эмулирует подготовленные операторы . Это означает, что данные экранируются, поэтому использование готовых операторов над экранированием не имеет смысла, если речь идет о PDO (по крайней мере с настройками по умолчанию).

Вы можете изменить это, установив PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, 0) в соединении.

MySQLi использует действительно подготовленные операторы, поэтому я бы предложил использовать его вместо этого.

3 голосов
/ 04 мая 2011

Похоже, вы динамически делаете параметризованный запрос.

Параметризованные запросы безопасны для инъекций.

Но не забывайте следить за содержанием тоже

1 голос
/ 04 мая 2011

Вы делаете это правильно, используя ? и prepare.Обратите внимание, что единственная ситуация, от которой PDO не защитит вас, - это динамические имена таблиц / столбцов.PDO (и mysql_real_escape_string) не будут избегать обратных кавычек `, поэтому старайтесь никогда не использовать динамические имена таблиц или столбцов.

1 голос
/ 04 мая 2011

Кажется безопасным внедрение, если пользователю разрешено удалять все строки в таблице (потому что он может отправить POST со всеми codigo в таблице, если он этого хочет).

Это невозможночтобы заставить ваш запрос касаться других таблиц.

...