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

Форум PHP

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

 

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

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

тема: Безопасность cookie
 
 автор: name   (23.09.2006 в 21:40)   письмо автору
 
 

Такая ситуация: покупательская тележка - массив ($cart_arr); требуется запомнить состояние тележки. Мои действия -

<?php

//при добавлении товара в корзину
setcookie("user_cart"serialize($cart_arr), time() + 3600*24*7);

?>

Достаточно изменить значение cookie (на пример: '''98 и т. п.) и скрипт начинает ругаться. Хуже того - если обмануть его корректным значением (на пример: сохранить правильный формат данных и указать ложную цену за товар), то в базу запишется ложная стоимость заказа.

Подскажите, пожалуйста, как с этим можно бороться.

   
 
 автор: DEM   (23.09.2006 в 21:53)   письмо автору
 
   для: name   (23.09.2006 в 21:40)
 

Скорее всего никак, ну только если сравнивать название вещи со стоймостью из БД и т.д. Просто куки всё таки хранятся на стороне клиента, поэтому с ними часто не работают при создании авторизации и т.д.

   
 
 автор: name   (23.09.2006 в 22:57)   письмо автору
 
   для: DEM   (23.09.2006 в 21:53)
 

>Просто Куки всё-таки хранятся на стороне клиента, поэтому с ними часто не работают при >создании авторизации и т.д.

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

Если делать с сессиями - появляется SID в строке адреса, а поисковики не работают с длинными адресами. И состояние корзины не запомнить. Проверку с БД я выполняю, только толку - если скрипт загибается до этой проверки. Доходит до места:

<?php

$cart_arr 
unserialize($_COOKIE['user_cart']);

?>

, а дальше начинает ругаться - т. к. $_COOKIE['user_cart'] содержит неверный формат данных.

Разве нет никакого выхода?

   
 
 автор: kasmanaft   (24.09.2006 в 00:06)   письмо автору
 
   для: name   (23.09.2006 в 22:57)
 

Логичнее в куках было бы хранить только ID товара, а стоимость и прочее выбирать уже после из БД.
Чтобы пользователь просто так не заменил ID из куков, его можно зашифровать. Если доступна библиотека mcrypt (на большенстве хостингов она доступна), то можно воспользоваться ей:

<?
function crypt_data ($data)
{
        
$crypt_key "key";
        
$crypt_data = @mcrypt_ecb (MCRYPT_3DES$crypt_key$dataMCRYPT_ENCRYPT);
        return 
$crypt_data;
}
function 
decrypt_data ($data)
{
        
$crypt_key "key";
        
$decrypt_data = @mcrypt_ecb (MCRYPT_3DES$crypt_key$dataMCRYPT_DECRYPT);
        return 
$decrypt_data;
}
$id '12';
echo 
$id crypt_data ($id)."<br>";
echo 
decrypt_data ($id);
?>

Даже изменив содержимое куков, врядли пользователю удастся получить строку цифр.

   
 
 автор: name   (24.09.2006 в 12:51)   письмо автору
 
   для: kasmanaft   (24.09.2006 в 00:06)
 

Я так и делаю - храню пару значений: id -> quantity. Изначально у меня массив заносится в $_SESSION['cart'], затем я делаю:

<?php
setcookie
("user_cart"serialize($_SESSION['cart']), time() + 3600*24*7);
?>

И после этого, я должен вызвать ф.

<?php
$_COOKIE
['user_cart'] = crypt_data($_COOKIE['user_cart'])
?>

так, или я не правильно понял?

И еще вопрос, а можно вообще уйти от сессий и как долго будут выполняться ф. crypt_data ($data) и decrypt_data ($data), просто я храню в сессиях стоимость всего заказа, кол-ва товаров и стоимость доставки. Если я каждый раз буду при добавлении товара в корзину вызывать данные функции еще к этим трем переменным - то это ничего?

   
 
 автор: kasmanaft   (24.09.2006 в 13:12)   письмо автору
 
   для: name   (24.09.2006 в 12:51)
 

все вроде правильно ...
функции будут работь достаточно быстро: шифрование текста длиной в несколько тысяч символов идет тысячные доли секунды, пользователю этого заметить не удастся :)
Значения в сессии шифровать не обязательно, пользователю их подделать все равно не удастся (обычному пользователю)

   
 
 автор: name   (24.09.2006 в 13:18)   письмо автору
 
   для: kasmanaft   (24.09.2006 в 13:12)
 

Т. е. если я правильно понял, хранить и шифровать только массив из пары id -> quantity, а все дальнейшие действия (подсчет стоимости заказа и т. д.) производить с БД?

   
 
 автор: kasmanaft   (24.09.2006 в 13:35)   письмо автору
 
   для: name   (24.09.2006 в 13:18)
 

Если это возможно, то да.
Пользователь набросал товаров в корзину (заносим id -> quantity в куки), пошел оформлять заказ ... там он выбрал способ оплаты, способ доставки и пр. (на время это все можно поместить в сессию) ... далее, как заказ оформлен, все заносится в БД, значение куков уничтожается.

   
 
 автор: name   (24.09.2006 в 13:50)   письмо автору
 
   для: kasmanaft   (24.09.2006 в 13:35)
 

Спасибо.

Ну меня еще вопрос - насколько мешает SID в строке адреса, если я буду использовать сессии?

   
 
 автор: Loki   (24.09.2006 в 13:06)   письмо автору
 
   для: kasmanaft   (24.09.2006 в 00:06)
 

Более того, в куках вообще можно хранить только идентификатор заказа, а сам заказ - в БД, откуда его удалять, например, по истечение месяца.

   
 
 автор: name   (24.09.2006 в 13:13)   письмо автору
 
   для: Loki   (24.09.2006 в 13:06)
 

А если пользователь не дошел до стадии оформления заказа, а набросал в корзину товара и вышел, как тогда запомнить сост. корзины (добавлять может и не зарегистрированный пользователь)?

   
 
 автор: Loki   (24.09.2006 в 13:15)   письмо автору
 
   для: name   (24.09.2006 в 13:13)
 

Так, как я написал.

   
 
 автор: name   (24.09.2006 в 13:38)   письмо автору
 
   для: Loki   (24.09.2006 в 13:15)
 

Вы написали: "хранить только идентификатор заказа, а сам заказ - в БД". Я и объясняю, если пользователь не дошел до оформления заказа, как я узнаю идентификатор (ведь корзина и оформление заказа - разные вещи) или вы предлагаете завести таблицу для корзины и заносить туда значения.

   
 
 автор: Loki   (24.09.2006 в 14:24)   письмо автору
 
   для: name   (24.09.2006 в 13:38)
 

>предлагаете завести таблицу для корзины и заносить туда значения.
Совершенно верно.

   
 
 автор: name   (24.09.2006 в 14:34)   письмо автору
 
   для: Loki   (24.09.2006 в 14:24)
 

Спасибо на добром совте :)

   
 
 автор: Loki   (24.09.2006 в 15:50)   письмо автору
 
   для: name   (24.09.2006 в 14:34)
 

На самом деле, потребуются две дополнительные таблицы. Но вы все равно делать этого не будете, так что это пустое.

   
 
 автор: Vantuz   (24.09.2006 в 19:06)   письмо автору
 
   для: Loki   (24.09.2006 в 15:50)
 

Подскажите пожалуйста, а как нить по другому можно шифровать куки у меня просто mcrypt не включен на хосте

   
 
 автор: kasmanaft   (24.09.2006 в 19:14)   письмо автору
 
   для: Vantuz   (24.09.2006 в 19:06)
 

Если установлена библиотека GMP, можно попрбовать gmp_xor

   
 
 автор: name   (24.09.2006 в 19:13)   письмо автору
 
   для: Loki   (24.09.2006 в 15:50)
 

Почему вы так решили - я просто не думаю, что это самый простой способ (требуется изменить скрипт в кротчайшие сроки). И почему две таблицы - на будущее?

   
 
 автор: Loki   (24.09.2006 в 21:56)   письмо автору
 
   для: name   (24.09.2006 в 19:13)
 

Ну возможно мне привидился скепсис там, где его небыло:)
Две таблицы - чтобы уменьшить их объем и упростить код.
первая таблица:
id заказа (то что мы сохраняем в куках), дата-время (для удаления после истечения срока), id пользователя (для тех, кто зарегистрирован)
и вторая таблица:
id заказа (такой же как и в первой таблице), id товара, количество, цена (при необходимости).

В итоге, даже при довольно большой посещаемости и крупных заказах, будем иметь компактную таблицу.

   
Rambler's Top100
вверх

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