Как запретить пользователям изменять переменные с помощью firebug в ajax-запросах - PullRequest
3 голосов
/ 04 марта 2012

Я разрешаю пользователям добавлять в избранное обновления или тему форума.Поэтому, когда пользователь пытается добавить одну из них в избранное, я отправлю через Ajax 2 вещи, item_id (update или topic) в качестве id (например, 1321313213) и его тип ("update" или "topic") в виде строки.

Однако, допустим, кто-то пытается добавить в избранное обновление с неизмененным идентификатором, но тип изменяется на "topic" (через firebug или что-то еще) ...

Это не должно продолжаться, так как эта комбинация неправильно ... как я могу убедиться, что отправляемый item_id является обновлением или темой, поскольку этот идентификатор может сосуществовать в обеих таблицах ???

Текущее решение:

Создать скрытый элемент ввода и добавить в качестве значения 5 случайных символов (a-zA-Z0-9) и имя типа md5 (обновление или тема)

например:

$random_str = $this->my_model->generateRandomString(5);
<input type="hidden" value="<?php echo $random_str.md5("update"); ?>" id="type" />

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

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Ваш серверный скрипт (PHP) всегда должен предполагать, что он получает фиктивные данные.Никогда не полагайтесь исключительно на javascript для обработки или очистки.

Если ваш javascript может определить, должно ли задание быть «обновлением» или «темой», я уверен, что ваш PHP может это сделатьВозможно, используя еще несколько запросов к БД или что-то подобное, но это цена, которую вы должны заплатить.

0 голосов
/ 04 марта 2012

Вы смотрите на проблему с неправильной точки зрения.Особенно от вашего кода на стороне сервера (PHP).

Ваш сервер получает данные.Он получает данные, которые выглядят примерно так: user (из сеанса), id и type.Ваш сервер должен задать вопрос: это действительные данные?Если это так - сохраните его в БД;Если это не так - не сохраняйте его в БД.Это так просто.

Вы можете взглянуть с этой точки зрения: код на стороне клиента является лишь одним из способов связи с вашим сервером.Другой способ - использовать веб-браузер + firebug.Это вполне допустимое использование Вашего серверного приложения.И Вашему PHP-коду не должно быть никакого отношения к тому, как запрос достигает его.

Так что, если Ваш текущий код не позволяет Вам в своем PHP-коде чувствовать себя комфортно и свободно решать, является ли это обновлением или созданием темы, чем Вам нужно изменить свой сервербоковой код (и, возможно, схема БД).

Ваше текущее решение не годится, потому что, если я знаю, как использовать firebug, я, вероятно, выясню, что «9d9b68ac2b1de18d3712096354b3c3a5» означает «тема» и «3ac340832f29c11538fbe2d6f75e8»"update".

Я думаю, что Вы пытаетесь изобрести свою собственную CSRF защиту.Так что иди в интернет и почитай об этом.

...