Как убедиться, что идентификаторы продуктов из базы данных не подделаны - PullRequest
1 голос
/ 24 ноября 2010

У меня есть небольшая корзина PHP / MySQL, в которую пользователи добавляют товары, оформляют заказ и оплачивают.
Все эти продукты имеют идентификаторы на них, так что когда пользователь проверяет,
Я могу получить атрибуты этого продукта (цена, вес, идентификатор учетной записи продавца и т. Д.).

Прямо сейчас для кого-то было бы действительно легко открыть Firebug,
угадать другой идентификатор продукта, изменить его и оформить заказ.

Как лучше всего это предотвратить?
Магазин и система оформления заказа находятся в двух разных доменах, если это имеет значение.
Я мог бы использовать что-то вроде уникального токена
но как это будет работать, если несколько клиентов смогут одновременно использовать корзину?

РЕДАКТИРОВАТЬ : Вау, набрал это слишком быстро, пропустив некоторые важные детали. В данный момент корзина представлена ​​в виде JSON, который хранится в сеансе PHP. Все продукты имеют account_id, который связывает их с учетной записью поставщика.

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

Ответы [ 5 ]

3 голосов
/ 24 ноября 2010

Используйте сеанс на стороне сервера для хранения сведений о корзине.

Каждый сеанс получает уникальный идентификатор, сохраняемый в файле cookie. Все детали (выбранные позиции, сумма и т. Д.) Привязаны к этому идентификатору сессии.

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

Если вам нужно «поделиться» sessionId с какой-либо внешней службой, вместо этого рассчитайте отдельный уникальный ключ и поделитесь этим ключом со сторонней службой (= служба проверки в вашем случае).
Это гарантирует, что вы сможете однозначно идентифицировать своего клиента в общении с третьей стороной, при этом третья сторона ничего не знает о том, как вы идентифицируете или общаетесь со своим клиентом на вашей стороне забора. (важно помнить, что sessionId - это общий секрет, о котором больше никто не должен знать).

1 голос
/ 24 ноября 2010

Если у вас есть доступ к системе корзины, правильным способом будет сделать так, чтобы она дублировала поиск идентификатора и расчеты стоимости перед выполнением платежа.Таким образом, если кто-то СДЕЛАЕТ перейти с коробки конфет за 1,99 долл. США на HDTV за 1999,99 долл. США, он получит плату за телевизор.

Если у вас нет доступа к вашей корзине или вы не можете сказатьэто то, что продукты и их стоимость.Получите новую систему корзины.

Примечание: вы НИКОГДА не должны доверять данным, полученным от пользователя.Не должно быть необходимости доверять пользователю.Просто примите идентификаторы и запустите все числа на сервере.

0 голосов
/ 24 ноября 2010

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

0 голосов
/ 24 ноября 2010

Я думаю, что вам нужно зашифровать / расшифровать идентификатор вашего продукта и использовать его.Вы можете использовать base64_encode () и base64_decode ()

Надеюсь, это поможет

0 голосов
/ 24 ноября 2010

Один из способов сделать это - использовать хеш.Когда они выбирают продукт и форма отображается, возьмите хэш идентификатора продукта и сохраните его в скрытом поле рядом с идентификатором продукта.Когда появляется сообщение «оформить заказ», возьмите хеш идентификатора продукта, который был опубликован, и сравните его с тем, который был отправлен в форме.Если они не совпадают, то идентификатор продукта был подделан.Я не знаком с PHP, поэтому не могу предоставить пример кода, но я использовал этот подход в ASP.NET, и он работает очаровательно.

Надеюсь, что это имеет смысл!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...