![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
titanrem |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Объясните, пожалуйста, каким образом подготовленные выражения защищают от атак? Везде эта фраза встречается, но не совсем понятно. Я так понимаю, что вместо шаблонов просто подставляются определенные выражения, а где же тут защита?
|
|||
|
||||
titanrem |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Что же тут нет ни одного человека, кто понимает, что такое подготовленные выражения и не может ответить на вопрос?
|
|||
|
||||
Muerto |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1207 Регистрация: 23.9.2006 Репутация: 3 Всего: 4 |
Смотри в сторноу prepare и execute
выражение выглдядит так $statment = SELECT * FROM test WHERE id = ? а затем делаешь bind, (statment, 1) Затем execute
Это сообщение отредактировал(а) Muerto - 16.8.2011, 13:07 |
|||
|
||||
titanrem |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
вот код, правда на mysqli. Но это в данный момент не важно, и он не выполнился. А почему? Что ему такой код не дает выполнить?
|
|||
|
||||
titanrem |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Просто интересно, что не дает выполнить такой запрос? Если без подготовленных выражений, то запрос выполняется.
|
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
в смысле "не выполнился"? ошибка? приводи её текст.
|
|||
|
||||
titanrem |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Нет ошибки нет, просто не возвращает строки.
Пишет 0 Rows. Хотя реально там есть такая строка. Если убрать подготовленные выражения, и написать запрос напрямую, то все будет работать правильно. |
|||
|
||||
Valinur |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 21.9.2007 Где: Москва Репутация: 4 Всего: 6 |
поправь и будет работать --------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ... |
|||
|
||||
titanrem |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
А зачем кавычки убирать, тогда он пишет ошибку
|
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 10 Всего: 12 |
Брр, зачем так все путать?
prepared statements используются для того, чтобы не парсить один и тот же запрос несколько за, а использовать его. Есть такое понятие, как стратегия запроса. Если каждый раз передавать запрос в базу данных, то СУБД будет каждый раз составлять стратегию, как делать выборку. Повторять лишнее действие. Но можно миновать этот шаг, и заставить распарсить независимо от того,какие параметры будут передаваться в будущем. Т.е. после этого $stmt = $mysqli->prepare("select * from xxx where t=?"); в СУБД, абстрактно говоря, будет существовать некая стратегия запроса, которая будет требовать только значения параметров. О строке "select * from xxx where t=?" на уже ничего знать не будет. Поэтому когда будете передавать параметр для совершения запроса, строка запроса не станет такой: select * from xxx where t='x' or 1=1 потому-что эта строка вообще использоваться не будет. Поэтому в таком случае инъекция не возможна, стратегия запроса создана НЕЗАВИСИМО от того, какие конкретные значения параметров будут переданы. Это один плюс. А второй - экономия времени выполнения запроса на устранении шага постоянного составления стратегии запроса. В mysql стратегию запроса можно увидеть с помощью команды explain |
|||
|
||||
Muerto |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1207 Регистрация: 23.9.2006 Репутация: 3 Всего: 4 |
Это не будет пахать
Потому что за место знака ? Должно подставится t=''x' or 1=1' Но я думаю там ещё идет addslashes, так что будет t='\'x\' or 1=1' Вот это и ответ на вопрос как защищает! Просто отфильтрует как простой безопасный текст. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |