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 相关文章推荐
15种PHP Encoder的比较
Mar 06 PHP
PHP优于Node.js的五大理由分享
Sep 15 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
thinkphp循环结构用法实例
Nov 24 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
PHP实现的多维数组排序算法分析
Feb 10 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
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
js 分栏效果实现代码
2009/08/29 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
详解Django中的过滤器
2015/07/16 Python
Django model序列化为json的方法示例
2018/10/16 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python如何快速拼接字符串
2020/10/28 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
大学生村官座谈会发言材料
2014/05/25 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
公司周年庆典致辞
2015/07/30 职场文书
pytorch 使用半精度模型部署的操作
2021/05/24 Python
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS