2016-09-13 47 views
-1

假設我們有這樣這是跨站點形式注入的安全解決方案嗎?

<?php 
session_start(); 
$_SESSION['token'] = rand(0, 6000000); 
echo ' 
<form method="post" action="submit.php/?token='.$_SESSION['token'].'"> 
... 
</form> 
'; 
?> 

一種形式,表單處理程序submit.php

<?php 
if($_GET['token'] == $_SESSION['token']) { 
//form is valid, do stuff 
} else { 
header("Location: index.php"); 
//give the attacker boot 
} 
?> 

有沒有辦法這種形式可以通過運行一個表單提交請求http://somesite.com/submit.php?token=non-genuine-number第三方僞造網站?我們不是在討論如何欺騙管理員點擊真正網站上的鏈接中間表單版本,當生成令牌的$_SESSION數據並且可能被欺騙但沒有正確的會話數據的用戶。

+0

在6000001中1,我猜想。 – Blake

+0

@Blake究竟如何? AFAIK沒有辦法從第三方網站爲目標網站生成$ _SESSION數據,所以即使他們設法弄清楚它可能是基於會話的,但條件會評估爲false,因爲真正的$ _SESSION ['token']是真實的網站將是空的,正如我所說的,只有這樣我才能想到的是,如果有人通過編輯表格中途欺騙了管理員,然後正確猜測/獲取他的會話標記 –

回答

0

從安全角度來看,它不會被認爲是安全的。

攻擊者可以假設(甚至觀察)用戶何時下載表單,並在正確的時間發起攻擊。他還需要選擇一個從6000000中選擇的數字,熵似乎是22.5位,但實際上它甚至更少,因爲rand()不是加密安全的(與random_bytes()或random_int() )或者從Linux上的/ dev/urandom讀取)。因此,儘管實際利用它可能不是微不足道的,但任何安全代碼審查都會發現它是一個缺陷,因爲它違背了最佳實踐。

編輯:

你可以提高做兩個簡單的事情很多(實際上正確地實現同步標記模式)的解決方案:

  • 使用像random_bytes安全PRNG()

  • 增加熵很多

如果您生成的令牌像bin2hex(random_bytes(16)),那會好很多。

編輯2:

一件事的挑剔。最好不要在URL中發送令牌,因爲URL參數會在所有類型的地方記錄下來,攻擊者可能會從中抓取它。但是,如果它是一次性令牌(每個頁面請求都會生成一個新的請求),則可以稍微降低風險。 OWASP和其他人建議使用隱藏的表單字段仍然會更好。

+0

所以你說,如果我不是NASA,沒有人會打擾,我在柵欄安全的一面?通過我的解決方案,有沒有一種方法可以改進它?快速的方法是增加一些更大的rand數的熵。 –

+0

我想說這可能很難被利用,但我並沒有在利用這些東西方面經驗豐富。我想如果我更好地理解rand()在PHP中的工作原理,它甚至可以非常容易(或者不,我不知道prng有多好)。 我會編輯我的答案,建議一些簡單的修復,實際上會使這更安全。 –

+0

我還認爲,由於攻擊者必須在正確的機會窗口中暴露出幾千至多600萬次的請求才能暴力破解,所以紅旗很快會出現在服務器上,因爲這是一個很多請求並不正常。 –