Web安全问题,很多时候会被人所忽略,安全漏洞造成了很多不必要的维护和开发任务,产生的问题有时候更是致命的。 实际上,只要我们养成一些习惯,知道一些安全问题的基本原理,可以很大程度避免问题的出现,这也是一个优秀网络程序员的必备素质。
什么是UI变量?凡是出现在HTML中由后端输出(或由JSON渲染)的变量都可称之为UI变量,它可以是PHP变量,Smarty变量,JSP变量或前端模版变量等等。
有些模版自带了转义功能,比如Smarty可以对HTML或JavaScript转义:
<>前数据:& lt; h2>“瑞奇”& lt;/h2> 模板:& lt;{$名称|逃脱:html |逃脱:javascript}祝辞 输出:,lt; h2& gt;和“Ricky&”, lt; \/h2& gt;胡子默认自动对HTML转义(双花括号是wiki的语法,所以本文胡子模版标签用{& lt;祝辞}表示):
<>前数据:& lt; h2> Ricky 模板:{& lt; name>} 输出:,lt; h2& gt; Ricky&肝移植;\/h2& gt;如果不想转义,可以使用3个花括号:{“名字”}
<强>注意:当没有使用具有转义功能的模版时,一定要在程序中对UI变量进行转义。对后端传来的数据,都采取不信任的策略。强>
根据UI变量出现的位置不同,转义规则也不同,常见的有以下几种情况:
实例:
& lt; div> {& lt; content>} & lt;/div> & lt;输入类型=案囱】颉眝alue=' https://www.yisu.com/zixun/{}/比; & lt;输入类型="文本" value=" https://www.yisu.com/zixun/{ } "/比;
转义规则:
字符转义漏洞实例& lt;,lt; {& lt; content>}=& lt; h2>我bigger比;和gt;”, # 39 {& lt; value1>}='/祝辞& lt; script>警报(0)& lt;/script>…”,“{& lt; value2>}="/祝辞& lt; script>警报(0)& lt;/script>…,,,(可选)如果不转义,则用户可以输入不可见字符,如:,,
如果转义,则用户输入的某些字符不能正确显示,如:,复制;
实例:
& lt; script> var邮件=' {& lt; email>} '; var name=" {& lt; name>}”;/* {& lt; sex>}不会使用*/& lt;/script>
转义规则:
字符转义漏洞实例“\”{& lt; email>}=';警报(0);…”\“{& lt; name>}=熬?0);…\ \ \ {& lt; name>}=\报错:无端接的字符串文字/\/{& lt; name>}="; & lt;/script> & lt; script>警报(0);…
{& lt; sex>}=*/警报(0);…\ n \ n {& lt; email>}=a@a.com
b@b.com
报错:无端接的字符串文字\ r \ r
<强>注意:注释也会存在漏洞,代码上线前要进行压缩,去掉注释。强>
实例:
& lt; script> $(" #提示”)。innerHTML="您好!”+“{& lt; username>}”; & lt;/script>
转义规则:
字符转义漏洞实例先进行HTML转义,再进行JavaScript转义& lt;,lt; {& lt; username>}="; & lt;/script> & lt; script> document.body。innerHTML=" & lt; h2> Ricky比;和gt,“\“\”\ \ \/\/\ n \ n \ \ r
实例:
& lt;输入类型=鞍磁ァ奔壑?" https://www.yisu.com/zixun/提交”/比;
转义规则:
字符转义漏洞实例先进行JavaScript转义,再进行HTML转义’\,# 39;{& lt; data>}=') "/祝辞;& lt;输入名称=" " \,“\ \ \ \/(可选)\ n \ n \ r \ r<,,lt的在和gt;<强>注意:实际开发中,应使用事件绑定,避免这种写法。强>
实例:
& lt; a href=" http://xuri.agent.sogou.com/{& lt; path>}”在进入旭日& lt;/a>
转义规则:
字符转义漏洞实例非字母,数字字符encodeURIComponent {& lt; path>}="祝辞& lt;/a>…
实例:
& lt; script> var url=location.href;//var饼干=? $(" #秀”). html (encodeHTML (url)); & lt;/script>
说明:从cookie或页面的url中获取的数据都是不可信任的,可能包含恶意代码。
实例:
& lt; script> document . write (' & lt;输入类型=耙亍眓ame=" url " value=" +位置。href +”/祝辞'); & lt;/script>
正确写法:
& lt;输入类型=耙亍眓ame=" url " value="/比; & lt; script> document.getElementsByName (url)。值=https://www.yisu.com/zixun/location.href;> 脚本
说明:直接向页面输出带有url的HTML,可能会执行含恶意代码。
说明:当域为a.sogou.com的一个页面内嵌域为b.sogou.com的B页面时,可以通过设置域名为sogou.com使两个页面进行通信。但这样的设置使安全隐患得以扩大化,如果B页面存在XSS漏洞,那么就可以通过B页面操控正常的一页面。