温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Web安全开发建议

发布时间:2020-08-06 18:41:10 来源:网络 阅读:1286 作者:安大叔 栏目:web开发
Web安全问题,很多时候会被人所忽略,安全漏洞造成了很多不必要的维护和开发任务,产生的问题有时候更是致命的。
实际上,只要我们养成一些习惯,知道一些安全问题的基本原理,可以很大程度避免问题的出现,这也是一个优秀Web程序员的必备素质。

UI变量转义规范

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

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

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

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

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

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

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

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

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

实例:

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

转义规则:

字符转义漏洞实例
< &lt;{<content>} = <h2>I am bigger</h2>
> &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 = "<h2>Ricky</h2>
> &gt;
'\'
"\"
\\\
/\/
\n\n
\r\r


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

实例:

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

转义规则:

字符转义漏洞实例
先进行JavaScript转义,再进行HTML转义
'\&#39;{<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验证


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI