Строго говоря, показанный вами запрос является безопасным, поскольку у вас есть гарантия, что $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-запроса работают для всех типов, и вам не нужно полагаться на подсказки типов,Они просты, они эффективны, и вы можете использовать их последовательно.
Пожалуйста, прекратите пытаться найти способы избежать использования параметров запроса.
Позвольте мне использоватьаналогия: предположим, вы были электриком, а не разработчиком программного обеспечения.Вы слышали, что электрические провода должны быть изолированы во избежание короткого замыкания.Но по какой-то причине вам не хочется иметь дело с изолированными проводами.
«Я просто вставлю прокладку между проводами, чтобы они были разделены».Но предмет, который вы используете в качестве прокладки, должен быть непроводящим и не воспламеняющимся.
Какие прокладки безопасны в использовании?Дерево ... нет.Металл ... нет.Пластик ... зависит от типа пластика.Керамика ... Я не знаю, надо ее искать или что-то в этом роде ...
Любой другой электрик будет странно смотреть на вас.
"Просто используйте изолированные провода,Вы пытаетесь сжечь это здание? "