Я имею в виду пример, как это:ВЫБРАТЬ в SELECT, PDO подготовил заявление
Запрос попадает на страницу на URL (по какой бы средства), с параметром. example.com/api/page?name=bob
. Я понимаю, что вы должны сделать подготовленное заявление, чтобы получить параметр $_POST[name]
и убедиться, что это не что-то напуганное, но он делает это, оценивая выражение.
Мой первый вопрос: как это сделать (оценить выражение)?
Мой второй вопрос: Что делать, если пользователь вводит что-то вдоль линий «SELECT * FROM пользователей» или «DROP пользователей TABLE», которая будет послана к параметру $_POST['name']
(?name=bob
в конце), что произойдет, в таком случае?
Подобно тому, как, например, окончательный запрос будет что-то вроде
SELECT name, continent FROM world
WHERE continent IN
(SELECT continent FROM world WHERE name='Brazil')
второй выберите действующий в качестве входного параметра пользователя - так $_POST['name']
содержит этот запрос, SELECT continent FROM world WHERE name='Brazil'
И, наконец, третий вопрос я есть как я могу защитить от чего-то подобного?
Я предполагаю, что PDO специально предназначен для предотвращения запроса в запросе (?), Но после прочтения немного я все еще довольно запутан.
Я все еще изучаю все это, поэтому, если я не ясно или достаточно подробно в своем запросе, пожалуйста, дайте мне знать, и я попытаюсь обратиться к этому.
EDIT: Чтобы очистить путаницы, что я делаю это:
$pdo = new PDO('..');
$sql = 'SELECT id FROM users WHERE username = :username';
$statement = $pdo->prepare($sql);
$statement->bindParam(':username', $_POST['username']);
Вопрос в том, что, если $_POST['username']
содержит 'SELECT * FROM users'
(или любой другой запрос)? Как работает prepare()
? Могу ли я описать, действительно ли это отверстие безопасности? Мне нужна помощь в понимании этого.
Не используйте внешний вход как часть запроса. Чтобы предотвратить уязвимость SQL-инъекции, используйте параметризованные запросы. –
@WernerHenze См. Обновленный вопрос. Запрос «параметризован». –
http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection?rq=1 – nowhere