}return $string ;
}
这个函数将HTML的特殊字符转换为了HTML实体,浏览器在渲染这段文本的时候以纯文本形式显示 。如bold会被显示为: BoldText 上述函数的核心就是htmlentities函数,这个函数将html特殊标签转换为html实体字符,这样可以过滤大部分的XSS攻击 。但是对于有经验的XSS攻击者,有更加巧妙的办法进行攻击:将他们的恶意代码使用十六进制或者utf-8编码,而不是普通的ASCII文本,例如可以使用下面的方式进行:
这样浏览器渲染的结果其实是:
a hrefhttps://www.04ip.com/post/= ""
SCRIPT Dosomethingmalicious
这样就达到了攻击的目的 。为了防止这种情况,需要在transform_HTML函数的基础上再将#和%转换为他们对应的实体符号,同时加上了$length参数来限制提交的数据的最大长度 。
使用SafeHTML防止XSS攻击
上述关于XSS攻击的防护非常简单,但是不包含用户的所有标记,同时有上百种绕过过滤函数提交javascript代码的方法,也没有办法能完全阻止这个情况 。目前,没有一个单一的脚本能保证不被攻击突破 , 但是总有相对来说防护程度更好的 。一共有两个安全防护的方式:白名单和黑名单 。其中白名单更加简单和有效 。一种白名单解决方案就是SafeHTML,它足够智能能够识别有效的HTML , 然后就可以去除任何危险的标签 。这个需要基于HTMLSax包来进行解析 。安装使用SafeHTML的方法:
1、前往 下载最新的SafeHTML
2、将文件放入服务器的classes 目录,这个目录包含所有的SafeHTML和HTMLSax库
3、在自己的脚本中包含SafeHTML类文件
4、建立一个SafeHTML对象
5、使用parse方法进行过滤
?php/* If you're storing the HTMLSax3.php in the /classes directory, along
with the safehtml.php script, define XML_HTMLSAX3 as a null string. */define(XML_HTMLSAX3, '' );// Include the class file.require_once ( 'classes/safehtml.php' );
// Define some sample bad code.
$data = https://www.04ip.com/post/This data would raise an alert
" ;// Create a safehtml object.$safehtml = new safehtml();// Parse and sanitize the data.$safe_data = https://www.04ip.com/post/$safehtml -parse( $data );// Display result. echo'The sanitized data is ' . $safe_data ;
?
SafeHTML并不能完全防止XSS攻击 , 只是一个相对复杂的脚本来检验的方式 。
使用单向HASH加密方式来保护数据
单向hash加密保证对每个用户的密码都是唯一的,而且不能被破译的,只有最终用户知道密码,系统也是不知道原始密码的 。这样的一个好处是在系统被攻击后攻击者也无法知道原始密码数据 。加密和Hash是不同的两个过程 。与加密不同,Hash是无法被解密的,是单向的;同时两个不同的字符串可能会得到同一个hash值,并不能保证hash值的唯一性 。MD5函数处理过的hash值基本不能被破解,但是总是有可能性的,而且网上也有MD5的hash字典 。
使用mcrypt加密数据MD5 hash函数可以在可读的表单中显示数据,但是对于存储用户的信用卡信息的时候,需要进行加密处理后存储,并且需要之后进行解密 。最好的方法是使用mcrypt模块,这个模块包含了超过30中加密方式来保证只有加密者才能解密数据 。
?php$data = "https://www.04ip.com/post/Stuff you want encrypted" ;
$key = "Secret passphrase used to encrypt your data" ;
$cipher = "MCRYPT_SERPENT_256" $mode = "MCRYPT_MODE_CBC" ;function encrypt( $data, $key , cipher , $mode ) {// Encrypt datareturn (string) base64_encode ( mcrypt_encrypt ( $cipher , substr (md5( $key ),0,mcrypt_get_key_size( $cipher , $mode )), $data , $mode , substr (md5( $key ),0,mcrypt_get_block_size( $cipher , $mode )) ) );
推荐阅读
- java输出菱形的代码,java输出菱形的代码有哪些
- kafka和redis吞吐量,kafka吞吐量一般多大
- python爬虫源码,python爬虫源码打包下载
- 无法连接服务器1500,无法连接服务器问题怎么解决
- go语言键盘消息 golang 消息
- 小程序约购商城是真的吗,预约小程序价格
- 尖叫惊魂角色扮演游戏,尖叫系列恐怖电影
- php获取数据库路径 php获取数据库路径命令
- 怎么查询案件视频号记录,怎么看案件审理的视频