XSS防御系统

xss攻击和漏洞防范

1.XSS防御

1.1完善的过滤体系

永远不相信用户的输入。需要对用户的输入进行处理,只允许输入合法的值,其它值一概过滤掉。

1.2 HTML转码的问题

XSS防御系统

比如用户输入:

1.将重要的cookie标记为http only, 这样的话Javascript

中的document.cookie语句就不能获取到cookie了.

2.只允许用户输入我们期望的数据。例如:年龄的textbox

中,只允许用户输入数字。而数字之外的字符都过滤掉。

3.对数据进行Html Encode 处理

4.过滤或移除特殊的Html标签,例如:

?XSS 输入也可能是HTML 代码段,譬如:

?网页不停地刷新

?嵌入其它网站的链接

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

测试工具

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

?Paros proxy (http://m.wendangku.net/doc/ebcc188c5a8102d277a22f6f.html)

?Fiddler (http://m.wendangku.net/doc/ebcc188c5a8102d277a22f6f.html/fiddler)

?Burp proxy (http://m.wendangku.net/doc/ebcc188c5a8102d277a22f6f.html/proxy/)

?TamperIE (http://m.wendangku.net/doc/ebcc188c5a8102d277a22f6f.html/dl/TamperIESetup.exe)

2防范SQL注入的具体方法

2.1打开magic_quotes_gpc或使用addslashes()函数

在新版本的PHP中,就算magic_quotes_gpc打开了,再使用addslashes()函数,也不会有冲突,但是为了更好的实现版本兼容,建议在使用转移函数前先检测magic_quotes_gpc 状态,或者直接关掉,代码如下:

PHP防范SQL注入的代码

1.// 去除转义字符

2.f unction stripslashes_array($array) {

3.i f (is_array($array)) {

4.f oreach ($array as $k => $v) {

5.$array[$k] = stripslashes_array($v);

6.}

7.} else if (is_string($array)) {

8.$array = stripslashes($array);

9.}

10.return $array;

11.}

12.@set_magic_quotes_runtime(0);

13.// 判断 magic_quotes_gpc 状态

14.if (@get_magic_quotes_gpc()) {

15.$_GET = stripslashes_array($_GET);

16.$_POST = stripslashes_array($_POST);

17.$_COOKIE = stripslashes_array($_COOKIE);

18.}

去除magic_quotes_gpc的转义之后再使用addslashes函数,代码如下:

PHP防范SQL注入的代码

$keywords = addslashes($keywords);

$keywords = str_replace("_","\_",$keywords);//转义掉”_”$keywords = str_replace("%","\%",$keywords);//转义掉”%”

后两个str_replace替换转义目的是防止黑客转换SQL编码进行攻击。

2.2强制字符格式(类型)

在很多时候我们要用到类似xxx.php?id=xxx这样的URL,一般来说$id都是整型变量,为了防范攻击者把$id篡改成攻击语句,我们要尽量强制变量,代码如下:

PHP防范SQL注入的代码

$id=intval($_GET[‘id’]);

当然,还有其他的变量类型,如果有必要的话尽量强制一下格式。

2.3 SQL语句中包含变量加引号

这一点儿很简单,但也容易养成习惯,先来看看这两条SQL语句:

SQL代码

SELECT * FROM article WHERE articleid='$id'

SELECT * FROM article WHERE articleid=$id

两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。

2.4 URL伪静态化

URL伪静态化也就是URL重写技术,像Discuz!一样,将所有的URL都rewrite成类似xxx-xxx-x.html格式,既有利于SEO,又达到了一定的安全性,也不失为一个好办法。但要想实现PHP防范SQL注入。

3 接口调用防攻击,防刷分等

3.1 接口加密的方式

在服务器端和客户端都保存加密的公钥和私钥,在客户端接口请求服务器要带上经过公钥和私钥加密的taken,然后在服务器端验证taken的有效性。

有权限的接口需要用户登录才能请求,在登录后会根据session_id和登录的taken来验证获取数据的合法性

XSS防御系统

3.2用户请求次数限制

在用户请求的合法性验证通过后,还会对每一个用户请求的次数有一个限制。

相关推荐
相关主题
热门推荐