Защита от подмены с помощью 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>