Защита от подмены с помощью HTTP REFERER
Принцип защиты заключается в проверке домена, с которого отсылается форма, с помощью суперглобального массива $_SERVER["HTTP_REFERER"].
<?php
if ($_POST["Submit"]){
//Защита от подмены с помощью суперглобального массива $_SERVER["HTTP_REFERER"]
if (!preg_match("/^(http://".$_SERVER["HTTP_HOST"]."/)(.*?)+$/",$_SERVER["HTTP_REFERER"],$matches)){
print "Заблокировать, страница запущена с чужого домена";
}
}
?>
<form name=”Form1” method=”POST”>
<input type=”text” name=”text”>
<input type=”submit” name=”Submit”>
</form>
Защита от подмены с помощью прошивки формы сессией
Защита с помощью сессий, заключается во внедрении в форму скрытого элемента, и присваивании ему уникального значения, которое будем сверять с сессией, в момент обработки формы.
<?php session_start();
if ($_POST["Submit"]){
//Защита от подмены с помощью сессий
if ($_SESSION["verify"]<>$_POST["verify"]){
print "Заблокировать, сессия не совпадает со значением из скрытого элемента формы";
}
unset($_SESSION["verify"]);
}
?>
<form name="Form1" method="POST">
<?php
//Создание сессии, и присваивание ей уникального значения
$_SESSION["verify"]=md5(uniqid(rand(),1));
//Создание скрытого элемента формы, и присваивание ему значения сессии
print "<input type="hidden" name="verify" value="{$_SESSION["verify"]}" />";
?>
<input type="text" name="text">
<input type="submit" name="Submit">
</form>
Подведем итоги
Выше были рассмотренны два способа, как самостоятельные, независящие друг от друга. Однако соединяя их воедино, вы получаете неплохую защиту от подмены формы.
<?php session_start();
if ($_POST["Submit"]){
//Защита от подмены с помощью суперглобального массива $_SERVER["HTTP_REFERER"]
if (!preg_match("/^(http://".$_SERVER["HTTP_HOST"]."/)(.*?)+$/",$_SERVER["HTTP_REFERER"],$matches)){
print "Заблокировать, страница запущена с чужого домена";
}
//Защита от подмены с помощью сессий
if ($_SESSION["verify"]<>$_POST["verify"]){
print "Заблокировать, сессия не совпадает со значением из скрытого элемента формы";
}
unset($_SESSION["verify"]);
}
?>
<form name="Form1" method="POST">
<?php
//Создание сессии, и присваивание ей уникального значения
$_SESSION["verify"]=md5(uniqid(rand(),1));
//Создание скрытого элемента формы, и присваивание ему значения сессии
print "<input type="hidden" name="verify" value="{$_SESSION["verify"]}" />";
?>
<input type="text" name="text">
<input type="submit" name="Submit">
</form>