项目安全(三种攻击方式),批量操作html标签转义

三个安全问题:
恶意攻击
SQL注入
XSS攻击
(1).恶意攻击
请求:
get方式,通过url,dos攻击,通常是从硬件和网络的角度,防火墙。(程序员不用管)
post方式,通过表单提交,穷举法,恶意破解,灌水。从程序的角度来防止。可以使用验证码
在我们的项目中添加验证码。
(2).SQL注入攻击
在请求的时候,输入一些特殊的字符,然后构造可以执行的sql语句,达到攻击的目的。
Post请求
Get请求

A.POST请求—表单提交
以登录为例,

万能密码
在这里插入图片描述
输出对应的sql语句如下:
在这里插入图片描述
在这里插入图片描述
如何防范呢?
最简单的办法,就是对密码加密。md5加密
在这里插入图片描述
再次使用万能密码,结果如下:
在这里插入图片描述
这样一来,就可以防止住了。
密码加密的原因:
防止万能密码攻击
保护用户的隐私
正常登录,只能使用admin用户了。

B.万能用户名
在用户名的输入框中,输入特殊的字符:
在这里插入图片描述
对应的sql语句如下:
在这里插入图片描述
请问,如何防止?
用户名不要加密,此路不通。(后台看用户名会乱的)

问题的本质:
xxx’ or ‘1
xxx’ or 1#
关键是单引号,让单引号失效,可以将其转义,通常有两种:
在php的层面来转义,php提供addslashes()函数
在mysql的层面来转义,mysql扩展提供的mysql_real_escape_string()函数

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(’)
双引号(")
反斜杠(\)
NULL
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
此处,我用第一种。
在这里插入图片描述
对应的sql语句如下:
在这里插入图片描述
如此一来,就可以防止住了。

结论:千万不要相信用户的输入,对用户的输入一定要做验证和处理。

B.GET请求
看一个例子,localhost/shopcz/index.php?p=admin&c=category&a=delete&cat_id=7 or 1
请求,拼接的sql语句如下:
delete form cz_category where cat_id = 7 or 1;
后果很严重,全部删除了, 非常不安全。

所以,需要处理,如何处理?
需要将其转成整型?
强制转换,(int) 变量 ,使用intval()函数
隐式转化,让其参与运算,用 +
在这里插入图片描述
(3).XSS攻击
什么xss攻击
XSS:Cross Site Script,跨站脚本攻击。
恶意攻击者往Web页面里插入恶意html和JavaScript代码,当用户浏览该页之时,嵌入其中Web里面的html和JavaScript代码会被执行,从而达到恶意攻击用户的特殊目的。
演示:
在分类显示时,输出分类描述在 是否显示导航栏 一栏中,如下:
在这里插入图片描述

在这里插入图片描述
再比如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再比如,输入html代码,如下:
在这里插入图片描述
结果如下:
在这里插入图片描述
再次说明:用户的输入是不可信的。

如何防范?
本质,都是html标签惹的祸。
措施:对html标签进行实体转义,在php中,有两个函数可以完成这个功能:
htmlspecialchars()函数
htmlentities()函数
在这里插入图片描述
在获取用户数据到时候,使用函数进行实体转义,如下:
在这里插入图片描述
这样就可以防止了。
看转义之后的结果:
在这里插入图片描述
转成实体了,
空格: 
版权:©
< : &lt; less than
>: $gt; greater than
在这里插入图片描述
最后解析成如下样子:
在这里插入图片描述
定义辅助函数完成批量转义
考虑一个新的问题,其实在有表单提交的时候,每个表单域,都需要做处理,如何实现,比较方便呢?
能不能实现批量操作呢?批量实体转义,批量单引号转义

需要自己定义方法实现之。
转义的目标,有多种形式:
单个变量
一维数组
多维数组,批量插入,$_FILES,checkbox

二维 —> 一维 —> 单个变量(利用递归)

<?php
//批量实体转义
function deepspecialchars($data){
	if (empty($data)) {
		return $data;
	}
	
	
	//第一种初级程序员的写法
	array('username'=>'zs','email'=>'zs@163.com')//举例
	if (is_array($data)) {
		//数组
		foreach ($data as $k => $v) {
			$data[$k] = deepspecialchars($v);
		}
		return $data;
	} else {
		//单个变量
		return htmlspecialchars($data);
	}
	//中高级程序员的写法
	return is_array($data) ? array_map('deepspecialchars',$data) : htmlspecialchars($data);
	}

array_map的用法
在这里插入图片描述
Demo如下:
在这里插入图片描述
就可以在控制器中,引入辅助函数,完成转义。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值