Как запретить отправку формы с локального хоста на сервер - PullRequest
3 голосов
/ 21 ноября 2011

Я гуглил это в течение двух дней, и я просто не могу найти ничего, описывающего следующую проблему:

Допустим, у меня есть следующая форма на "www.example.com":

<form action="formProcessor.htm" method="post">
  <input name="field1" value="abc" />
  <input name="field2" value="123" />
  <input name="field3" value="etc" type="hidden" />
  <input value="Submit" type="submit" />
</form>

Меня беспокоит то, что если кто-то создаст локальный файл, имитирующий эту форму, заполнит все значения вручную, а затем отправит его по адресу

Вопрос № 1: Есть ли способ предотвратить это?

Вопрос № 2: Считается ли это так называемым CSRF?

Я знаю, что вы можете попытаться проверить REFERRER, но я также знаю, что это легко подделать (просто посмотрите на дополнение FF "edit header").

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

Mark

Ответы [ 2 ]

4 голосов
/ 21 ноября 2011

Да, это Подделка межсайтовых запросов .

Вы можете предотвратить это, создав одноразовый ключ и сохранив его в скрытом элементе ввода в вашей форме примерно так:

<?php

$_SESSION['formkey'] = md5(rand() . time() . $_SERVER['REMOTE_ADDR']);

...

<input type="hidden" name="formkey" value="$_SESSION['formkey']" />

?>

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

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

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

1 голос
/ 01 сентября 2012

Используйте следующее / подобное на странице формы (php):

session_start();
if (empty($_SESSION['formkey'])) {
$_SESSION['formkey'] = time() . "-" . getmypid() . "-" . rand(0, mt_getrandmax());
}

установить скрытое поле формы в вашей форме:

<input type="hidden" name="formkey" value="<?php echo $_SESSION['formkey']; ?>" />

А затем на странице обработки / обработки:

if ($_SESSION['formkey'] !== $_POST['formkey']) {
header("Location: formpage.php?blankfields");
exit();
}

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

...