2012-02-08 3 views
2

У меня возник вопрос о прекращении подачи поддельных форм. Как насчет того, если с помощью $_SERVER['HTTP_REFERER'] я разрешаю только материалы, представленные на моем сайте? Это поможет? Благодаря!Остановить поддельные сообщения формы

+3

'HTTP_REFERER' сомнителен легко подготовить запрос с пользовательской реферер – veritas

+0

чтения: http://stackoverflow.com/questions/233192/detecting-stealth-web-crawlers – Jacco

ответ

5

Это поможет, и это довольно легко добавить, но оно не остановит атаку, после чего вы сможете обмануть заголовок HTTP_REFERER.

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

Запустить поиск CAPTCHA «Полностью автоматизированный публичный тест Тьюринга, чтобы рассказать« Компьютеры и люди », это то, что вы действительно ищете.

0

Остановить? Безлимитный? Возможно. Ваш сайт действительно поражен тревожным количеством поддельных форм, или вы просто преувеличиваете? Не решайте проблем, которых там нет.

+2

безопасности является проблемой, которая является всегда там. Если ложные формы представлений будут проблемой, уместно защищать их, даже до первого инцидента. –

3

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

Если ваш браузер может это сделать, каждый может это сделать.

+2

Технически верно, но можно предотвратить отправку формы без предыдущего GET. Мне бы очень хотелось, чтобы люди пришли к выводу, что это невозможно в общем случае и, таким образом, не предпринять необходимых шагов для предотвращения подделок под кросс-сайтом (XSRF). –

+1

Я думаю, что это зависит от условий, которые вы устанавливаете. Если сеанс аутентифицирован, безопасен и достаточно короток, файлы cookie шифруются, используются надлежащие методы (например, антикоррозионные жетоны), вы можете установить планку очень высоко в предотвращении подделанных форм. – tvanfosson

+0

Добавить комментарии tvanfosson/David Conrad. Если вы убедитесь, что какие-либо важные данные, которые необходимо изменить в базе данных, особенно такие поля, как пароль или электронная почта, требуют, чтобы пользователь вводил свой пароль и не использовал $ _GET/$ _REQUEST для доступа к переменным, что помогло бы с XSRF и другие легкие попытки обмана/использования. На стороне XSRF я думаю, что не использовать $ _GET/$ _REQUEST для запросов учетной записи, чтобы решить большинство из этих проблем. –

0

Реферирование легко подделано.

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

0

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

0

Попробуйте сделать закладку captcha, как ReCaptcha. Вы не только предотвратите спам-боты от спама вашего веб-сайта, но также сможете «разрешить» только тех людей, которые используют вашу форму (по крайней мере в некоторой степени), им нужно будет загрузить форму, чтобы получить капчу, а затем отправить ответ).

-1

Не помогает. Прочитайте это: http://shiflett.org/articles/form-spoofing

+0

-1 Просто предоставление ссылки не считается ответом на stackoverflow. – Jacco

+0

Так что только ссылки в комментариях лучше? –

+0

Если это всего лишь ссылка, комментарии - подходящее место для публикации. Комментарии не запрашивают upvotes. – Jacco

0

Подмена заголовков HTTP довольно проста и поэтому не должна использоваться для чего-то, что требует строгой безопасности. Один из методов, который обычно используется, заключается в том, чтобы отправить зашифрованный файл cookie и соответствующий, зашифрованный токен в скрытый ввод формы. Файл cookie должен быть cookie только для HTTP. При отправке формы проверьте соответствие значения из файла cookie и значения из скрытого ввода. Это поможет предотвратить подделки запросов на межсайтовых сайтах, поскольку запрос на ваш сайт не может быть успешно выполнен с другого сайта, потому что они либо будут пропускать cookie (для атаки MIM), либо скрытый ввод (поддельная форма). Конечно, это зависит от того, что вы убедитесь, что ваш сайт защищен, поэтому они не могут нюхать токены, чтобы узнать, что им нужно.

Вот хорошая дискуссия о том, как это делается в ASP.NET MVC, http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

2

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

Это также означает, что чем меньше параметров вы предоставляете для отправки в форме, тем меньше нужно проверять и проверять. В частности, параметры, которые предварительно заданы и не подлежат изменению пользователем (то есть скрытые поля формы), не обязательно должны быть встроены в форму, если это действительно не необходимо. Вместо этого вы можете сохранить их в container in the session и только ссылаться на этот контейнер через скрытое поле. Если это не вариант, убедитесь, что вы, по крайней мере, можете обнаружить любой недостаток целостности, выполнив предварительные значения с помощью MAC.

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

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

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

Лучше всего было бы использовать комбинацию всех указанных выше мер:

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

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

0

Без определения «спуфинга» это будет пустой разговор.

Существует дюжина различных «пародий», каждая из которых отличается своей защитой.

Самым общим решением является CAPTCHA.

0

Предполагается использовать токен. Если вы используете какую-либо из популярных архитектур MVC, вам не нужно беспокоиться о том, как заботится о предотвращении спуфинга. Но если вы работаете с настраиваемой MVC-архитектурой, как и я, токеном является подход. В вашем классе базы данных для каждой функции CRUD (CREATE, READ, UPDATE и DELETE) проверьте токен. Например, токен может быть сгенерирован через md5.

public function save(){ 
if(isset($_SESSION['token']){ 
//proceed with saving 
}else{ 
//kill it, 
die; 
} 
} 

В качестве альтернативы, вы можете легко интегрировать ваше веб-приложение с помощью этого набора защиты от перекрестных ссылок.Проверьте это here