JavaScript 原生 DOM API 的安全操作

2021-05-31 14:22 更新

1.1.1【必須】HTML標(biāo)簽操作,限定/過濾傳入變量值

  • 使用innerHTML=outerHTML=、document.write()、document.writeln()時,如變量值外部可控,應(yīng)對特殊字符(&, <, >, ", ')做編碼轉(zhuǎn)義,或使用安全的 DOM API 替代,包括:innerText=

  1. // 假設(shè) params 為用戶輸入, text 為 DOM 節(jié)點
  2. // bad:將不可信內(nèi)容帶入HTML標(biāo)簽操作
  3. const { user } = params;
  4. // ...
  5. text.innerHTML = `Follow @${user}`;
  6. // good: innerHTML操作前,對特殊字符編碼轉(zhuǎn)義
  7. function htmlEncode(iStr) {
  8. let sStr = iStr;
  9. sStr = sStr.replace(/&/g, "&");
  10. sStr = sStr.replace(/>/g, ">");
  11. sStr = sStr.replace(/</g, "<");
  12. sStr = sStr.replace(/"/g, """);
  13. sStr = sStr.replace(/'/g, "'");
  14. return sStr;
  15. }
  16. const { user } = params;
  17. user = htmlEncode(user);
  18. // ...
  19. text.innerHTML = `Follow @${user}`;
  20. // good: 使用安全的DOM API替代innerHTML
  21. const { user } = params;
  22. // ...
  23. text.innerText = `Follow @${user}`;

1.1.2【必須】HTML屬性操作,限定/過濾傳入變量值

  • 使用element.setAttribute(name, value);時,如第一個參數(shù)值name外部可控,應(yīng)用白名單限定允許操作的屬性范圍。

  • 使用element.setAttribute(name, value);時,操作a.hrefifame.src、form.actionembed.src、object.datalink.href、area.hrefinput.formaction、button.formaction屬性時,如第二個參數(shù)值value外部可控,應(yīng)參考JavaScript頁面類規(guī)范1.3.1部分,限定頁面重定向或引入資源的目標(biāo)地址。

  1. // good: setAttribute操作前,限定引入資源的目標(biāo)地址
  2. function addExternalCss(e) {
  3. const t = document.createElement('link');
  4. t.setAttribute('href', e),
  5. t.setAttribute('rel', 'stylesheet'),
  6. t.setAttribute('type', 'text/css'),
  7. document.head.appendChild(t)
  8. }
  9. function validURL(sUrl) {
  10. return !!((/^(https?:\/\/)?[\w\-.]+\.(qq|tencent)\.com($|\/|\\)/i).test(sUrl) || (/^[\w][\w/.\-_%]+$/i).test(sUrl) || (/^[/\\][^/\\]/i).test(sUrl));
  11. }
  12. let sUrl = "https://evil.com/1.css"
  13. if (validURL(sUrl)) {
  14. addExternalCss(sUrl);
  15. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號