这是一篇关于JavaScript安全的文章,但也不限于JavaScript。 前端安全的范围大致都在XSS(跨站脚本攻击)与 CSRF(跨站请求伪造)这两个领域,下面的分享与讨论也都可认为是这几个主题的延伸与扩展。

对于前端安全,可能很多人有这样一个疑问:后台往往已经做了安全处理,为啥前端还需要再处理一次呢?所有前端接收到数据都应该被认为是 不可信的,因为我们无法保证后台数据一定是安全的,即使是自己的后台也有可能存在数据存储的入口是多个的,任何一个入口在存储数据式发生安全问题, 都会可能导致展现数据前端发生被攻击的风险。

进入正题,先从考虑下面的代码开始,是否有发现问题?

<script>
  var str = "</script><script>alert('i am flaw');</script>";
</script>

这断代码最后的执行结果是 alert i am flaw 的填出框,这与HTML解析机制有关,HTML从上而下进行分析,解析引擎遇到 第一个起始标签 <script> 时把其压入栈中,直到遇到紧随的第一个闭合标签 </script>,导致引擎会认为

<script> var str = " </script>

是第一段JavaScript代码并执行。然后继续按以上规则解析后续文本,因此引擎会认为下面是第二段代码并执行:

<script>alert('i am flaw');</script>

而 “; </script> 则被分为两部对待, “; 被视为文本内容并显示,而 </script> 则会被认为是未闭合的非法标签。此时浏览器会报语法错误,提示你标签非法, 如Chrome下提示 Uncaught SyntaxError: Unexpected token ILLEGAL。

简单的开胃菜后讲些干货~

关于CSS样式

在很多有个人主页的站点是支持用户自定义样式的,那如何过滤用户定义的非法CSS属性,则是需要考虑的安全问题之一。

if(css.match(/behavior:|content:|javascript:|binding|expression|\@import/)){
    throw new Error("Illegal CSS");
}

过滤 expression

color:expression(alert(\"hello\")

过滤 @import

@import 'unsafe.css'

过滤 behavior

behavior: url(unsafe.htc)

过滤 binding

-moz-binding: url("http://www.mozilla.org/xbl/htmlBindings.xml#checkbox");

过滤 url

url(javascript:alert(3))

过滤 content

content: " (" attr(href) ")";

未完待续…



blog comments powered by Disqus

Published

14 August 2012

Tags