三个安全问题:
恶意攻击
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()函数
在获取用户数据到时候,使用函数进行实体转义,如下:
这样就可以防止了。
看转义之后的结果:
转成实体了,
空格:
版权:©
< : < 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如下:
就可以在控制器中,引入辅助函数,完成转义。