Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1644|回复: 3
打印 上一主题 下一主题

预防XSS攻击的一些方法整理

[复制链接]

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
跳转到指定楼层
楼主
发表于 2019-7-14 19:29:50 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
XSS又称CSS,全称Cross SiteScript(跨站脚本攻击), XSS攻击类似于SQL注入攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie信息、破坏页面结构、重定向到其它网站等。
常见的恶意字符XSS输入:
1. XSS 输入通常包含 JavaScript 脚本,如弹出恶意警告框:<script>alert("XSS");</script>
2. XSS 输入也可能是 HTML 代码段,譬如:
(1) 网页不停地刷新 <meta http-equiv="refresh" content="0;">
(2) 嵌入其它网站的链接 <iframe src=http://xxxx width=250 height=250></iframe>
防止XSS攻击测试路径:
测试XSS攻击的工具:
对于PHP开发者来说,如何去防范XSS攻击呢?
对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var(),mysql_real_escape_string(),htmlentities(),htmlspecialchars(),strip_tags()这些函数都使用上了也不一定能保证绝对的安全。
那么如何预防 XSS 注入?主要还是需要在用户数据过滤方面得考虑周全,在这里不完全总结下几个 Tips
  • 假定所有的用户输入数据都是“邪恶”的
  • 弱类型的脚本语言必须保证类型和期望的一致
  • 考虑周全的正则表达式
  • strip_tags()、htmlspecialchars() 这类函数很好用
  • 外部的 Javascript 不一定就是可靠的
  • 引号过滤必须要重点注意
  • 除去不必要的 HTML 注释
  • Exploer 求你放过我吧……
方法一:利用php htmlentities()函数
php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数。
在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string)的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号("),不对单引号(')做转义。
所以,htmlspecialchars()函数更多的时候要加上第二个参数,应该这样用: htmlspecialchars($string,ENT_QUOTES)。当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT_NOQUOTES)。
另外,尽量少用htmlentities(), 在全部英文的时候htmlentities()和htmlspecialchars()没有区别,都可以达到目的。但是,中文情况下, htmlentities()却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。
htmlentities()和htmlspecialchars()这两个函数对单引号(')之类的字符串支持不好,都不能转化, 所以用htmlentities()和htmlspecialchars()转化的字符串只能防止XSS攻击,不能防止SQL注入攻击。
所有有打印的语句如echo,print等,在打印前都要使用htmlentities()进行过滤,这样可以防止XSS,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312)。
方法二:自定义过滤XSS攻击的函数
  1. /**
  2. * 防止XXS攻击
  3. * @param $string
  4. * @param $low 安全别级低
  5. */
  6. function clean_xss(&$string, $low = false) {
  7.     if (!is_array($string)) {
  8.         $string = trim($string);
  9.         $string = strip_tags($string);
  10.         $string = htmlspecialchars($string);
  11.         if ($low) {
  12.             return true;
  13.         }
  14.         $string = str_replace(array('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $string);
  15.         $no = '/%0[0-8bcef]/';
  16.         $string = preg_replace($no, '', $string);
  17.         $no = '/%1[0-9a-f]/';
  18.         $string = preg_replace($no, '', $string);
  19.         $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';
  20.         $string = preg_replace($no, '', $string);
  21.         return true;
  22.     }
  23.     $keys = array_keys($string);
  24.     foreach ($keys as $key) {
  25.         clean_xss($string[$key]);
  26.     }
  27. }

  28. $str = 'phpddt.com<meta http-equiv="refresh" content="0;">';
  29. clean_xss($str); // 如果你把这个注释掉,你就知道xss攻击的厉害了
  30. echo $str;
复制代码
https://www.ibm.com/developerworks/cn/opensource/os-cn-php-xss/

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-2 14:03 , Processed in 0.063422 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表