簡體   English   中英

實現服務器發送事件時如何有效處理換行漏洞利用?

[英]How to efficiently handle the line break exploit when implementing server sent events?

在應用程序服務器上實現服務器發送事件時,您可以終止消息並通過以兩個換行符結束它來發送它: \\n\\n ,如本文檔頁面所示

那么,如果您接收用戶輸入並將其轉發給所有感興趣的各方(這在聊天應用程序中是典型的)怎么辦? 惡意用戶能否不在其有效負載中插入兩個換行符來提前終止消息? 更重要的是,既然他們可以訪問一行的第一個字符,那么他們是否可以不設置特殊字段,例如idretry字段?

似乎唯一的選擇是掃描它們的整個有效載荷,然后用\\ndata:類的東西替換\\n實例,這樣它們的整個消息有效載荷必須保持其在data標簽中的位置。

然而,這不是非常低效嗎? 必須掃描每條消息的整個消息有效載荷,然后可能進行替換,不僅涉及掃描每個完整的有效載荷,還涉及在惡意的情況下重新分配。

或者有其他選擇嗎? 我目前正在嘗試在 websockets 和 SSE 之間做出決定,因為它們非常相似,這個問題讓我對 WebSockets 有了更多的了解,因為感覺如果它們能夠避免這種潛在的漏洞,效率會更高。

編輯:澄清一下,我對是否有辦法繞過\\n\\n完整掃描每條消息,我幾乎一無所知。 如果沒有,WebSockets 是否有同樣的問題,您需要完整掃描每條消息? 因為如果是這樣,那就無所謂了。 但如果情況並非如此,那么似乎有利於在 SSE 上使用 websockets。

如果您正確編碼用戶數據,則不需要掃描有效負載。 使用 JSON,在服務器發送的事件中使用“數據”字段是安全的,因為 JSON 解碼換行符並默認控制字符,如 RFC 所述:

字符串的表示類似於 C 系列編程語言中使用的約定。 字符串以引號開始和結束。 所有 Unicode 字符都可以放在引號內,但必須轉義的字符除外:引號、反斜線和控制字符(U+0000 到 U+001F)。

https://tools.ietf.org/html/rfc7159#page-8

重要的是,沒有人偷偷插入換行符,但這對於服務器發送的事件來說並不陌生,標頭由一個新行分開並且也可以被篡改(如果編碼不正確)請參見https://www.owasp.org/ index.php/HTTP_Response_Splitting

這是使用 json 編碼的服務器發送應用程序的示例: https ://repl.it/@BlackEspresso/PointedWelloffCircles 即使允許換行符,您也不應該篡改數據字段

編碼不會阻止您使用服務器端事件,但 websockets 和 sse 之間存在重大差異。 有關比較,請參閱此答案: https : //stackoverflow.com/a/5326159/1749420

除非我遺漏了一些明顯的東西,否則在 Web 開發中清理輸入是很常見的事情。

由於您共享的來源明確提到了一個 PHP 示例,因此我只是在這里進行了一些研究和查找:

https://www.php.net/manual/en/filter.filters.sanitize.php

FILTER_SANITIZE_SPECIAL_CHARS

HTML-escape '"<>& 和 ASCII 值小於 32 的字符,可選擇去除或編碼其他特殊字符。

和:

'\n' = 10 = 0x0A = line feed

所以我不確定我是否理解為什么您會認為將某些輸入轉換為字符實體必然是一件壞事。
避免用戶通過上傳不需要的輸入來濫用系統是清理的目的。

暫無
暫無

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

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