php表單防止重複提交(防csrf漏洞)

來源:互聯網
上載者:User
這篇文章介紹的內容是關於php表單防止重複提交(防csrf漏洞) ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Token淺談

Token,就是令牌,最大的特點就是隨機性,不可預測。一般駭客或軟體無法猜測出來。

那麼,Token有什麼作用?又是什麼原理呢?

Token一般用在兩個地方——防止表單重複提交、anti csrf攻擊(跨網站請求偽造)。

兩者在原理上都是通過session token來實現的。當用戶端請求頁面時,伺服器會產生一個隨機數Token,並且將Token放置到session當中,然後將Token發給用戶端(一般通過構造hidden表單)。下次用戶端提交請求時,Token會隨著表單一起提交到伺服器端。

然後,如果應用於“anti csrf攻擊”,則伺服器端會對Token值進行驗證,判斷是否和session中的Token值相等,若相等,則可以證明請求有效,不是偽造的。

不過,如果應用於“防止表單重複提交”,伺服器端第一次驗證相同過後,會將澀session中的Token值更新下,若使用者重複提交,第二次的驗證判斷將失敗,因為使用者提交的表單中的Token沒變,但伺服器端session中Token已經改變了。

上面的session應用相對安全,但也叫繁瑣,同時當多頁面多請求時,必須採用多Token同時產生的方法,這樣佔用更多資源,執行效率會降低。因此,也可用cookie儲存驗證資訊的方法來代替session Token。比如,應對“重複提交”時,當第一次提交後便把已經提交的資訊寫到cookie中,當第二次提交時,由於cookie已經有提交記錄,因此第二次提交會失敗。

不過,cookie儲存有個致命弱點,如果cookie被劫持(xss攻擊很容易得到使用者cookie),那麼又一次gameover。駭客將直接實現csrf攻擊。

1.首先防範xss攻擊

2.驗證referrer

3.重要cookie設定https only ,比如token

4.使用簽名,令牌

5.get只用於查詢資訊

6.表單提交用post

7.謹慎使用跨指令碼注入

所以,安全和高效相對的。具體問題具體對待吧。


php表單加入Token防止重複提交

原理在於產生一個隨機字串放在session裡,提交表單後來驗證這個字串,可以做到防止他人自己寫form來欺騙提交,重複提交或者雙擊提交。

簡單的用php實現的代碼如下:


<?php/** PHP簡單利用token防止表單重複提交* 此處理方法純粹是為了給初學者參考*/session_start();function set_token() {  $_SESSION['token'] = md5(microtime(true));}function valid_token() {  $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false;  set_token();  return $return;}//如果token為空白則產生一個tokenif(!isset($_SESSION['token']) || $_SESSION['token']=='') {  set_token();}if(isset($_POST['test'])){  if(!valid_token()){    echo "token error";  }else{    echo '成功提交,Value:'.$_POST['test'];  }}?><form method="post" action="">  <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>">  <input type="text" name="test" value="Default">  <input type="submit" value="提交" /></form>


上面的比較簡單一點的方法,下面的代碼更加安全一點。

Token.php


<?php/* * Created on 2013-3-25 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */function getToken($len = 32, $md5 = true) {  # Seed random number generator  # Only needed for PHP versions prior to 4.2  mt_srand((double) microtime() * 1000000);  # Array of characters, adjust as desired  $chars = array (    'Q',    '@',    '8',    'y',    '%',    '^',    '5',    'Z',    '(',    'G',    '_',    'O',    '`',    'S',    '-',    'N',    '<',    'D',    '{',    '}',    '[',    ']',    'h',    ';',    'W',    '.',    '/',    '|',    ':',    '1',    'E',    'L',    '4',    '&',    '6',    '7',    '#',    '9',    'a',    'A',    'b',    'B',    '~',    'C',    'd',    '>',    'e',    '2',    'f',    'P',    'g',    ')',    '?',    'H',    'i',    'X',    'U',    'J',    'k',    'r',    'l',    '3',    't',    'M',    'n',    '=',    'o',    '+',    'p',    'F',    'q',    '!',    'K',    'R',    's',    'c',    'm',    'T',    'v',    'j',    'u',    'V',    'w',    ',',    'x',    'I',    '$',    'Y',    'z',    '*'  );  # Array indice friendly number of chars;  $numChars = count($chars) - 1;  $token = '';  # Create random token at the specified length  for ($i = 0; $i < $len; $i++)    $token .= $chars[mt_rand(0, $numChars)];  # Should token be run through md5?  if ($md5) {    # Number of 32 char chunks    $chunks = ceil(strlen($token) / 32);    $md5token = '';    # Run each chunk through md5    for ($i = 1; $i <= $chunks; $i++)      $md5token .= md5(substr($token, $i * 32 - 32, 32));    # Trim the token    $token = substr($md5token, 0, $len);  }  return $token;}?>


form.php


<?phpinclude_once("token.php");$token = getToken();session_start();$_SESSION['token'] = $token;?><form action="action.php" method="post"<input type="hidden" name="token" value="<?=$token?>" /><!-- 其他input submit之類的 --></form>


action.php



<?phpsession_start();if($_POST['token'] == $_SESSION['token']){  unset($_SESSION['token']);  echo "這是一個正常的提交請求";}else{  echo "這是一個非法的提交請求";}?>


相關推薦:

php表單name值用變數表示的問題

php表單檔案iframe非同步上傳執行個體詳解



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.