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个人网站架设连环讲(四)
Oct 09 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
Mar 01 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
php创建、获取cookie及基础要点分析
Jan 26 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
php简单统计中文个数的方法
Sep 30 PHP
常用PHP封装分页工具类
Jan 14 PHP
关于PHP内置的字符串处理函数详解
Feb 04 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 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
来自PHP.NET的入门教程
2006/10/09 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
php whois查询API制作方法
2011/06/23 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
Python人脸识别初探
2017/12/21 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
opencv实现简单人脸识别
2021/02/19 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
python破解同事的压缩包密码
2020/10/14 Python
Django实现简单的分页功能
2021/02/22 Python
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
大学在校生求职信范文
2013/11/21 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
高中英语教学反思
2014/02/04 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang