owasp json - PHPF中的CSRF(跨站點請求偽造)攻擊示例和預防




csrf_token xsrf (4)

我有一個網站,人們可以這樣投票:

http://mysite.com/vote/25

這將對項目25進行投票。我想只為註冊用戶提供此選項,並且只有他們想要這樣做。 現在我知道有人在網站上忙碌,有人給他們這樣的鏈接:

http://mysite.com/vote/30

然後投票將是他在項目上的地方,而他不想這樣做。

我已經閱讀了OWASP網站上解釋 ,但我真的不明白

這是CSRF的一個例子,我該如何防止這種情況發生。 我能想到的最好的事情就是像哈希一樣在鏈接中添加一些內容。 但是,在所有鏈接的末尾添加一些東西會非常惱火。 沒有其他方法可以做到這一點。

另一件事可能有人可能會給我一些其他的例子,因為這個網站對我來說似乎是相當神聖的。


Answers

如果符合以下條件,這可能成為CSRF的一個例

  • 獲取該鏈接(例如,通過<img>標籤) :偽造
  • 從另一個站點:跨站點


例如,如果我可以在stackoverflow的HTML源代碼中註入此<img>標記(我可以,因為stackoverflow允許在他的帖子中使用<img>標記)

<img src="http://mysite.com/vote/30" />

你只需投票支持該項目;-)


通常使用的解決方案是在URL中放置生命週期有限的令牌,並在獲取URL時檢查此令牌是否仍然有效。

基本想法是:

  • 生成頁面時:
    • 生成一個唯一的令牌
    • 將其存儲在用戶的會話中
    • 並將其放在頁面的鏈接中 - 看起來像這樣: http://mysite.com/vote/30?token=AZERTYUHQNWGSThttp://mysite.com/vote/30?token=AZERTYUHQNWGST
  • 調用投票頁面時:
    • 檢查URL中是否存在令牌
    • 檢查它是否存在於用戶的會話中
    • 如果不=>不註冊投票

這個想法是:

  • 令牌沒有很長的使用壽命,很難猜測
  • 這意味著你的攻擊者
    • 只有幾分鐘的窗口,在此期間他的注射將有效
    • 必須善於猜測^^
    • 必須為每個用戶生成不同的頁面。


此外,請注意,用戶會話離開您的網站後保持活動的時間越短,訪問不良網站時仍然有效的風險就越小。

但在這裡,您必須在安全性和用戶友好性之間做出選擇......


另一個想法(那不是非常安全,但有助於反對傢伙不知道如何強制POST請求) ,只會在人們投票時接受POST請求:

  • 瀏覽器正在發送注入標籤的GET請求
  • 由於此URL正在修改某些數據,無論如何,它不應該與GET一起使用,而只能與POST一起使用

但請注意,這不是完全安全的:它可能(可能?)可能強制/偽造一個POST請求,有點Javascript。


首先,不應該使用GET請求來改變服務器上的狀態,因此對於您的投票服務,我建議使用POST / PUT。 這只是一個指導方針,而是一個切肉刀。

因此,對於您的問題,CSRF是一個客戶端問題,因此您使用何種服務器語言並不重要(在您的情況下為PHP)。 標準修復是相同的,如下所示:在URI / POST數據中有一個隨機值,在Cookie標頭中有相同的值。 如果這些匹配你可以確定沒有CSRF。 有關如何在上完成此操作的信息很多,例如。 這個
祝你好運!



遞增/遞減運算符

++增量運算符

--遞減運算符

Example    Name              Effect
---------------------------------------------------------------------
++$a       Pre-increment     Increments $a by one, then returns $a.
$a++       Post-increment    Returns $a, then increments $a by one.
--$a       Pre-decrement     Decrements $a by one, then returns $a.
$a--       Post-decrement    Returns $a, then decrements $a by one.

這些可以在變量之前或之後進行。

如果放在變量之前,則首先對變量執行遞增/遞減操作,然後返回結果。 如果放在變量之後, 首先返回變量,然後完成遞增/遞減操作。

例如:

$apples = 10;
for ($i = 0; $i < 10; ++$i) {
    echo 'I have ' . $apples-- . " apples. I just ate one.\n";
}

實例

在上面的情況下使用++$i ,因為它更快。 $i++會有相同的結果。

預增量稍微快一點,因為它確實增加了變量,然後'返回'結果。 後增量創建一個特殊變量,在那裡複製第一個變量的值,並且只有在使用第一個變量之後,才用第二個變量替換它的值。

但是,您必須使用$apples-- ,因為首先,您要顯示當前的蘋果數, 然後您想從中減去一個蘋果。

您還可以在PHP中增加字母:

$i = "a";
while ($i < "c") {
    echo $i++;
}

一旦達到zaa就是下一個,依此類推。

請注意,字符變量可以遞增但不遞減,即使只支持純ASCII字符(az和AZ)。

帖子:





php csrf owasp