Означает ли хинтинг по типу в php (используя версии> 7.0) параметры функции, делает код sql-инъекцией безопасным? - PullRequest
1 голос
/ 27 июня 2019

У меня есть следующий фрагмент кода (унаследованный от предыдущего разработчика):

declare(strict_types=1);

function updateWithCurrentTime(PDO $connection, int $id): void{

    $date = date('m/d/Y h:i:s a', time());
    $query= "INSERT INTO timetable (id,time) VALUES (${id},${date})";

    $connection->query($query);
}

$connection = new PDO('sqlite::memory:');
$connection->query("CREATE TABLE timetable (id INT , date TEXT)");

updateWithCurrentTime($connection,1);

И, как вы можете видеть, он не использует, как рекомендуется, подготовленные операторы, вместо этого он напрямую передает параметры в запрос. Но, как вы также можете видеть, параметры в функции updateWithCurrentTime являются подсказками типа.

Итак, я хотел бы знать, делает ли намеки на тип входных параметров функции безопасными ли SQL-инъекции? Даже если подготовленные заявления не используются.

Имейте в виду, что я предполагаю, что никакие входные параметры строкового типа не будут предоставлены, во входном параметре строкового типа использование подготовленных операторов - единственный путь.

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Строго говоря, показанный вами запрос является безопасным, поскольку у вас есть гарантия, что $id является только целочисленным значением, и он не может вводить символы в запрос SQL, которые могут вызвать какое-либо зло.

Норешение для подсказок типа не будет работать для подсказок типа string.Даже если вы введете подсказку, что аргумент вашей функции должен быть строкой,

function updateWithCurrentTime(PDO $connection, int $id, string $value): void{

    $query= "INSERT INTO timetable (id,value) VALUES (${id}, '${value}')"; // UNSAFE

Вы задаетесь вопросом, содержит ли $value символы кавычек?Содержит ли оно что-нибудь еще, что могло бы причинить вред?Вы не можете предотвратить превращение этой уязвимости в SQL-инъекцию, просто используя подсказку типа.

Таким образом, подсказка типа может быть эффективной при использовании типа int, но не типа string.А как насчет других типов?Хмм, надо расследовать ...

Теперь вы открыли банку с червями.Вы должны исследовать все типы и попытаться придумать полные рекомендации, какие из них безопасны для интерполяции в SQL, а какие нет.Вы должны сделать эти рекомендации достаточно ясными, чтобы каждый член вашей команды разработчиков программного обеспечения мог следовать им и использовать их во время проверки кода.

Даже если вы действительно пишете код без ошибок и используете соответствующий метод защиты от внедрения SQL-кодадля каждого типа любой, кто читает код позже, будет сбит с толку. «Почему переменные не объединяются одинаково с SQL-запросами в разных функциях?» Они задаются вопросом.Выяснение причин отвлекло бы их время и внимание от выполнения любой задачи по сопровождению кода, на которую они были назначены.Помните, что после разработки этого кода он будет жить годами, и другие разработчики программного обеспечения должны его поддерживать.Окупаемость кода упрощает понимание.

Или вы можете просто использовать параметры.

Параметры SQL-запроса работают для всех типов, и вам не нужно полагаться на подсказки типов,Они просты, они эффективны, и вы можете использовать их последовательно.

Пожалуйста, прекратите пытаться найти способы избежать использования параметров запроса.

Позвольте мне использоватьаналогия: предположим, вы были электриком, а не разработчиком программного обеспечения.Вы слышали, что электрические провода должны быть изолированы во избежание короткого замыкания.Но по какой-то причине вам не хочется иметь дело с изолированными проводами.

«Я просто вставлю прокладку между проводами, чтобы они были разделены».Но предмет, который вы используете в качестве прокладки, должен быть непроводящим и не воспламеняющимся.

Какие прокладки безопасны в использовании?Дерево ... нет.Металл ... нет.Пластик ... зависит от типа пластика.Керамика ... Я не знаю, надо ее искать или что-то в этом роде ...

Любой другой электрик будет странно смотреть на вас.

"Просто используйте изолированные провода,Вы пытаетесь сжечь это здание? "

1 голос
/ 27 июня 2019

Технически да. Функция либо изящно преобразует аргумент в целое число, либо выдает исключение TypeError. Это будет работать.

В зависимости от вашей строгой_типы декларация.

Практически - это плохо принято.

Это нехорошая практика (вы упомянули подготовленные заявления - это правильное решение). Что еще хуже, у вас может не быть доступа к конфигурации сервера, и вы не знаете, включен или нет строгий режим.

...