我有一個提交表單的php頁面。
我想添加一個支票,我可以停止基本的跨站點僞造。防止欺騙形式
我的代碼:
<?php
session_start();
(...) //some code
$secret = substr(md5(uniqid(rand(), true)), 1, 2);
$_SESSION["secret"] = $secret;
$auth = $secret;
?>
(...)
<form id="form" name="form" action="<?php echo htmlentities($_SERVER[PHP_SELF]); ?>" method="post">
(...)
<input type="hidden" name="id" value="<? echo $auth; ?>" />
(...)
<?php
(...)
//as a debug I just tried to display
echo $_POST["id"];
echo "=";
echo $_SESSION["secret"];
(...)
?>
<div>
</body>
</html>
但兩者id
和secret
永遠不會返回相同的值。
這是爲什麼?我錯過了什麼?
UPDATE
所以,我想在這裏由塞繆爾·庫克的回答一樣,也由Jon斯特林的評論所說:
if(!isset($_SESSION["secret"])){
$secret = substr(md5(uniqid(rand(), true)), 1, 2);
$_SESSION["secret"] = $secret;
$auth = $secret;
}
但現在如果沒有$_SESSION["secret"]
該頁返回:
<input type="hidden" name="id" value="" />
我明白爲什麼,因爲祕密只有在會話變量存在時才被設置。
有什麼建議嗎?
UPDATE
移動的檢查產生一個新的會話密鑰之前,如果有ID的職位是隻檢查。 現在效果很好謝謝。
是因爲您在頁面頂部重新生成$ secret並將其分配給會話? –