簡體   English   中英

如何防止Unicode安全漏洞

[英]How to Protect Against Unicode Security Vulnerabilities

“每個人都應該了解的關於Unicode的五件事”是一篇博客文章,展示了如何將Unicode字符用作網站的攻擊媒介。

這種現實世界攻擊的主要示例是使用開發人員名稱中的unicode不可打印空間提交給​​Google Play商店的虛假WhatsApp應用程序,該名稱使該名稱具有唯一性並允許其通過Google的過濾器。 蒙古元音分隔符(U + 180E)就是這樣一種不可打印的空間角色。

在此輸入圖像描述

另一個漏洞是使用看起來類似的替代Unicode字符。 Mimic工具顯示了它的工作原理。

我能想到的一個例子是在注冊新用戶時保護用戶名。 您不希望兩個用戶名相同或者它們看起來相同。

你怎么防范這個? 那里有這些人物的清單嗎? 通常的做法是從所有表格輸入中刪除所有這些類型的字符嗎?

你所說的是一種同性戀攻擊。

有一個“confusables”列表中的Unicode 在這里 ,也看看這個 應該有基於這些或pontentially其他數據庫的庫。 這種庫之一是這一個 ,你可以在Java或Javascript使用。 其他語言也必須存在,或者你可以寫一個。

我認為重要的是沒有自己的數據庫 - 在良好的數據之上,庫或服務很容易做到。

至於你是否應該過濾掉類似的用戶名 - 我認為這取決於你。 如果用戶有興趣嘗試偽造彼此的用戶名,也許是的。 對於許多其他類型的數據,也許沒有必要這樣做。 除了您應該使用數據點評估應用程序中的風險之外,我認為沒有通用的最佳實踐。

對於不同的問題,另一種不同的方法,但對於Unicode輸入驗證通常可用的是正則表達式中的\\w字符,如果您的正則表達式引擎是Unicode就緒的。 在這樣的引擎中, \\w應匹配所有Unicode類的單詞字符,即。 任何語言的字母,修飾符和連接符,但沒有別的(沒有特殊字符)。 這不能防止同性戀攻擊,但可以防止一些注入,同時保持您的應用程序Unicode友好。

當您擁有已知安全值的白名單時,所有清理工作效果最佳,並排除所有其他安全值。

ASCII就是這樣一組字符。

這可以通過各種方式來解決,但是每一個都可能增加誤報的數量,從而導致合法用戶的煩惱。 此外,它們都不適用於100%的情況(即使合並)。 他們只會添加一個額外的圖層。

一種方法是使表格看起來相似,並檢查是否存在重復的名稱。 在許多情況下,“看起來相似”的含義是主觀的,因此構建此類列表可能會非常棘手。 在某些情況下,此方法可能會產生誤報。

此外,顛倒某些字母的順序可能會欺騙許多用戶。 使用諸如Jaro-Winkler和Levenshtein距離之類的算法(即,檢查是否已存在類似的用戶名/公司名稱)可以實現檢查字謎或非常相似的名稱。 然而,有時候,這可能是由於某些地區某些單詞的拼寫不同(例如,“中心”與“中心”),或某些公司的名稱可能故意包含字謎。 這種方法可能會進一步增加誤報的數量。

此外,正如喬納森所提到的,衛生處理也是一種很好的方法,但是它可能無法防止字謎並且對想要使用某些特殊字符的合法用戶造成問題。

正如OP所提到的,特殊字符也可以被剝離。 名稱的其他部分也可能需要被刪除,例如“Inc.”,“。com”等常用名稱。

最后,名稱可以限制為僅包含一種語言的字符,而不是來自不同語言的字符混合(更寬松的版本可能不允許在同一個單詞中混合使用字符 - 如果用空格分隔則允許混合使用)。 限制使用大寫第一個字母和小寫字母用於其余字母可以進一步改進這種方法,因為某些小寫字母(如'l')在使用某些字體時可能看起來像大寫字母(如'I')。 排除使用某些符號(如“|”)將進一步增強此方法。 此解決方案將增加某些無法使用某些名稱的用戶的煩惱。

也可以使用一些/所有上述方法的組合。 方法的選擇以及如何應用它們(例如,您可以選擇禁止相似的名稱,或者在名稱相似的情況下要求主持人批准,或者不采取任何行動,而只是警告主持人/管理員)取決於您嘗試解決的方案。

關於用戶名,我可能有一個創新的解決方案。 顯然,您希望允許使用ASCII字符,但在某些特殊情況下,將使用其他字符(如您所說,使用不同的語言)。

我認為一種直觀的方法是允許在用戶名中使用ASCII和其他字符,同時受到“Unicode漏洞”的保護,將是這樣的:

允許所有ASCII字符並禁止其他字符,除非用戶名中有這些特殊字符中的x個或更多 (用戶名是另一種語言)。

以此為例:

Whatsapp,Inc +(U + 180E) - 不允許,只有1個特殊字符。

элч+(U + 180E) - 允許! 它有超過x個特殊字符 (例如,3)。 它可以使用蒙古語分隔符,因為它是蒙古語。

顯然,這並不能保護您100%免受這些類型的漏洞的攻擊,但這是我一直使用的非常有效的方法,特別是如果您沒有在“登錄”或“注冊”頁面上提及此算法的存在,攻擊者可能會發現你有一個算法來保護網站免受這些類型的攻擊,但是沒有提及它,所以他們無法對其進行逆向工程並找到繞過它的方法。

對不起,如果這不是您正在尋找的答案,請分享我的想法。

編輯:或者您可以使用RNN(遞歸神經網絡)AI來檢測語言並允許該語言中的特定字符。

暫無
暫無

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

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