Предотвращение поддельных форм от отправки данных на сервер - PullRequest
1 голос
/ 23 августа 2011

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

Что мне делать?

У меня есть простая идея, но я не знаю, работает ли она или нет (даже я не знаю, какие методы php использовать)

Идея состоит в добавлении переменной $ip на странице, этот $ ip является местоположением файла (и формы) php (возможно, с использованием $ _SERVER ['PHP_INFO'] или другого) ... затем отправка этой переменной в файл add.php с помощью метода POST, но без отображенияв источнике HTML-кода.

в add.php, сервер проверит, равен ли ip страницы IP-адресу сервера или нет, затем он решит, добавлять ли комментарии или убиватьоперация.

Я надеюсь обсудить эту тему

Заранее спасибо

Ответы [ 5 ]

7 голосов
/ 23 августа 2011

Вы можете сделать следующее:

  1. Создайте уникальный хэш.
  2. Сохраните этот хэш в сеансе.
  3. Реализовать скрытое поле со значением хэша.
  4. Проверьте хэш на представленной странице.
5 голосов
/ 23 августа 2011

Это называется подделкой межсайтовых запросов (CSRF). В Rails это уже встроено. Я не знаю, какой PHP-фреймворк вы используете, но я знаю, что CakePHP также встроил его.

Если вы не используете PHP-фреймворк, или если у фреймворка, который вы используете, эта функциональность отсутствует, вы можете просто Google до CSRF protection PHP и щелкнуть 2-ую ссылку (http://codeutopia.net/blog/2008/10/16/how-to-csrf-protect-all-your-forms/).

4 голосов
/ 23 августа 2011
$_SERVER['HTTP_REFERER'];

Содержит URL, с которого отправляется форма.Если URL не является вашим сайтом, вы можете ожидать, что он будет с вашего сервера, если они не пытаются подделать заголовки.

http://www.php.net/manual/en/reserved.variables.server.php

Лучшим вариантом является созданиеуникальный ключ в скрытом вводе.Что-то вроде:

<?php
$my_salt = 'fs gadfgasfhg usfaghsa gosg435435874542584 htrwhgsfgbsfgu';
$hash = sha1($_SERVER['REMOTE_ADDR'] . date('d/m/y') . $my_salt);
?>
<input type="hidden" value="<?php echo $hash; ?>" />

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

1 голос
/ 23 августа 2011

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

Единственное, о чем я могу думать, это использовать сеансы и добавлять какие-то уникальные дайджесты к скрытому элементу формы или файлу cookie при создании страницы, сохранять его в $ _SESSION и проверять, что значение, которое вы получаете, при форма отправляется совпадает со значением отправлено в первую очередь.

1 голос
/ 23 августа 2011

Вы можете предоставить скрытый ввод или использовать переменную сеанса для защиты CSRF.

...