web安全 - Javascript开发安全应用程序指南

1. 不受信任的数据应当作只作为可显示的文本,而不应当是可执行代码或者HTML标记。

2. 在进入应用程序时,始终将不受信任的数据编码和分隔为带引号的字符串。

3. 使用document.createElement("..."), element.setAttribute("...","value"), element.appendChild("...") 等类似安全的方式构建动态接口。

注意:element.setAttribute 只是对一些静态数据属性的设置是安全的,对于一些危险的事件属性则
需要当心,比如onclick, onblur, onerror,等。

4. 避免将不受信任的数据放到渲染HTML的属性或方法中。

  • element.innerHTML = "...";
  • element.outerHTML = "...";
  • document.write(...);
  • document.writeln(...);

5. 避免将数据传递给隐含eval() 的相关方法中, 如setTimeout, setInterval。

如果要将不受信任的数据传递给隐含eval()相关方法时做到如下三点:

  • 用单引号或双引号进行分隔。
  • 用闭包封闭或者进行多重javascript编码
  • 包装在自定义的函数中, 确保不会调用不安全的方法,或者再进行额外的编码处理。

6. 仅在表达式右侧使用不受信任的数据

window[userDataLeftSide] = "userDataRightSide";
在表达式左侧使用不受信任的数据容易使攻击者破坏窗口对象的内部和外部属性,如window.location
window.eval()

7. 在Dom中进行URL编码时应注意字符集问题

8. 使用类似object[untrustedData]访问器时限制对对象属性的访问,容易使攻击者破坏object 的属性。

最佳实践是在不可信数据和对象属性之间增加一层间接的限制

const myObject = {};
if (untrustedData === 'location'){
  myObject.location = "moreUnstrustedData";
}

9. 在javascript沙箱中运行你的javascript代码,从而过滤危险的HTML标签和属性。

js-xss
sanitize-html
DomPurify
MDN - HTML Sanitizer API
OWASP Summit 2011 - DOM Sandboxing

10.不要使用eval()将JSON转为javascript对象。

最佳实践是使用: JSON.parse() 与 JSON.toJSON()

posted @ 2022-09-14 18:56  箫笛  阅读(48)  评论(0)    收藏  举报