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

 

https://www.drivereasy.com/buy.php?comeid="><script>alert('OPENBUGBOUNTY')</script>

以上链接注入了一个弹窗,运行后如下图所示:

因为buy.php会直接使用get方式传递过来的参数作为值,并且echo输出到页面上,

如果传递的参数没有进行安全处理,就会发生xss攻击。

因此需要对页面上用户的输入或者传递的参数字符串进行安全处理,我们使用以下函数对网站的参数进行了安全处理。

function clean_xss($string) {
    $str = trim($string);     // 去前后空格
    $str = strip_tags($str);    // 去标签对
    $str = htmlspecialchars($str, ENT_QUOTES);   // 转义特殊字符& " ' < >
    return $str;
}

对一个 Web 应用而言,其动态内容可能来源于用户输入、后台数据库、硬件状态改变或是网络信息等。动态内容特别是来自用户输入的动态内容很有可能包含恶意数据,从而影响网页的正常显示或是执行恶意脚本。

将动态内容安全地显示在浏览器端与动态内容所处的上下文背景有关,譬如动态内容处在 HTML 正文、表单元素的属性、或是 JavaScript 代码段中。

对于一个基于 PHP 语言的 Web 应用,当执行 "echo"、"print"、"printf"、"<?=" 等语句时表示正在处理动态内容。 PHP 提供的库函数 htmlspecialchars()的用法,此函数能将 5 个 HTML 特殊字符转化为可在网页显示的 HTML 实体编码。

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

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

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

 
  • & 转成 &amp;
  • “ 转成 &quot;
  • < 转成 &lt;
  • > 转成 &gt;
  • ‘ 转成 &#39;
  • 当直接调用 htmlspecialchars($str)时, & " < > 被转义。当设置 ENT_QUOTES 标记时, 即调用htmlspecialchars($str, ENT_QUOTES)时,单引号也被转义。当设置 ENT_NOQUOTES 标记时,单引号和双引号都不会被转义。即调用 htmlspecialchars($str, ENT_NOQUOTES)时,只有& < > 被转义。
posted @ 2018-06-04 19:06  Ryan_zheng  阅读(195)  评论(0编辑  收藏  举报