PHP XSS漏洞及防护

一、XSS是什么

为了与层叠样式表(Cascading Style Sheets,CSS)的缩写进行区分,故将跨站脚本攻击(Cross Site Scripting)缩写为XSS。

跨站脚本攻击指的是攻击者在Web页面里插入了恶意代码,其没有被严格的控制或过滤,最终显示给来访的用户。

攻击者通过注入的代码执行恶意指令,这些恶意网页程序通常是JavaScript、VBScript、ActiveX、Flash等,使用户加载并执行攻击者恶意制造的网页程序,从而达到恶意攻击用户的特殊目的。

二、XSS的类型

XSS大体分为 反射性XSS、存储型XSS、DOM型XSS。

推荐文章:https://www.cnblogs.com/bmjoker/category/1197209.html

三、如何进行 XSS 的防护

<?php
declare(strict_types = 1);

$str = 'hello world <b> Hello HeiKe </b><a href="/">click</a>';
echo $str;

原始效果:

1、html 实体转换(htmlspecialchars)

通过 HTML 实体转化后的字符串不再具有 HTML 特性,浏览器按 HTML 实体字符串将其解析成可展示的字符串。进行 HTML 实体转化,可以有效地防止 XSS 代码执行。

<?php
declare(strict_types = 1);

$str = 'hello world <b> Hello HeiKe </b><a href="/">click</a>';
echo htmlspecialchars($str);

过滤之后的源代码效果:

hello world <b> Hello HeiKe </b><a href="/">click</a>gt;

过滤之后的显示效果:

 
2、DOM 标签过滤(strip_tags)

XSS漏洞的产生在大部分情况下是由于恶意攻击者构造了可执行脚本,将 DOM 标签过滤掉则可以防止攻击者构造完整的可执行脚本。

在PHP中可以使用strip_tags()函数过滤掉字符串中的HTML、XML以及PHP的标签。

<?php
declare(strict_types = 1);

$str = 'hello world <b> Hello HeiKe </b><a href="/">click</a>';
echo strip_tags($str);

过滤之后的源代码效果: hello world Hello HeiKe click

过滤之后的显示效果:

3、开启 HttpOnly防御XSS

修改php.ini中的配置项为 session.cookie_httponly = 1

开启 HttpOnly 可以在一定程度上保护用户的Cookie,减少出现 XSS 时的损失。

4、对Cookie进行ip绑定

用户登陆后对用户的Cookie 和 客户端IP进行绑定,即使Cookie被攻击这拦截,判断来源IP是否是登录时的用户IP,可以在一定程度上防止用户会话被劫持的风险。