Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pdo подготовленные выражения 
:(
    Опции темы
titanrem
Дата 15.8.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Объясните, пожалуйста, каким образом подготовленные выражения защищают от атак? Везде эта фраза встречается, но не совсем понятно. Я так понимаю, что вместо шаблонов просто подставляются определенные выражения, а где же тут защита?
PM MAIL   Вверх
titanrem
Дата 16.8.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Что же тут нет ни одного человека, кто понимает, что такое подготовленные выражения и не  может ответить на вопрос?
PM MAIL   Вверх
Muerto
Дата 16.8.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Смотри в сторноу prepare и execute

выражение выглдядит так $statment = SELECT * FROM test WHERE id = ?

а затем делаешь bind, (statment, 1)
Затем 
execute


Код

$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);
$sth->execute();

//или как вариант с именами

$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();


Это сообщение отредактировал(а) Muerto - 16.8.2011, 13:07


--------------------
user posted image
PM MAIL   Вверх
titanrem
Дата 16.8.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



вот код, правда на mysqli. Но  это в данный момент не важно, и он не выполнился. А почему? Что ему такой код не дает выполнить?

Код

<?php
        $mysqli = new mysqli('localhost', 'root', '123', 'test'); 

/* Проверка соединения */ 
if (mysqli_connect_errno()) { 
    printf("Подключение невозможно: %s\n", mysqli_connect_error()); 
    exit(); 


$stmt = $mysqli->prepare("select * from xxx where t=?"); 
$stmt->bind_param('s', $str); 
$str="'x' or 1=1";

/* выполнение подготовленного выражения  */ 
$stmt->execute(); 
$stmt->store_result();
printf("%d Rows.\n", $stmt->num_rows); 

/* Закрытие соединения и выражения*/ 
$stmt->close();
        ?>

PM MAIL   Вверх
titanrem
Дата 16.8.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Просто интересно, что не дает выполнить такой запрос? Если без подготовленных выражений, то запрос выполняется.
PM MAIL   Вверх
skyboy
Дата 17.8.2011, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



в смысле "не выполнился"? ошибка? приводи её текст.
PM MAIL   Вверх
titanrem
Дата 17.8.2011, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Нет ошибки нет, просто не возвращает строки.
Пишет 0 Rows.
Хотя реально там есть такая строка. Если убрать подготовленные выражения, и написать запрос напрямую, то все будет работать правильно.
PM MAIL   Вверх
Valinur
Дата 17.8.2011, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 21.9.2007
Где: Москва

Репутация: 4
Всего: 6



Код

$str="x or 1=1"


поправь и будет работать
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
titanrem
Дата 19.8.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



А зачем кавычки убирать, тогда он пишет ошибку
PM MAIL   Вверх
NewDima
Дата 20.8.2011, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM ICQ   Вверх
Muerto
Дата 26.8.2011, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Это не будет пахать 
Код

$str="'x' or 1=1";


Потому что за место знака ?
Должно подставится
t=''x' or 1=1'

Но я думаю там ещё идет addslashes, так что будет  t='\'x\' or 1=1'

Вот это и ответ на вопрос как защищает!
Просто отфильтрует как простой безопасный текст.


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1171 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.