[英]Javascript XSS Prevention
有一個 Node.js 項目可以清理數據,還有一個用於處理清理以防止 XSS 的 JavaScript 的 OWASP 庫。
我一直在對這些庫進行基准測試,它們非常密集,可能有點矯枉過正,我的應用程序不需要任何動態 HTML(由用戶、bbtags 或其他任何東西提交,根本不需要)所以為什么不這樣做:
<
”和“ >
”字符,不要替換它們或任何東西,只是禁用它們,如果用戶提交這些,給他們一個警告,這些被禁用(客戶端和服務器端驗證)&
=> &
"
=> "
'
=> '
/
=> /
這是否足以保護我自己,正如我所說,我的應用程序不需要用戶提交任何 HTML,所以我根本不需要<
和>
標簽。
感謝所有反饋,這是我現在使用的:
var pattern = /<(.*)>/;
function hasHtmlTags(string) {
return pattern.test(string);
};
if (hasHtmlTags(userData)) {
// Do something?
} else {
// Create entity.
}
所以用戶仍然可以使用他們的表情符號 :< 等,並且只有在找到 < 和 > 的組合時才會觸發該功能。 所以沒有昂貴的正則表達式之類的,只需禁用 < 和 > 組合,我們應該沒問題。
這是一個通用的編碼過程:
var lt = /</g,
gt = />/g,
ap = /'/g,
ic = /"/g;
value = value.toString().replace(lt, "<").replace(gt, ">").replace(ap, "'").replace(ic, """);
如果您的用戶沒有向您的服務器提交任何內容,您甚至不需要上述內容。 如果用戶提交並且您正在使用用戶輸入,則上述內容應該是安全的。 只要 '<' 和 '>' 是全局消毒的並且括號也是你的好去處。
為什么不在將數據發送到客戶端之前使用encodeURIComponent
呢?
var string="<script>...</script>";
string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3
考慮到https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
這是他們建議的實施:
function escapeOutput(toOutput){
return toOutput.replace(/\&/g, '&')
.replace(/\</g, '<')
.replace(/\>/g, '>')
.replace(/\"/g, '"')
.replace(/\'/g, ''')
.replace(/\//g, '/');
}
還要確保僅在必要時使用此功能,否則可能會破壞某些東西。
但我建議您查看已制作的用於清理輸出的庫:
您可以使用類似的功能
function htmlEncode(str){
return String(str).replace(/[^\w. ]/gi, function(c){
return '&#'+c.charCodeAt(0)+';';
});
}
然后,您將按如下方式使用此函數:
<script>document.body.innerHTML = htmlEncode(untrustedValue)</script>
如果您的輸入在 JavaScript 字符串中,則需要一個執行 Unicode 轉義的編碼器。 這是一個示例 Unicode 編碼器:
function jsEscape(str){
return String(str).replace(/[^\w. ]/gi, function(c){
return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
});
}
然后,您將按如下方式使用此函數:
<script>document.write('<script>x="'+jsEscape(untrustedValue)+'";<\/script>')</script>
更多信息: https : //portswigger.net/web-security/cross-site-scripting/preventing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.