Задать вопрос

Защита от отправки POST запроса со стороннего сайта

Здравствуйте!

Возник вопрос следующего содержания, есть ли такая функция или тег php, при котором если запрос сделан с site.ru, то есть настоящего, показывал хэш к примеру, site.ru48269405487746, а если отправляли с сайта othersite.ru на php обработчик сайта site.ru, показывал бы другой хэш.
  • Вопрос задан
  • 8588 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 2
MonkAlbino
@MonkAlbino
Фронтенд разработчик
Я так понимаю, что вам надо запретить отправку POST'ом данных из всех форм, кроме расположенной у вас на сайте.
@SpaceBike выше почти правильно вам указал, что сделайте скрытое поле, значение которого будет генерироваться PHP в зависимости от пришедших параметров пользователя (HTTP-заголовки, Cookie, User-Agent и т.д.). Туда же можно добавить некую "соль" - случайно сгенерированный параметр, но его надо будет хранить, чтобы использовать потом.
В форму:
<input
	type='hidden'
	name='security'
	value='<?php
		echo md5(
			$_SERVER['REMOTE_ADDR'] .
			$_SERVER['HTTP_USER_AGENT']
		);
	?>'
/>

В обработчике POST-запросов:
<?php
	$valid = md5(
			$_SERVER['REMOTE_ADDR'] .
			$_SERVER['HTTP_USER_AGENT']
		);
	if($POST['security'] == $valid) {
		// хороший
	} else {
		// плохой
	};
?>


Таким образом, чтобы отправить POST-запрос с внешнего сайта или автоматическим скриптом, им надо будет эмулировать браузер: скачать страницу с вашего сайта, взять скрытые параметры (их может быть несколько) и отправлять свои запросы с ними. На моей практике 95% автоматических скриптов этого не делают. Понятно, что это не идеальная панацея. Можно добавить некий скрытый параметр через Javascript, тоже каким-нибудь мудрёным алгоритмом. Автоматика вряд ли будет исполнять js в момент скачивания, а если будет, то защищаться надо будет другой проверкой на робота.
Ответ написан
Комментировать
Вот у вас есть форма
<html>
<form>
блаблабла...
<input type = 'hidden' name 'security' value = '<?php echo md5('site.ru'.$config->securitykey) ?>' />
блаблабла
</form>
</html>

А потом проверяешь:
<?php
if($POST['security'] == md5('site.ru'.$config->securitykey)) {
 echo 'Всё норм:)';
} else die('Всё плохо:C');
?>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы