版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。

Web安全问题,很多时候会被人所忽略,安全漏洞造成了很多不必要的维护和开发任务,产生的问题有时候更是致命的。
实际上,只要我们养成一些习惯,知道一些安全问题的基本原理,可以很大程度避免问题的出现,这也是一个优秀Web程序员的必备素质。

UI变量转义规范

什么是UI变量?凡是出现在HTML中由后端输出(或由JSON渲染)的变量都可称之为UI变量,它可以是PHP变量、Smarty变量、JSP变量或前端模版变量等等。

有些模版自带了转义功能,比如Smarty可以对HTML或JavaScript转义:

Data: <h1>"Ricky"</h1>
Template: <{$name|escape:html|escape:javascript}>
Output: &lt;h1&gt;&quot;Ricky&quot;&lt;\/h1&gt;

Mustache默认自动对HTML转义(双花括号是wiki的语法,所以本文Mustache模版标签用{<>}表示):

Data: <h1>Ricky</h1>
Template: {<name>}
Output: &lt;h1&gt;Ricky&lt;\/h1&gt;

如果不想转义,可以使用3个花括号:{{{name}}}

注意:当没有使用具有转义功能的模版时,一定要在程序中对UI变量进行转义。对后端传来的数据,都采取不信任的策略。

根据UI变量出现的位置不同,转义规则也不同,常见的有以下几种情况:

UI变量出现在HTML标签中或标签的属性中

实例:

<div>{<content>}</div>
<input type='checkbox' value='{<value1>}' />
<input type="text" value="{<value2>}" />

转义规则:

字符 转义 漏洞实例
< &lt; {<content>} = <h1>I am bigger</h1>
> &gt;
' &#39 {<value1>} = '/><script>alert(0)</script>…
" &quot; {<value2>} = "/><script>alert(0)</script>…
& &amp;
(可选)
如果不转义,则用户可以输入不可见字符,如:&nbsp;
如果转义,则用户输入的某些字符不能正确显示,如:&copy;

UI变量出现在<script>标签中

实例:

<script>
var email = '{<email>}';
var name = "{<name>}";
/*{<sex>} will not use */
</script>

转义规则:

字符 转义 漏洞实例
' \' {<email>} = ';alert(0);…
" \" {<name>} = ";alert(0);…
\ \\ {<name>} = \
报错:unterminated string literal
/ \/ {<name>} = ";</script><script>alert(0);…
{<sex>} = */alert(0);…
\n \n {<email>} = a@a.com
b@b.com
报错:unterminated string literal
\r \r

注意:注释也会存在漏洞,代码上线前要进行压缩,去掉注释。

UI变量出现在JS环境的innerHTML插入字符串中

实例:

<script>
$("#tip").innerHTML = "您好!" + "{<username>}";
</script>

转义规则:

字符 转义 漏洞实例
先进行HTML转义,再进行JavaScript转义
< &lt; {<username>} =
";</script><script>document.body.innerHTML = "<h1>Ricky</h1>
> &gt;
' \'
" \"
\ \\
/ \/
\n \n
\r \r

UI变量出现在HTML页面onclick等事件函数的参数中

实例:

<input type="button"  value="提交" />

转义规则:

字符 转义 漏洞实例
先进行JavaScript转义,再进行HTML转义
' \' {<data>} = ')"/><input name="
" \&quot;
\ \\
/ \/(可选)
\n \n
\r \r
< &lt;
> &gt;

注意:实际开发中,应使用事件绑定,避免这种写法。

UI变量出现在URL中

实例:

<a href="http://xuri.agent.sogou.com/{<path>}">进入旭日</a>

转义规则:

字符 转义 漏洞实例
非字母、数字字符 encodeURIComponent {<path>} = "></a>…

其他注意事项

从cookie/url中获取数据

实例:

 
<script>
var url = location.href;
//var cookie = document.cookie;
$("#Show").html(encodeHTML(url));
</script>

说明:从cookie或页面的url中获取的数据都是不可信任的,可能包含恶意代码。

避免document.write + location.href的写法

实例:

<script>
document.write('<input type="hidden" name="url" value="' + location.href + '" />');
</script>

正确写法:

<input type="hidden" name="url" value="" />
<script>
document.getElementsByName("url").value = location.href;
</script>

说明:直接向页面输出带有url的HTML,可能会执行含恶意代码。

谨慎使用document.domain解决跨域问题

说明:当域为a.sogou.com的A页面内嵌域为b.sogou.com的B页面时,可以通过设置domain为sogou.com使两个页面进行通信。但这样的设置使安全隐患得以扩大化,如果B页面存在XSS漏洞,那么就可以通过B页面操控正常的A页面。

Json数据conentType的设置

说明:Json数据的Response要设置contentType为“text/javascript”,避免未设置或者设置成“text/html”。否则容易注入JavaScript脚本,并当着普通页面来运行。

Flash跨域crossdomain.xml配置

做跨域通信通常会用到Flash,这需要在server部署一个crossdomain.xml文件,通常为:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

这表示允许任何域的Flash对本server进行访问,如果Flash是用户上传的,就可能包含恶意代码。

解决办法:只允许搜狗域的Flash访问

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*.sogou.com" />
</cross-domain-policy>

