簡體   English   中英

保護Web應用程序中的POST數據

[英]Securing POST data in web application

我有一個具有基本身份驗證的Web應用程序-用戶名,密碼,會話和其他內容。 但是,我特別需要防止用戶欺騙POST請求(甚至對於已登錄的用戶)。 在我的應用程序中,我專門在接受POST數據之前驗證用戶的會話(還要注意XSS和其他內容)。

喜歡:

if(user session exists)
{
    // handle the data POSTed
}

else {
   // ...
}

我將會話ID存儲在數據庫中。 為了防止假POST請求,我還有其他注意事項嗎?

我專門在接受POST之前驗證用戶的會話

如果您的意思通常是“會話”,即存儲在cookie中的持久性令牌,用於標識用戶和關聯的會話數據,那么,這還不夠。 該cookie由瀏覽器自動發送,即使POST請求是由另一個(攻擊者)站點引起的。

您在此處尋找的關鍵字是跨站點請求偽造或XSRF ,攻擊者可以在其中(通過腳本或其他方法)通過身份驗證的用戶向您的站點發出GET或POST請求。 此類請求通常無法與合法請求區分開。 (有些人試圖通過檢查HTTP引薦來源網址數據來做到這一點,但這是不可靠的。)

這些攻擊不會像服務器端(SQL,命令)或客戶端(HTML,JavaScript)注入那樣立即造成破壞,但是它們比這兩種注入更為普遍:不幸的是,很少有Web程序員都包含適當的對策。 直到他們的站點被XSRF漏洞破壞為止。

防御XSRF的方法多種多樣,但唯一真正有效的方法是在每個可提交的表單中包含第三方攻擊者不知道的秘密值。 正如Eimantas所提到的,這通常被稱為后置密鑰。

有多種生成此類秘密信息的方法。 一種簡單的方法是將隨機生成的代碼添加到每個用戶的帳戶詳細信息,然后將其放在表單的隱藏字段中,並檢查其是否存在於提交中。 例如在PHP中:

<form method="post" action="delete.php"><div>
    <input type="hidden" name="key" value="<?php echo(htmlspecialchars($user['key'])); ?>"/>
    <input type="submit" value="Delete" />
</div></form>

if ($_POST['key']!=$user['key'])
    // error

攻擊者不會知道該用戶的密鑰,因此無法創建包含該密鑰的鏈接/表單。

您還可以通過服務器秘密密鑰在用戶ID上使用加密哈希函數,而不用保留單獨的代碼。 使用散列,您還可以添加其他內容,例如到期時間,以便必須在特定時間范圍內提交表單。 或者,您可以生成一次性使用的交易密鑰,也可以使用該交易密鑰來確保不會兩次提交相同的表單(用於停止重復發布)。

您可以嘗試為每個發布請求生成發布密鑰。 其他種類的參數,用於顯示發布請求有效且已從頁面上的表單執行。

如果要在用戶瀏覽器中的Javascript中構建有效的POST請求,則您無法做很多事情來阻止確定的用戶向服務器提交虛假的POST。 用戶具有可用於發出POST請求的有效會話ID。 他還有權訪問所有代碼以及該代碼有權訪問以建立請求的所有其他數據。

您不能依靠瀏覽器端代碼來保護系統。 必須在服務器上強制執行安全性。 例如,對對象的所有操作都應經過身份驗證和授權。

使用驗證碼圖片。

Web建立在REST之上,根據定義,REST就是將狀態從一個點轉移到另一個點。 手上有足夠時間的人可以制作一個模擬活動會話的POST請求。

與所有安全請求一樣,驗證碼也在服務器端經過驗證。

在我當前的應用程序中,我有一些代碼發送到瀏覽器,然后瀏覽器回發,並且一定不能修改它。 我要做的是將一個秘密字符串附加到該值,獲取該完整字符串的SHA1校驗和,然后要求瀏覽器將值和校驗和都發送回去。 我很確定這也是.NET進行viewstate的方式。

如果用戶會話是長期的,那么您仍然容易受到XSRF的影響 您也需要采取措施。

如果您使用的是.NET,請查看AntiForgeryToken,

http://msdn.microsoft.com/en-us/library/dd492767.aspx

接受用戶輸入時,在將內容存儲到數據庫之前,需要執行的零級操作是確保您通過mysql_real_escape_string($ MyPostData)函數運行數據。

同樣,對於您希望通過POST接受的每個變量/數據,根據其類型以及您打算如何使用它,以編程方式對其進行驗證也是有益的。

這是確保沒有來自用戶的“滑稽”生意的兩個主要規則:確保您使用有效的變量,並確保對進入數據庫的數據進行了驗證並正確地進行了轉義。

使用您的模型(尤其是如果您使用整數作為會話ID),攻擊者可以輕松地代表另一個用戶提交請求(例如,減少您自己的會話ID,並且只要存在此會話ID,您就已經是其他人了)。 您需要具有與每個會話ID關聯的唯一會話密鑰/ GUID,並存儲在數據庫和cookie中的客戶端上。 每次客戶提交請求時,您不僅應讀取會話ID,還應讀取會話GUID,然后根據您的數據庫值對它們進行驗證。 除此之外,您可能還需要考慮一些XSRF緩解策略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM