|
|
|
| Такая ситуация: покупательская тележка - массив ($cart_arr); требуется запомнить состояние тележки. Мои действия -
<?php
//при добавлении товара в корзину
setcookie("user_cart", serialize($cart_arr), time() + 3600*24*7);
?>
|
Достаточно изменить значение cookie (на пример: '''98 и т. п.) и скрипт начинает ругаться. Хуже того - если обмануть его корректным значением (на пример: сохранить правильный формат данных и указать ложную цену за товар), то в базу запишется ложная стоимость заказа.
Подскажите, пожалуйста, как с этим можно бороться. | |
|
|
|
|
|
|
|
для: name
(23.09.2006 в 21:40)
| | Скорее всего никак, ну только если сравнивать название вещи со стоймостью из БД и т.д. Просто куки всё таки хранятся на стороне клиента, поэтому с ними часто не работают при создании авторизации и т.д. | |
|
|
|
|
|
|
|
для: DEM
(23.09.2006 в 21:53)
| | >Просто Куки всё-таки хранятся на стороне клиента, поэтому с ними часто не работают при >создании авторизации и т.д.
Если я не ошибаюсь, данный форум работает на куках (в плане авторизации).
Если делать с сессиями - появляется SID в строке адреса, а поисковики не работают с длинными адресами. И состояние корзины не запомнить. Проверку с БД я выполняю, только толку - если скрипт загибается до этой проверки. Доходит до места:
<?php
$cart_arr = unserialize($_COOKIE['user_cart']);
?>
|
, а дальше начинает ругаться - т. к. $_COOKIE['user_cart'] содержит неверный формат данных.
Разве нет никакого выхода? | |
|
|
|
|
|
|
|
для: name
(23.09.2006 в 22:57)
| | Логичнее в куках было бы хранить только ID товара, а стоимость и прочее выбирать уже после из БД.
Чтобы пользователь просто так не заменил ID из куков, его можно зашифровать. Если доступна библиотека mcrypt (на большенстве хостингов она доступна), то можно воспользоваться ей:
<?
function crypt_data ($data)
{
$crypt_key = "key";
$crypt_data = @mcrypt_ecb (MCRYPT_3DES, $crypt_key, $data, MCRYPT_ENCRYPT);
return $crypt_data;
}
function decrypt_data ($data)
{
$crypt_key = "key";
$decrypt_data = @mcrypt_ecb (MCRYPT_3DES, $crypt_key, $data, MCRYPT_DECRYPT);
return $decrypt_data;
}
$id = '12';
echo $id = crypt_data ($id)."<br>";
echo decrypt_data ($id);
?>
|
Даже изменив содержимое куков, врядли пользователю удастся получить строку цифр. | |
|
|
|
|
|
|
|
для: 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), просто я храню в сессиях стоимость всего заказа, кол-ва товаров и стоимость доставки. Если я каждый раз буду при добавлении товара в корзину вызывать данные функции еще к этим трем переменным - то это ничего? | |
|
|
|
|
|
|
|
для: name
(24.09.2006 в 12:51)
| | все вроде правильно ...
функции будут работь достаточно быстро: шифрование текста длиной в несколько тысяч символов идет тысячные доли секунды, пользователю этого заметить не удастся :)
Значения в сессии шифровать не обязательно, пользователю их подделать все равно не удастся (обычному пользователю) | |
|
|
|
|
|
|
|
для: kasmanaft
(24.09.2006 в 13:12)
| | Т. е. если я правильно понял, хранить и шифровать только массив из пары id -> quantity, а все дальнейшие действия (подсчет стоимости заказа и т. д.) производить с БД? | |
|
|
|
|
|
|
|
для: name
(24.09.2006 в 13:18)
| | Если это возможно, то да.
Пользователь набросал товаров в корзину (заносим id -> quantity в куки), пошел оформлять заказ ... там он выбрал способ оплаты, способ доставки и пр. (на время это все можно поместить в сессию) ... далее, как заказ оформлен, все заносится в БД, значение куков уничтожается. | |
|
|
|
|
|
|
|
для: kasmanaft
(24.09.2006 в 13:35)
| | Спасибо.
Ну меня еще вопрос - насколько мешает SID в строке адреса, если я буду использовать сессии? | |
|
|
|
|
|
|
|
для: kasmanaft
(24.09.2006 в 00:06)
| | Более того, в куках вообще можно хранить только идентификатор заказа, а сам заказ - в БД, откуда его удалять, например, по истечение месяца. | |
|
|
|
|
|
|
|
для: Loki
(24.09.2006 в 13:06)
| | А если пользователь не дошел до стадии оформления заказа, а набросал в корзину товара и вышел, как тогда запомнить сост. корзины (добавлять может и не зарегистрированный пользователь)? | |
|
|
|
|
|
|
|
для: name
(24.09.2006 в 13:13)
| | Так, как я написал. | |
|
|
|
|
|
|
|
для: Loki
(24.09.2006 в 13:15)
| | Вы написали: "хранить только идентификатор заказа, а сам заказ - в БД". Я и объясняю, если пользователь не дошел до оформления заказа, как я узнаю идентификатор (ведь корзина и оформление заказа - разные вещи) или вы предлагаете завести таблицу для корзины и заносить туда значения. | |
|
|
|
|
|
|
|
для: name
(24.09.2006 в 13:38)
| | >предлагаете завести таблицу для корзины и заносить туда значения.
Совершенно верно. | |
|
|
|
|
|
|
|
для: Loki
(24.09.2006 в 14:24)
| | Спасибо на добром совте :) | |
|
|
|
|
|
|
|
для: name
(24.09.2006 в 14:34)
| | На самом деле, потребуются две дополнительные таблицы. Но вы все равно делать этого не будете, так что это пустое. | |
|
|
|
|
|
|
|
для: Loki
(24.09.2006 в 15:50)
| | Подскажите пожалуйста, а как нить по другому можно шифровать куки у меня просто mcrypt не включен на хосте | |
|
|
|
|
|
|
|
для: Vantuz
(24.09.2006 в 19:06)
| | Если установлена библиотека GMP, можно попрбовать gmp_xor | |
|
|
|
|
|
|
|
для: Loki
(24.09.2006 в 15:50)
| | Почему вы так решили - я просто не думаю, что это самый простой способ (требуется изменить скрипт в кротчайшие сроки). И почему две таблицы - на будущее? | |
|
|
|
|
|
|
|
для: name
(24.09.2006 в 19:13)
| | Ну возможно мне привидился скепсис там, где его небыло:)
Две таблицы - чтобы уменьшить их объем и упростить код.
первая таблица:
id заказа (то что мы сохраняем в куках), дата-время (для удаления после истечения срока), id пользователя (для тех, кто зарегистрирован)
и вторая таблица:
id заказа (такой же как и в первой таблице), id товара, количество, цена (при необходимости).
В итоге, даже при довольно большой посещаемости и крупных заказах, будем иметь компактную таблицу. | |
|
|
|