Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: защита от поддельного URL
 
 автор: ZetRider   (09.12.2011 в 10:29)   письмо автору
 
 

Добрый день, на сайте реализована корзина товаров
Через Hidden поле каждому товару прописываю URL адрес изображения.

Далее ajax'ом передаю данные в файл cart.php, где создается сессия с URL IMG:

<?php
$product_id 
$_REQUEST['product_id']; // ID товара
$product_img $_REQUEST['product_img']; // URL изображения

if (isset($product_img)) {
    
$_SESSION['cart'][$product_id]['img'] = $product_img;
}
?>


Ранее не задумывался о безопасности работы с сессиями, возможно и нет никакой опасности (не знаю механизм подмены), но лучше поинтересуюсь у вас.

Решил сделать следующую проверку передаваемого адреса для URL изображения:

<?php
$product_id 
$_REQUEST['product_id']; // ID товара
$product_img $_REQUEST['product_img']; // URL изображения

$site_url "myurl"// домен сайта
$pattern "|".preg_quote($site_url)."|i"// ищем домен
if(preg_match($pattern$product_img)) {
    
$product_img $product_img// если домен есть в передаваемом URL
} else {
    
$product_img "";
}

if (isset(
$product_img)) {
    
$_SESSION['cart'][$product_id]['img'] = $product_img;
}
?>


Далее на странице сайта подставляется URL адрес изображения в html код.

Ведь если создать myurl.hackurl.ru/ то рег. выражение будет возвращать TRUE?

Будет ли достаточной такой проверки? И есть ли вообще какая либо опасность?
Спасибо.

  Ответить  
 
 автор: Гость   (09.12.2011 в 10:35)   письмо автору
 
   для: ZetRider   (09.12.2011 в 10:29)
 

Могут передать что-то вроде
<?php $_REQUEST['product_img'] = 'evilurl.ru/haha?myurl'

и ваша проверка это пропустит.

Подсказать конкретное решение сложно, т.к. не совсем понятно что именно передается в параметрах и как (и где) полученные данные в последствии используются.

  Ответить  
 
 автор: ZetRider   (09.12.2011 в 10:51)   письмо автору
 
   для: Гость   (09.12.2011 в 10:35)
 

Главная страница:
Список товаров выводится циклом, данные берутся из базы, оформлено так:

<form class="get_product" method="POST">
Описание товара<br>
<input type="hidden" name="product_id" value="<?php echo $product_id// получаю из базы ?>">
<input type="hidden" name="product_img" value="<?php echo $product_img// получаю из базы ?>">
<input name="product_add" type="submit" value="В корзину" />
</form>


При нажатии передаются данные в файл cart.php (средствами ajax)
в cart.php код:
<?php 
$product_id 
$_REQUEST['product_id']; // ID товара 
$product_img $_REQUEST['product_img']; // URL изображения

$site_url "myurl"// домен сайта 
$pattern "|".preg_quote($site_url)."|i"// ищем домен 
if(preg_match($pattern$product_img)) { 
$product_img $product_img// если домен есть в передаваемом URL 
} else { 
$product_img ""
}

if (isset(
$product_img)) { 
$_SESSION['cart'][$product_id]['img'] = $product_img
}

// еще коды, и грубо говоря выводим изображения
echo '<img src="'.$_SESSION['cart'][$product_id]['img'].'">';
?> 


Далее на главной странице происходит обновление блока:

$("#mycart").load("cart.php");


где выводится изображения.

Так вот, чтобы злоумышленник не смог подменить изображения на своё, как можно себя обезопасить? ведь можно со стороннего сайта послать запрос в файл cart.php.

  Ответить  
 
 автор: Гость   (09.12.2011 в 10:58)   письмо автору
 
   для: ZetRider   (09.12.2011 в 10:51)
 

Я бы на вашем месте передавал только product_id и уже по нему из базы получал данные о товаре и если товар существует и доступен к продаже - добавлял его в корзину, используя данные из базы.

  Ответить  
 
 автор: ZetRider   (09.12.2011 в 11:14)   письмо автору
 
   для: Гость   (09.12.2011 в 10:58)
 

Было бы все так просто, так бы и сделал... Поэтому и создал тему как обезопасить а не найти другое решение вывода изображений.

  Ответить  
 
 автор: Гость   (09.12.2011 в 11:23)   письмо автору
 
   для: ZetRider   (09.12.2011 в 11:14)
 

