关于尚观
最新课程体系
企业服务
零起点咨询
开放课程
报名咨询
免费资源申请
Oracle服务
学员专区&薪资
认证课程
  • 尚观首页
  • 尚观简介
  • 师资力量
  • 尚观文化
  • 尚观动态
  • 加入尚观
  • 联系我们
  • 珍贵瞬间
  • 院校合作
  • Linux系统与集群
  • 数据库集群架构师
  • 嵌入式内核驱动开发
  • 服务器开发架构师
  • Android开发架构师
  • RHCE/LPI认证体系
  • Oracle OCP认证
  • 企业高级技术培训
  • 批量人才供应及研发团队建设
  • 软件外包及研发项目合作
  • 人力外包及人力供应
  • 猎头服务
  • 开启职业生涯
  • 如何入门
  • Unix/Linux职业方向
  • 嵌入式职业方向
  • 集群(Cluster)Oracle(DBA)方向
  • 新手专栏
  • Android开发方向
  • Unix/Linux新手专栏
  • Unix/Linux管理
  • 嵌入式及POSIX开发
  • Linux开源文化及市场
  • 最近网络课堂
  • P2P教学视频
  • 精彩Linux培训视频
  • 零起点数据库集群(长期)
  • 嵌入式驱动(长期)
  • Linux金牌三证(RHCE级)
  • Linux架构师(RHCA级)
  • 嵌入式/驱动加速课程
  • Linux免费网络安全公开课
  • 免费Linux资料申请
  • 免费Linux安全&DDOS防御课程
  • 免费嵌入式Linux开发课程
  • 免费Linux网络安全机制
  • 尚观服务
  • 软件产品
  • 技术方案
  • 尚观支持
  • 学员毕业薪资(不断更新中)
  • 加入尚观猎头服务(仅限老学员)
  • OCP认证
  • Intel认证
  • RHCE认证
  • RHCE+OCP
  • RHCE+LPI
  • OCM认证
  • RHCA认证


    您现在的位置:尚观Linux培训 - 嵌入式Linux培训专家尚观Linux培训 » Unix/Linux管理 » 使用 PHP 构建的 Web 应用如何避免 XSS 攻击

 
 
咨询热线
  • 免费咨询电话:
    400-700-0056
    800-810-0056

    教学就业监督电话:
    400-810-3016



  • 在线咨询
免费资源
  • -4月24日
  • [沈阳]Linux嵌入式-4月24日
  • [上海]DDos攻防-4月24日
  • [上海]Linux嵌入式-4月24日
  • [深圳]DDos攻防-4月24日
  • [深圳]Linux嵌入式-4月24日
  • [北京]DDos攻防-4月24日
  • 就业课程
  • 免费课程
  • 五万年薪就业保证课程

  • ULP-S 尚观王者IT集群课程 v8版
  • UEA嵌入式内核驱动开发者 V8版
  • UGA-Android开发架构师 V3.2版
  • ULA-Linux云计算集群架构师课程
  • UOA-Oracle数据库集群架构
  • 八万年薪就业保证课程

  • UOM- Oracle集群大师
  • UEM-嵌入式开发大师
  • 纯免费!shrek主讲 linux网络攻击及安全课程 2月8日
  • 纯免费!连续3天,Android开发入门实战免费公开课 12月27日
  • 纯免费!“云”指南“嵌入式”指北大型讲座! 12月24日
  • 纯免费!云计算虚拟化应用大型讲座! 12月17日
  • 纯免费! OCM考试经验分享! 12月7日
  • 纯免费! RHCA考试与学习经验分享! 12月13日
  • 纯免费! Android在线天气预报开发实战 11月30日
  • 纯免费! shrek主讲Linux攻防与安全! 11月24日
  • 纯免费! Redhat最高级RHCA考试与学习经验分享 11月22日
Linux培训●最新开班
  • [北京]UGA课程12月班热招!
  • [北京]UEA课程12月班热报!
  • [北京]ULP-S课程12月班热招
  • [上海]UEA课程12月班热招!
  • [上海]ULP-S课程12月班热招
  • [上海]UGA课程12月班热招!
  • [深圳]ULP-S课程12月班热招
  • [深圳]UEA课程12月班热招!
 
