Разяснение по код от форума, за защита !

dakata__92

Super Moderator
Намерих този код в темата за защита на формите за изпращане на информация ! Някой може ли да ми обяни какво точно предотвратява и надежден ли е ? До колкото прочетох, проверява дали заявката е изпратена от моя домейн, а не от друго място!
PHP:
<?php
   function security_start_session($ssl, $timeout, $maxtime, $ip){
      // ... security checks
      session_start();
      session_regenerate_id(true);
      return 1;
   }
   if (security_start_session(0, 6*60, 20*60, 1) != 1){
      echo "<br>session destroyed!";
      return;
   }
?>
<html>
<head>
   <title>WorldBank.dom XSRF protected page</title>
</head>
<body>
<?php
   if( isset($_REQUEST['submit'])){
      if (($_SESSION['token']!=$_POST['token']) || (!isset($_SESSION['token'])) || (!isset($_POST['token']))){
         session_unset();
         session_destroy();
         echo "Invalid session</body></html>";
         return;
      }
      else{
         echo 'Form is submitted';
      }
   }
   else{
      echo '<form action=".php" method="POST">';
      $_SESSION['token'] = uniqid(rand(), true);
      echo '<input type="hidden" name="token" value="'.$_SESSION['token'].'">';
      echo '<input type="submit" name="submit">';
      echo '</form><br><br><br>';
   }
?>
</body></html>
 
Хмм. Това създава на човека който е влезнал в сайта, една сесия.

Тази сесия се записва в hidden поле, което после при submit се проверява дали стойноста която е създадена при входа на сайта е равна на тази която минава през формата.



Тоест, предполагам трябва да означава всичко това - За да пратиш информацията през формата, задължително трябва да си влезнал в сайта.


Пример:

Правя форма на моят localhost -

Код:
<form method='post' action='tvoqt_domein.com'>

</form>

И сега като се опитам да пратя информация от моят localhost към твоят сайт, без да съм влезнал в него. Няма как да стане, защото нямам сесията от сайта, следователно няма да мина проверката и информацията която съм пратил няма да се запише никъде.
 
А как мога да защитя сесията, понеже това както го казваш за скрит инпут не пречи да се копира от value в сорса и да се подаде на "бота" на локалния хост . Примерно с md5 хеширане пак я копирам и качвам разбирасе оставям страницата отворена за да е валидна сесията или пак не преминавам проверката ?
 
Естествено, че не преминава проверката. Сесията е пусната от името на другия домейн, няма как ти да пуснеш сесията от тяхното име ... може и да става това нещо, но се иска много умения предполагам.
 
Извинявам се за повторният пост.
Но сега ти прочетох последният пост, целият.

Виж ти може да пуснеш тази сесия да работи и да копираш числата от инпута и да ги сложиш при теб, вярно е. Но това означава, че при всяко пращане ти ще трябва да копираш числата от формата. В крайна сметка - Защо просто не използваш формата която са ти дали, а трябва през твоята форма да ги пращаш ...

Ако позлаваш този код, замени:

Защото иначе ще ти изтрии всички сесси към твоят сайт при пращане на формата. Тоести и login сесии и там разни други.

PHP:
 session_destroy();

с


Така само ще ти изтрии сесията от формата.
PHP:
unset($_SESSION['token']);
 
Имам нужда от едно pазяснение коlко вpеме е ваlидна сесията сlед създаването и и пpи какво усlовие се унищожава :)
 
Когато се затвори браузера се унищожава сесията.

Може да и бъде задедено и времетраене, но затвори ли се браузера се унищожава автоматично.
 
Значи немога да разбера ето тазе функция какво точно прави и проверката под нея на какъв принцип е и какви са тези цифри които се умножават ? Айде самата функция подава session_start(); Но проверката за изтриване не ми вдъхва доверие, ако може малко като по-разбиращ да промениш нещата, че ми се струва малко не изпипано :?
Код:
<?php   
function security_start_session()
{     
	// ... security checks      
	session_start();      
	session_regenerate_id(true);      
	return 1;   
}   
if (security_start_session(0, 6*60, 20*60, 1) != 1)
{      
	echo "<br>session destroyed!";     
	return;   
}
?>
Интересното е че като пробвам да отправя атака към страницата ми изписва Invalid session, но и една забележка на локалния която незнам как да премахна:

Notice: Undefined index: token in C:\xampp\htdocs\Sait\bbcode\md5.php on line 23

if (($_SESSION['token']!=$_POST['token']) || (!isSet($_SESSION['token'])) || (!isSet($_POST['token'])))

Ето как съм подредил и кода аз:
Код:
<?php   
function security_start_session()
{     
	// ... security checks      
	session_start();      
	session_regenerate_id(true);      
	return 1;   
}   
if (security_start_session(0, 6*60, 20*60, 1) != 1)
{      
	echo "<br>session destroyed!";     
	return;   
}
?>
<html>
<head>   
<title>WorldBank.dom XSRF protected page</title>
</head>
<body>
<?php   
if( isSet($_POST['submit']))
{      
	if (($_SESSION['token']!=$_POST['token']) || (!isSet($_SESSION['token'])) || (!isSet($_POST['token'])))
	{ 
		session_unset();         
		session_destroy();         
		echo "Invalid session</body></html>";        
		return;      
	} 
	else
	{     
		echo 'Izpratena';      
	}   
}   
else
{     
	echo '<form action="" method="POST">';      
	$_SESSION['token'] = uniqid(rand(), true);      
	echo '<input type="hidden" name="token" value="'.$_SESSION['token'].'">';      
	echo '<input type="submit" name="submit">';     
	echo '</form><br><br><br>';   
}
?>
</body>
</html>
 

Горе