Ок, тогда какой-нибудь из костылей)

1) По факту ваш вариант, просто явно проверяем что ссылка на изображение начинается (а не содержит) с адреса вашего сайта (и не забудьте ее обязательно потом заэкранировать, при выводе). (Если уж совсем важно - можно проверять физическое наличие указанной картинке на сервере)
2) При добавление в корзину проверяем reffer - если запрос с нашего сайта или пустой - добавляем, иначе - блокируем добавление. Таким образом злоумышленник в 99% случаев сможет изменить корзину только себе (что как я понимаю не страшно).
3) Можно сюда добавить еще передачу секретного хеша на основании ссылки на изображение и id товара, который будет проверяться на сервере при добавлении в корзину.. да много чего можно придумать :)

  Ответить  
 
 автор: SerG7   (09.12.2011 в 15:41)   письмо автору
 
   для: Гость   (09.12.2011 в 11:23)
 

проверяем reffer - если запрос с нашего сайта или пустой - добавляем, иначе - блокируем 

Круто ..а заголовки никто не подделывает...
Может проверять по IP или хосту....хэш чего то вам известного....
'SERVER_ADDR' ... 'SERVER_NAME'......
хэшируйте и передавайте ..а по месту проверяйте...

  Ответить  
 
 автор: Гость   (10.12.2011 в 17:12)   письмо автору
 
   для: SerG7   (09.12.2011 в 15:41)
 

А какое нам дело если злоумышленник сам себе подделает? Главное чтоб другим не подделал.

  Ответить  
 
 автор: tima2010   (12.12.2011 в 12:36)   письмо автору
 
   для: Гость   (09.12.2011 в 11:23)
 

кстати а как проверять на начало строки? Так?
"#^".preg_quote($myurl)."#i"; 

  Ответить  
 
 автор: cheops   (12.12.2011 в 17:19)   письмо автору
 
   для: tima2010   (12.12.2011 в 12:36)
 

Да.

  Ответить  
 
 автор: Valick   (09.12.2011 в 11:31)   письмо автору
 
   для: ZetRider   (09.12.2011 в 11:14)
 

Было бы все так просто, так бы и сделал...
на самом деле это проще чем сделано у вас (ну или не у вас, а у того кто на самом деле писал скрипт)

  Ответить  
 
 автор: ZetRider   (09.12.2011 в 12:43)   письмо автору
 
   для: Valick   (09.12.2011 в 11:31)
 

Гость, спасибо.

Valick, возможно я просто не вижу другой вариант... Но, сейчас расскажу пройденный этап:

в index.php заполняем форму
форма строится динамически, под каждый товар отдельно
все данные берутся из базы
при нажатии на кнопку формы происходит:
1. передача данных в файл CART.php и запись в сессии
2. обновление div блока с ID = mycart, методом
$("#mycart").load("cart_get.php");  // загружается файл cart_get.php (в нем формируется вид товара для корзины и обновляются данные)


Получаем вид массива:
Array
(
[cart] => Array
(
[125] => Array
(
[name] => Товар
[price] => 400
[id] => 125
[img] => http://www.mysite.ru/wp-content/uploads/2011/12/qqq.jpg
[number] => 1
[full] => 400
)

[130] => Array
(
[name] => Супер товар
[price] => 450
[id] => 130
[img] => http://www.mysite.ru/wp-content/uploads/2011/12/miimg.jpg
[number] => 1
[full] => 450
)

[120] => Array
(
[name] => Название товара
[price] => 1000
[id] => 120
[img] => http://www.mysite.ru/wp-content/uploads/2011/12/123.jpg
[number] => 2
[full] => 2000
)

)

)


Для чего я передаю URL изображения?
Если получать изображения по ID из базы данных, то в файле cart_get.php придется запускать функцию поиска IMG по ID
Структура базы данных это - wordpress

И блок #mycart будет грузиться долго, и нагружая сервер при каждом клике добавить или удалить товар.

Так же, все функции и классы подключения к базе работают только в index.php, если нажать кнопку добавить или удалить товар то REQUEST_URI меняется на адрес до файла cart_get.php.

А какое у Вас есть решение?

Спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования