簡體   English   中英

Javascript XSS 預防

[英]Javascript XSS Prevention

有一個 Node.js 項目可以清理數據,還有一個用於處理清理以防止 XSS 的 JavaScript 的 OWASP 庫。

我一直在對這些庫進行基准測試,它們非常密集,可能有點矯枉過正,我的應用程序不需要任何動態 HTML(由用戶、bbtags 或其他任何東西提交,根本不需要)所以為什么不這樣做:

  1. 禁用“ < ”和“ > ”字符,不要替換它們或任何東西,只是禁用它們,如果用戶提交這些,給他們一個警告,這些被禁用(客戶端和服務器端驗證)
  2. & => &amp;
  3. " => &quot;
  4. ' => &#x27;
  5. / => /
  6. 對提交的 URL 進行編碼(GET 參數等)
  7. 由於我的應用程序使用 HTML5 PushState 並且后端與前端完全分離,因此涵蓋了基於 DOM 的 XSS。

這是否足以保護我自己,正如我所說,我的應用程序不需要用戶提交任何 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, "&lt;").replace(gt, "&gt;").replace(ap, "&#39;").replace(ic, "&#34;");

如果您的用戶沒有向您的服務器提交任何內容,您甚至不需要上述內容。 如果用戶提交並且您正在使用用戶輸入,則上述內容應該是安全的。 只要 '<' 和 '>' 是全局消毒的並且括號也是你的好去處。

為什么不在將數據發送到客戶端之前使用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, '&amp;')
        .replace(/\</g, '&lt;')
        .replace(/\>/g, '&gt;')
        .replace(/\"/g, '&quot;')
        .replace(/\'/g, '&#x27')
        .replace(/\//g, '&#x2F');
}

還要確保僅在必要時使用此功能,否則可能會破壞某些東西。

但我建議您查看已制作的用於清理輸出的庫:

https://github.com/ecto/bleach

您可以使用類似的功能

 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.

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