Разликата се счита за незначителна.
Независимо от това, човек трябва да разграничи изготвените изявления от общата идея на подготвено изявление.
Първият е просто форма на изпълнение на заявки, поддържани от повечето СУБД, обяснено тук
. Използването му може да бъде поставено под въпрос.
Последното е обща идея за заместване на действителните данни с заместител, което предполага по-нататъшна обработка на заместените данни. Той е широко използван в програмирането, добре познат printf()
функция е пример. И този последен подход трябва ВИНАГИ да се използва за изпълнение на заявка към база данни , без значение дали е подкрепено от подготвени изявления или не. Защото:
- подготвеното изявление прави правилното форматиране (или обработка) неизбежно .
- prepared statement прави правилно форматиране (или обработка) на единственото подходящо място - точно преди изпълнението на заявката, а не някъде другаде, така че нашата безопасност няма да разчита на такива ненадеждни източници като
- някаква „магическа“ функция на PHP, която по-скоро разваля данните, отколкото ги прави безопасни.
- добра воля на един (или няколко) програмисти, които могат да решат да форматират (или да не форматират) нашата променлива някъде в потока на програмата. Това е моментът от голямо значение.
- prepared statement засяга самата стойност, която влиза в заявката, но не и променливата източник, която остава непокътната и може да се използва в следващия код (да бъде изпратен по имейл или да се покаже на екрана).
- подготвеното изявление може да направи кода на приложението драстично по-кратък, извършвайки цялото форматиране зад кулисите (*само ако драйверът позволява).
Така че, дори и да помислите да не използвате подготвени изрази (което е съвсем добре), винаги трябва да създавате заявките си, като използвате заместители вместо действителните данни. За тази цел можете да използвате PDO , който работи точно както е описано по-горе - по подразбиране просто имитира подготовка , означава редовна SQL заявка, която се създава от подготвена заявка и данни и след това се изпълнява срещу база данни.
Въпреки това, PDO няма поддръжка за много важни типове данни, като идентификатор или масив - по този начин ви прави неспособни винаги да използвате заместители и по този начин прави инжектирането напълно възможно. За щастие, safeMysql има заместители за всеки тип данни и ви позволява да изпълнявате заявки безопасно.