在页面中插入Flash的安全设置

如果展现来自用户上传的Flash,需要设置一下2个参数:

  • allowScriptAccess: "never" //绝对禁止Flash与页面元素及脚本的通讯

  • allowNetworking: "none" //禁止任何的网络通讯

不要随意嵌套第三方页面

不要使用iframe或者其他形式随意嵌套第三方页面,第三方页面会包含不可控的因素,譬如含有攻击浏览者的恶意代码。如果第三方页面存在漏洞,攻击者可以通过攻击第三方来实现攻击父页面。

防范CSRF(跨站点请求伪造)攻击

  • 尽量使用POST提交

  • 添加refer的检查

  • form表单提交添加图形验证码

  • 添加token验证

Web安全开发建议的更多相关文章

  1. 学web前端开发写给新手的建议,超实用!

    01 前面的话 如今我们使用的互联网,客户端与服务器端的交互无时无刻不在发生.比如我们在浏览器打开网页,浏览器就是客户端,将网页数据发过来的也就是服务器.其实服务器,并没有什么特别的,也就是一台昼夜不 ...

  2. 用grunt搭建web前端开发环境

    1.前言 本文章旨在讲解grunt入门,以及讲解grunt最常用的几个插件的使用. 2.安装node.js Grunt和所有grunt插件都是基于nodejs来运行的,如果你的电脑上没有nodejs, ...

  3. web前端开发学习内容

    应该 具备的 知识技能 :懂web标准,熟练手写 xhtml css3 并符合 符合w3c标准                       代码能 兼容主流浏览器.ie6.7.8.9 ff 等.    ...

  4. Web前端开发工程师养成计划【转载】

    Web前端开发工程师养成计划(入门篇) 最原始的忠告:这个世界上有想法的人很多,但是有想法又能实现它的人太少! 首先要感谢伟大的Web2.0概念.产品概念.用户体验概念.jQuery插件,是它们在中国 ...

  5. 【转载】WEB前端开发规范文档

    本文转载自谈笑涧<WEB前端开发规范文档> 为 新项目写的一份规范文档, 分享给大家. 我想前端开发过程中, 无论是团队开发, 还是单兵做站, 有一份开发文档做规范, 对开发工作都是很有益 ...

  6. web前端开发和后端开发有什么区别?

    web前端分为网页设计师.网页美工.web前端开发工程师 首先网页设计师是对网页的架构.色彩以及网站的整体页面代码负责 网页美工只针对UI这块儿的东西,比如网站是否做的漂亮 web前端开发工程师是负责 ...

  7. 【Yeoman】热部署web前端开发环境

    本文来自 “简时空”:<[Yeoman]热部署web前端开发环境>(自动同步导入到博客园) 1.序言 记得去年的暑假看RequireJS的时候,曾少不更事般地惊为前端利器,写了<Sp ...

  8. 【前端福利】用grunt搭建自动化的web前端开发环境-完整教程

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...

  9. jboss上的soap web service开发示例

    以下示例,由jboss quickstart示例代码得来: 一.创建一个常规的dynamic web项目,建议支持maven ,项目的关键属性参考下图: 二.定义服务接口及参数对象 HelloWorl ...

随机推荐

  1. 【转】Mac下升级python2.7到python3.6

    1. 前言 Mac系统自带python2.7,本文目的是将自带的python升级到3.6版本. 网上有本多的做法是让python2.7和python3.X两个版本共存,博主并不知道,是两版本共存好,还 ...

  2. 第三百一十九节,Django框架,文件上传

    第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码 ...

  3. 嵌入式驱动开发之usb 无线网卡驱动---RT2870STA dm368

    RT2870STA 368的无线网卡驱动! http://www.linuxidc.com/Linux/2014-02/96979.htm

  4. Ubuntu下,如何解决Unable to locate package

    在虚拟机上新装了一个ubuntu 12.10,想在上面装一个Git,却发生了以下错误信息 我觉得原因可能是我换了163的源,没有更新所以找不到这个包. 这时候就要使用 sudo apt-get upd ...

  5. 【Java NIO的深入研究2】RandomAccessFile的使用

    RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须 ...

  6. 【Mysql】修改最大连接数

    http://www.111cn.net/database/mysql/51934.htm

  7. VMWare虚拟机提示:打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机

    将电脑上存在的虚拟机复制一份后打开运行,弹出错误提示: 打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机. 解决方法如下: 打开存放虚拟机系统硬盘的所在文件夹 ...

  8. 启用lazyload插件,减少图片加载

    使用lazyload的js插件,减少图片加载,提高页面加载速度和节省流量.虽然这个头像是第三方服务器来的,不消费博客的流量,但是能节省部分访客的加载时间,也是不错的哦. 用lazyload插件,只是后 ...

  9. crc16算法,包括单片机和c#版本

    c语言的#include <stdio.h> static  short const wCRC16Table[256] = {         0x0000, 0xC0C1, 0xC181 ...

  10. Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)

    字节流 操作图片数据就要用到字节流. 字符流使用的是字符数组char[],字节流使用的是字节数组byte[]. 字节流读写文件 针对文件的读写,JDK专门提供了两个类,分别是FileInputStre ...