2015-06-10 6 views
4

Я имею в виду пример, как это:ВЫБРАТЬ в 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()? Могу ли я описать, действительно ли это отверстие безопасности? Мне нужна помощь в понимании этого.

+0

Не используйте внешний вход как часть запроса. Чтобы предотвратить уязвимость SQL-инъекции, используйте параметризованные запросы. –

+0

@WernerHenze См. Обновленный вопрос. Запрос «параметризован». –

+1

http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection?rq=1 – nowhere

ответ

2

Чтобы очистить путаницы, что я делаю это:

$pdo = new PDO('..'); $sql = 'SELECT id FROM users WHERE username = :username'; $statement = $pdo->prepare($sql); $statement->bindParam(':username', $_POST['username']);

Вопрос в том, что, если $ _POST [ 'имя пользователя'] содержит 'SELECT * FROM пользователей' (или любой другой запрос)?

Этот запрос вернет идентификаторы всех пользователей с именем пользователя «SELECT * FROM users».

Передавая $ _POST ['username'] как параметр, база данных знает, что любая строка $ _POST ['username'] может содержать это НЕ часть запроса. Это просто строка.

Это предотвращает SQL-инъекцию, так как параметр НЕ будет выполнен.Это также означает, что

SELECT name, continent FROM world WHERE continent IN (SELECT continent FROM world WHERE name='Brazil')

второй выберите действующий в качестве входного параметра пользователя - так $ _POST [ «имя»] содержит этот запрос Выбор континента от мира, где имя = «Бразилия»

не будет работать. Потому что вы не можете включать запросы в параметры. Ну, вы можете, но они не будут выполнены.

+0

Получил это из комментариев на мой вопрос. Отметьте ваш ответ как принято. Ty. –

Смежные вопросы