|
|
|
| Добрый день, на сайте реализована корзина товаров
Через 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?
Будет ли достаточной такой проверки? И есть ли вообще какая либо опасность?
Спасибо. | |
|
|
|
|
|
|
|
для: ZetRider
(09.12.2011 в 10:29)
| | Могут передать что-то вроде
<?php $_REQUEST['product_img'] = 'evilurl.ru/haha?myurl';
|
и ваша проверка это пропустит.
Подсказать конкретное решение сложно, т.к. не совсем понятно что именно передается в параметрах и как (и где) полученные данные в последствии используются. | |
|
|
|
|
|
|
|
для: Гость
(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. | |
|
|
|
|
|
|
|
для: ZetRider
(09.12.2011 в 10:51)
| | Я бы на вашем месте передавал только product_id и уже по нему из базы получал данные о товаре и если товар существует и доступен к продаже - добавлял его в корзину, используя данные из базы. | |
|
|
|
|
|
|
|
для: Гость
(09.12.2011 в 10:58)
| | Было бы все так просто, так бы и сделал... Поэтому и создал тему как обезопасить а не найти другое решение вывода изображений. | |
|
|
|
|
|
|
|
для: ZetRider
(09.12.2011 в 11:14)
| | Ок, тогда какой-нибудь из костылей)
1) По факту ваш вариант, просто явно проверяем что ссылка на изображение начинается (а не содержит) с адреса вашего сайта (и не забудьте ее обязательно потом заэкранировать, при выводе). (Если уж совсем важно - можно проверять физическое наличие указанной картинке на сервере)
2) При добавление в корзину проверяем reffer - если запрос с нашего сайта или пустой - добавляем, иначе - блокируем добавление. Таким образом злоумышленник в 99% случаев сможет изменить корзину только себе (что как я понимаю не страшно).
3) Можно сюда добавить еще передачу секретного хеша на основании ссылки на изображение и id товара, который будет проверяться на сервере при добавлении в корзину.. да много чего можно придумать :) | |
|
|
|
|
|
|
|
для: Гость
(09.12.2011 в 11:23)
| |
проверяем reffer - если запрос с нашего сайта или пустой - добавляем, иначе - блокируем
|
Круто ..а заголовки никто не подделывает...
Может проверять по IP или хосту....хэш чего то вам известного....
'SERVER_ADDR' ... 'SERVER_NAME'......
хэшируйте и передавайте ..а по месту проверяйте... | |
|
|
|
|
|
|
|
для: SerG7
(09.12.2011 в 15:41)
| | А какое нам дело если злоумышленник сам себе подделает? Главное чтоб другим не подделал. | |
|
|
|
|
|
|
|
для: Гость
(09.12.2011 в 11:23)
| | кстати а как проверять на начало строки? Так?
"#^".preg_quote($myurl)."#i";
|
| |
|
|
|
|
|
|
|
для: tima2010
(12.12.2011 в 12:36)
| | Да. | |
|
|
|
|
|
|
|
для: ZetRider
(09.12.2011 в 11:14)
| | Было бы все так просто, так бы и сделал...
на самом деле это проще чем сделано у вас (ну или не у вас, а у того кто на самом деле писал скрипт) | |
|
|
|
|
|
|
|
для: 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.
А какое у Вас есть решение?
Спасибо. | |
|
|
|