PHP如何防止XSS攻击与XSS攻击原理的讲解


Posted in PHP onMarch 22, 2019

XSS又称CSS,全称Cross SiteScript(跨站脚本攻击), XSS攻击类似于SQL注入攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie信息、破坏页面结构、重定向到其它网站等。

理论上,只要存在能提供输入的表单并且没做安全过滤或过滤不彻底,都有可能存在XSS漏洞。

下面是一些最简单并且比较常见的恶意字符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攻击字符外,还可以绕过JavaScript校验,通过修改请求达到XSS攻击的目的,如下图:

PHP如何防止XSS攻击与XSS攻击原理的讲解

了解到XSS攻击的原理和危害后,其实要预防也不难,下面提供一个简单的PHP防止XSS攻击的函数:

<?PHP
/**
 * @param $string
 * @param $low 安全别级低
 */
function clean_xss(&$string, $low = False)
{
 if (! is_array ( $string ))
 {
 $string = trim ( $string );
 $string = strip_tags ( $string );
 $string = htmlspecialchars ( $string );
 if ($low)
 {
  return True;
 }
 $string = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $string );
 $no = '/%0[0-8bcef]/';
 $string = preg_replace ( $no, '', $string );
 $no = '/%1[0-9a-f]/';
 $string = preg_replace ( $no, '', $string );
 $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';
 $string = preg_replace ( $no, '', $string );
 return True;
 }
 $keys = array_keys ( $string );
 foreach ( $keys as $key )
 {
 clean_xss ( $string [$key] );
 }
}
//just a test
$str = 'codetc.com<meta http-equiv="refresh" content="0;">';
clean_xss($str); //如果你把这个注释掉,你就知道xss攻击的厉害了
echo $str;
?>

PHP中的设置

PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中

-----------------------------------------------------
session.cookie_httponly = 
-----------------------------------------------------

设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:

<?php ini_set("session.cookie_httponly", 1);  
// or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);  
?>

Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:

<?php 
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);  
setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); 
?>

老版本的PHP就不说了。没企业用了吧。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
URL Rewrite的设置方法
Jan 02 PHP
PHP 数组实例说明
Aug 18 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
php解析xml方法实例详解
May 12 PHP
Symfony2学习笔记之系统路由详解
Mar 17 PHP
PHP中list方法用法示例
Dec 01 PHP
PHP实现文件上传功能实例代码
May 18 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 PHP
php DES加密算法实例分析
Sep 18 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 #PHP
简单实用的PHP文本缓存类实例
Mar 22 #PHP
PHP设计模式之PHP迭代器模式讲解
Mar 22 #PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 #PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 #PHP
PHP里的$_GET数组介绍
Mar 22 #PHP
PHP匿名函数(闭包函数)详解
Mar 22 #PHP
You might like
PHP4实际应用经验篇(8)
2006/10/09 PHP
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
销售人员自我评价
2014/02/01 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
机电系毕业生求职信
2014/07/11 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
房屋过户委托书范本
2014/10/07 职场文书
关于迟到的检讨书
2015/05/06 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis