SQL-инъекция в плейсхолдере

fixxxer

К.О.
Партнер клуба
PHP:
        $params = ['id' => $id];

        foreach ($data as $index => $obj) {
            $paramName = 'id_'.$index;
            $paramValue = 'value_'.$index;
            $updateCases .= "WHEN :$paramName THEN :$paramValue ";

            $params[$paramName] = array(
                'type' => Query::PARAM_INT,
                'value' => $obj->id
            );
            $params[$paramValue] = array(
                'type' => Query::PARAM_INT,
                'value' => $obj->value
            );
        }

        $sql = "UPDATE table SET value = CASE id $updateCases ELSE value END WHERE id = :id";
        $db->prepare($sql)->execute($params);
Видите инъекцию? :)
 

fixxxer

К.О.
Партнер клуба
О, эта ссылка сэкономила бы мне минут 15 объяснений. Положил в букмарки, как говорится.

Инъекцию, кстати, sqlmap нашел. Крутая штука.
 

fixxxer

К.О.
Партнер клуба
Но, правда, тут отдельная красота в том, что $index из массива вообще нафиг на самом деле не нужен!
Подошел бы обычный счетчик ($index = 0, ... $index++)
Ну или foreach (array_values( ...
 

Фанат

oncle terrible
Команда форума
А! Я только сейчас разглядел.
Тут имен полей вообще нет, только плейсхолдеры.
Да, динамическая генерация имен плейсхоолдеров - это то еще минное поле
 

fixxxer

К.О.
Партнер клуба
Кстати, этот же (судя по git blame) программист в двух других местах, где подобным развлекался, сделал все правильно (с отдельным счетчиком).
Только в этом месте накосячил. И при этом это более поздний код!
Так что даже наличие понимания проблемы (которое у него явно было) не всегда спасает: типа, откуда там строковые ключи, если это из json-а с массивом? А вот пожалуйста вам json с объектом, php-то один фиг скушает! :)
 

fixxxer

К.О.
Партнер клуба
Ха, тот программист же кстати бывший друпальщик! :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
прикольно, давненько я не втыкал 20 минут в 10 строчек :)
 
Сверху