2011-05-15 70 views
4

我有一個簡單的表單,並且想要驗證發佈的值是否來自該表單的目錄,而不是來自外部源。表格安全。確保它不是來自外部源

<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST"> 
    <input type="text" name="post" id="post" /> 
    <input type="submit" name="submit" id="submit" /> 
</form>  

我是否需要在會話中存儲某些內容?一個簡單的例子會非常有幫助。謝謝。

+0

設置窗體上的隱藏字段與每個負載設置一個隨機值,多數民衆贊成,但如果表單提交,或使用CAPCHA相比。 – 2011-05-15 15:51:34

+0

或用javascript轉義隱藏表單,所以一個機器人需要先將其忽略掉 – 2011-05-15 15:55:04

回答

3

在創建表格,你可以使用:

<?php 
    session_start(); // don't forget that you need to call before output (place first, or use ob_start() 
    $_SESSION['formhash'] = md5(date('Y-m-d H:i:s').'2fiaSFI#T8ahugi83okkj'); 
?> 
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST"> 
<input type="text" name="post" id="post" /> 
<input type="hidden" name="hash" id="hash" value="<?php echo $_SESSION['formhash']; ?>" /> 
<input type="submit" name="submit" id="submit" /> 
</form> 

你需要檢查時,有人張貼的職位要求有正確的哈希值。你可以使用:

<?php 
    session_start(); // don't forget that you need to call before output (place first, or use ob_start() 
    if (isset($_SESSION['formhash']) && isset($_POST['hash']) && $_SESSION['formhash']==$_POST['hash']) { 
     // treat $_POST 
    } 
?> 
+0

嗯,我可以用手工製作的請求發送formhash。忘記它,OP要求的是不可能的。 – tex 2011-05-15 15:51:12

+0

@tex我不確定我明白你的意思。 OP要求提供一份確保沒有其他表格被使用的表格。用我的例子,這成爲可能。每個客戶必須擁有正確的會話cookie和表單。如果您訪問外部網站,比如'example.com'而不是'mywebserver.com',則任何到mywebserver.com的POST請求將被第二個代碼塊中第3行的if子句忽略。如果我錯了,請詳細解釋一下。 – AndersTornkvist 2011-05-15 15:57:09

+0

@tex但你會如何得到散列?這基本上是[CSRF token stuff](http://shiflett.org/articles/cross-site-request-forgeries),其目標是防止*任意* POST請求。如果攻擊者有能力去這個表單,抓取這個令牌,然後*提交一個錯誤的請求,那麼就有更大的問題需要擔心了。 – sdleihssirhc 2011-05-15 15:57:27