Защита HTML формы от подмены 


Защита HTML формы от подмены

Опубликовано

 

 Методы защиты от подмены формы

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