使用 PHP 构建的 Web 应用如何避免 XSS 攻击
  • 本文首先简单介绍开发测试人员如何对 Web 应用进行 XSS 漏洞测试,如何借助工具绕过客户端 JavaScript 校验输入恶意数据;然后针对使用 PHP 语言构建的 Web 站点,从在输出端对动态内容进行编码、以及在服务器端对输入进行检测两方面介绍如何避免恶意的 XSS 攻击。

    使用 PHP 构建的 Web 应用如何避免 XSS 攻击

    Web 2.0 的发展为网络用户的互动提供了更多机会。用户通过在论坛发表评论,或是在博客发表留言都可能有意或无意输入一些破坏性的内容,从而造成网页不能正常显示,影响其它用户的使用。XSS 全称为 Cross Site Scripting,因为 CSS 已经用作样式表的简称,故称为 XSS。 XSS 是一种常见的网站攻击的方法。其原理是通过在网页的输入框输入一些恶意的内容,通常是 JavaScript 脚本片段,而这些恶意输入在提交之后并重新读回到客户端时,浏览器会解释执行这些恶意的脚本内容,从而影响网页的正常显示。

    本文首先简单介绍开发测试人员如何对 Web 应用进行 XSS 漏洞测试,如何借助工具绕过客户端 JavaScript 校验输入恶意数据;然后针对使用 PHP 语言构建的 Web 站点,从在输出端对动态内容进行编码、以及在服务器端对输入进行检测两方面介绍如何避免恶意的 XSS 攻击。





    对 Web 应用进行 XSS 漏洞测试

    测试路径

    对 WEB 应用进行 XSS 漏洞测试,不能仅仅局限于在 WEB 页面输入 XSS 攻击字段,然后提交。绕过 JavaScript 的检测,输入 XSS 脚本,通常被测试人员忽略。下图为 XSS 恶意输入绕过 JavaScript 检测的攻击路径。


    图 1. XSS 攻击测试路径 – 绕过 JavaScript 校验
    XSS 攻击测试路径 – 绕过 JavaScript 校验

    常见的 XSS 输入

    • XSS 输入通常包含 JavaScript 脚本,如弹出恶意警告框:<script>alert("XSS");</script>
    • XSS 输入也可能是 HTML 代码段,譬如:
      • 网页不停地刷新 <meta http-equiv="refresh" content="0;">
      • 嵌入其它网站的链接 <iframe src=http://xxxx width=250 height=250></iframe>

    XSS (Cross Site Scripting) Cheat Sheet 维护了一份常见的 XSS 攻击脚本列表,可用来作为检测 WEB 应用是否存在 XSS 漏洞的测试用例输入。初次接触 XSS 攻击的开发人员可能会对列表提供的一些 XSS 输入不是很理解,本文第二部分将会针对不同代码上下文的 XSS 输入作进一步的解释。

    测试工具

    很多工具可以在浏览器发送 Get/Post 请求前将其截取,攻击者可以修改请求中的数据,从而绕过 JavaScript 的检验将恶意数据注入服务器。以下是一些常用的截取 HTTP 请求的工具列表。

    • Paros proxy (http://www.parosproxy.org)
    • Fiddler (http://www.fiddlertool.com/fiddler)
    • Burp proxy (http://www.portswigger.net/proxy/)
    • TamperIE (http://www.bayden.com/dl/TamperIESetup.exe)

    笔者曾经使用 TamperIE 对 WEB 应用进行安全性测试。TamperIE 小巧易用,能够截取 IE 浏览器发送的 Get/Post 请求,甚至能绕过 SSL 加密。不过 TamperIE + IE7 工作不稳定。IE7 提供了对 IPV6 的支持,如果你并不计划测试你的 Web 应用对 IPV6 的支持,建议还是使用 TamperIE + IE6 的组合。

    如图2所示: TamperIE 绕过客户端浏览器 JavaScript 的校验,在 POST 请求提交时将其截取,用户可以任意修改表单输入项 name 和 message 的值,譬如将 message 的值修改为 "<script>alert(“XSS hole!!”);</script>",然后点击 ”Send altered data” 按钮,将修改后的恶意数据发送给 Web 服务器。


    图 2. 使用 TamperIE 截取 Post 请求
    使用 TamperIE 截取 Post 请求




    在输出端对动态内容进行编码

    对一个 Web 应用而言,其动态内容可能来源于用户输入、后台数据库、硬件状态改变或是网络信息等。动态内容特别是来自用户输入的动态内容很有可能包含恶意数据,从而影响网页的正常显示或是执行恶意脚本。将动态内容安全地显示在浏览器端与动态内容所处的上下文背景有关,譬如动态内容处在 HTML 正文、表单元素的属性、或是 JavaScript 代码段中。对于一个基于 PHP 语言的 Web 应用,当执行 "echo"、"print"、"printf"、"<?=" 等语句时表示正在处理动态内容。本节将首先介绍 PHP 提供的库函数 htmlspecialchars() 的用法,此函数能将 5 个 HTML 特殊字符转化为可在网页显示的 HTML 实体编码;然后将介绍一些常见背景下的 XSS 攻击输入,以及如何在输出端对动态内容进行转义、编码从而避免 XSS 攻击。

    使用 PHP 的 htmlspecialchars() 显示 HTML 特殊字符

    从上文列举的 XSS 恶意输入可以看到,这些输入中包含了一些特殊的 HTML 字符如 "<"、">"。当传送到客户端浏览器显示时,浏览器会解释执行这些 HTML 或JavaScript 代码而不是直接显示这些字符串。< > & “ 等字符在HTML语言中有特殊含义,对于用户输入的特殊字符,如何直接显示在网页中而不是被浏览器当作特殊字符进行解析?

    HTML字符实体由 & 符号、实体名字或者 # 加上实体编号、分号三部分组成。以下为 HTML 中一些特殊字符的编码。有的字符实体只有实体编号,没有对应的实体名字,譬如单引号。


    表 1. 一些 HTML 特殊字符的实体编码
    显示 实体名字 实体编号
    < < <
    > > >
    & & &
    “ " "
    ‘ N/A '

    PHP 提供了 htmlspecialchars() 函数可以将 HTML 特殊字符转化成在网页上显示的字符实体编码。这样即使用户输入了各种 HTML 标记,在读回到浏览器时,会直接显示这些 HTML 标记,而不是解释执行。htmlspecialchars() 函数可以将以下五种 HTML 特殊字符转成字符实体编码:

    • & 转成 &
    • “ 转成 "
    • < 转成 <
    • > 转成 >
    • ‘ 转成 '

    当直接调用 htmlspecialchars($str) 时, & " < > 被转义。

    当设置 ENT_QUOTES 标记时, 即调用 htmlspecialchars($str, ENT_QUOTES) 时,单引号也被转义。

    当设置 ENT_NOQUOTES 标记时,单引号和双引号都不会被转义。即调用 htmlspecialchars($str, ENT_NOQUOTES) 时,只有& < > 被转义。

    不同背景下的动态内容的 XSS 攻击及解决方案

    XSS 攻击输入与动态内容所处的代码背景相关,譬如动态内容为表单元素属性的值、位于 HTML 正文、或是 Javascript 代码段中等等。

    HTML 标记的属性为动态内容

    Web 应用中,"input"、"style"、"color" 等 HTML 标记的属性都可能为动态内容,其中"input" 标记的 "value" 属性通常为动态内容。

    例子1

    <form…><INPUT type=text name="msg" id="msg" size=10 maxlength=8  value="<?= $msg?>"></form> 

    攻击 XSS 输入

    Hello"><script>evil_script()</script> 

    将动态内容替换

    将 $msg 替换为恶意 XSS 输入:

    <form…><INPUT type=text name="msg" id="msg" size=10 maxlength=8  value="Hello"><script>evil_script()</script>"></form> 

    例子2

    <form…><INPUT type=text name="msg" id="msg" size=10  maxlength=8 value=<?= $msg?>></form> 

    攻击 XSS 输入

    Hello onmouseover=evil_script() 

    将动态内容替换

    将 $msg 替换为恶意 XSS 输入:

    <form…><INPUT type=text name="msg" id="msg" size=10  maxlength=8 value=Hello onmouseover=evil_script()></form> 

    分析

    从例子 1 可以看到其 XSS攻击输入中包含了 HTML 特殊字符 < > "

    从例子 2 可以看到其 XSS 攻击输入中没有包含上节中提到的五种 HTML 字符, 但是 "value"属性值没有使用双引号包围。

    解决方案

    调用 htmlspecialchars($str, ENT_QUOTES) 将以下 5 种 HTML 特殊字符 < > &‘ “ 转义;同时使属性值被双引号包围。譬如:

    <form…><INPUT type=text name="msg" id="msg" size=10  maxlength=8 value="<?= htmlspecialchars($msg, ENT_QUOTES))?>"></form> 

    注意事项

    将 input 的 value 进行转义,必须考虑显示和存储数据的一致性问题,即显示在浏览器端和存储在服务器端后台的数据可能因为转义而变得不一致。譬如存储在服务器端的后台原始数据包含了以上 5 种特殊字符,但是没有转义,为了防止 XSS 攻击,在浏览器端输出时对 HTML 特殊字符进行了转义:

    1. 当再度将表单提交时,存储的内容将会变成转义后的值。

    2. 当使用 JavaScript 操作表单元素,需要使用到表单元素的值时,必须考虑到值可能已经被转义。

    HTML 文本为动态内容

    例子

    <b> 欢迎:<?= $welcome_msg?></b> 

    攻击XSS输入

    <script>evil_script()</script> 

    将动态内容替换

    将 $welcome_msg 替换为恶意 XSS 输入:

    <b>欢迎:<script>evil_script()</script></b> 

    分析

    在 HTML 正文背景下,< > 字符会引入 HTML 标记,& 可能会认为字符实体编码的开始,所以需要将 < > & 转义

    解决方案

    为简洁起见,直接使用 htmlspecialchars() 将 5 种 HTML 特殊字符转义,如:

    <b>欢迎:<?= htmlspecialchars($welcome_msg,, ENT_NOQUOTES)?></b> 

    URL 的值为动态内容

    Script/Style/Img/ActiveX/Applet/Frameset… 等标记的 src 或 href 属性如果为动态内容,必须确保这些 URL 没有指向恶意链接。

    例子1

    <script src=<?= "$script_url>"> 

    攻击XSS输入

    http://evil.org/evil.js 

    将动态内容替换

    将 $script_url 替换为恶意 XSS 输入:

    <script src="http://evil.org/evil.js"> 

    例子2

    <img src=”<?= $img_url>”> 

    攻击XSS输入

    javascript:evil_script() 

    将动态内容替换

    将 $img_url 替换为恶意XSS输入:

    <img src=” javascript:evil_script()”> 

    分析

    一般情况下尽量不要让 URL 的值被用户控制。如果用户需要自己定义自己的风格及显示效果,也不能让用户直接控制整个 URL 的内容,而是提供预定义好的风格供用户设置、装配,然后由后台程序根据用户的选择组合成安全的 URL 输出。

    字符集编码

    浏览器需要知道字符集编码才能正确地显示网页。如果字符集编码没有显式在 content-type 或meta 中定义,浏览器会有算法猜测网页的字符集编码。譬如<script>alert(document.cookie)</script> 的 UTF-7 编码为:

    +ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4- 

    如果 +ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4- 作为动态内容位于网页的顶端并传送到浏览器端,IE 会认为此网页是 UTF-7 编码,从而使网页不能正常显示。

    解决方案

    显式定义网页的字符集编码,譬如

    <meta http-equiv=content-type content="text/html; charset=UTF-8"> 

    动态内容为 JavaScript 事件处理函数的参数

    JavaScript 事件处理函数如 onClick/onLoad/onError/onMouseOver/ 的参数可能包含动态内容。

    例子

    <input type="button" value="go to" onClick='goto_url("<?= $target_url>");'> 

    攻击XSS输入

    foo");evil_script(" 

    将动态内容替换

    HTML 解析器会先于 JavaScript 解析器解析网页,将 $target_url 替换为恶意 XSS 输入:

    <input type="button" value="go to" onClick='goto_url("foo");evil_script("");'>  

    动态内容位于 JavaScript 代码段中

    例子

    <SCRIPT language="javascript1.2"> var msg='<?= $welcome_msg?> '; // … </SCRIPT> 

    攻击XSS输入1

    Hello'; evil_script(); // 

    将动态内容替换

    将 $welcome_msg 替换为恶意 XSS 输入:

    <SCRIPT language="javascript1.2"> var msg='Hello'; evil_script(); //'; // … </SCRIPT> 

    攻击XSS输入2

    Hello</script><script>evil_script();</script><script> 

    将动态内容替换

    将 $welcome_msg 替换为恶意 XSS 输入:

    <script> var msg = 'Hello</script>  <script>evil_script();</script>  <script>' // ... // do something with msg_text </script> 

    分析

    如上文所示,在 JavaScript 背景中使用动态内容需要非常谨慎。一般情况下,尽量避免或减少在 Javascript 的背景下使用动态内容,如果必须使用动态内容,在开发或代码审计时必须考虑这些动态内容可能的取值,是否会导致 XSS 攻击。





    建立PHP库函数校验输入

    Web 开发人员必须了解,仅仅在客户端使用 JavaScript 函数对非法输入进行检测过滤对于构建安全的 WEB 应用是不够的。如上文所述,攻击者可以轻易地借助工具绕过 JavaScript 校验甚至 SSL 加密输入恶意数据。在输出端对动态内容进行编码也只能起到一种双重保护的作用,更重要的应该在服务器端对输入进行校验。PHP 提供了strpos()、strstr()、preg_match() 等函数可用于检测非法字符和字符串;preg_replace() 函数可用于替换非法字符串。OWASP PHP Filters 开源项目提供了一些 PHP 库函数用于过滤非法输入可作为参考。一些常见的检测和过滤包括:

    1.  
      1. 输入是否仅仅包含合法的字符;
      2. 输入如果为数字,数字是否在指定的范围;
      3. 输入字符串是否超过最大长度限制;
      4. 输入是否符合特殊的格式要求,譬如email 地址、IP 地址;
      5. 不同的输入框在逻辑上存在的耦合和限制的关系;
      6. 除去输入首尾的空格;




    总结

    Web 应用的安全性是一个很重要、覆盖范围很广泛的主题。为了防止常见的 XSS 的攻击,Web 开发人员必须明白不能仅仅只在客户端使用 JavaScript 对输入进行检测、过滤;同时还应建立服务器端的输入校验、输出编码库函数;在服务器端检测、过滤输入;根据动态内容所处的背景将特殊字符进行编码后再传送给浏览器端显示。(责任编辑:A6)




    精彩Linux视频、嵌入式视频、Android视频、Oracle视频,免费先学!
    查看:尚观Linux培训学员最新就业薪资待遇统计报告!
    查看:UGA-4G Android开发架构师大纲
    查看:UDA-Linux服务器开发架构师大纲
    查看:UEA-嵌入式内核驱动开发者大纲
    查看:UOA-Oracle数据库集群架构大纲
    查看:ULA-Linux系统与集群架构师大纲

    填表获取 Linux、嵌入式、Oracle 技术资料

  • 姓    名:
  • 固    话:
  • 手    机:
  • E-Mail :
  • 所在地:
  •         

北京(总部)

电子地图
电话:(010)62113016/17 68949060
地址:北京海淀区中关村南大街 甲10号 银海大厦南区410-418

上海(Shanghai)

电子地图
电话:(021)64859996 64859889
地址:上海徐汇区钦江路333号漕河泾开发区38号楼申能科技3楼

深圳(Shenzhen)

电子地图
电话:(0755)82995128 82995168
地址:深圳福田区 彩田路 中深花园B2005室

沈阳(Shenyang)

电子地图
电话:(024)31500816 31500817
地址:沈阳和平区三好街54号物产科贸大厦2号楼201室

大连(Dalian)

电子地图
电话:(0411)84336822 84326822
地址:大连沙河口区西安路86号行政大厦(罗斯福广场对面)17楼1705室

成都(Chengdu)

电子地图
电话:(028)66677820 66677828
地址:成都青羊区上西顺城街252号顺吉大厦8楼B4

广州(Guangdong)

电子地图
电话:(020) 88900632 81368992
地址:广州市越秀区人民北路612号中广大厦9层(国际银行中心旁)

南京(Nanjing)

电子地图
电话:(025)83176720 83176710
地址:南京新街口广场中山东路9号天时科技园12层G、H单元

武汉(Wuhan)

电子地图
电话:(027)87596339
地址:武汉市洪山区鲁磨路118号国光大厦A座1201室1203室




2005-2009高新技术企业

LPI授权培训考试中心

CSDN战略伙伴

51Job战略伙伴

Oracle WDP授权培训与考试中心

Intel软件服务培训供应商

Redhat授权培训与考试中心

高新技术企业证书
 

友情链接(联系QQ:87865954):   LPI  RedHat  CSDN  ChinaUnix  ITPub  Eygle.Com  Linux培训  嵌入式培训  Linux联盟  Unix爱好者  51CTO开发 尚观知识库 天极导航  PHP中国  网易教育  天津赶集网  工具软件下载  连锁加盟  天极网南京站  个人简历模板  北京赶集网  畅享网  网页制作  Linux  ZOL服务器  广告联盟  颈椎病的症状  21CN教育  亿芯网  强直性脊柱炎  数码比价网  投资创业  DJ网站  嵌入式技术网  OCM培训  股票入门  大功率LED网   搜电网  杭州写字楼网  时尚论坛  医药营销联盟  Linux技术中心  泉州人才网  大学后  天天健康  RHCE培训  SVN中文技术网  网罗天下  Oracle培训  北京法律咨询  嵌入式资讯网  Fedora中文爱好者  沸点100网   教培英才网  中国二手车城  Linux公社  Oracle教程  深圳本地宝  狂人网  0090网址大全  数码比价网  IT英才网

  • PR
COPYRIGHT © 2000-2009 北京尚观科技有限公司 - 北京市海淀区尚观培训学校 - Linux培训及嵌入式培训专家 ALL RIGHTS RESERVED

咨询热线:400-700-0056    800-810-0056
京ICP备09018548号 | Linux就业信息 | 免责声明 | 隐私声明 |