常见安全问题:php
恶意攻击,暴力破解;Sql注入;Xss攻击。html
Get方式恶意攻击,(dos),一般硬件的方式来防止,防火墙。mysql
Post方式暴力破解,从程序的角度来防止,最通用的方法就是增长验证码。程序员
黑客经过在表单中填入特殊的字符或者是 url中增长特殊的字符,而后想数据库发起请求,拼凑出sql语句,达到攻击的目的。sql
有两种形式:Post表单提交;Get的url传参。数据库
a.表单提交-万能密码 xxx' or '1数组
password = '$password'=>Password = ‘ xxx' or ‘1 ‘安全
如何防范万能密码呢?最简单的方式,就是给密码加密。加密的方式有不少,好比md5,sha1。 $password=md5($password)。less
或者用addslashes()和mysql_real_escape_string()等转义函数进行转义,通常addslashes()和mysql_real_escape_string()更经常使用。xss
万能用户名
如何防止万能用户名?不要加密,不可取。无论是万能用户名 和 万能密码, 他们都利用了 一个 特殊字符-------单引号,让你的单引号失去自己的意义。
单引号转义,使用addslashes函数。
经过上面的分析,咱们得出一个结论:凡是是用户提交的信息,都是不能相信的,都须要进行处理,其中之一就是转义。也就意味着在全部的 收集表单信息的地方,都要调用 addslashes函数。有没有更好的办法来处理呢?-------批量处理。
能够自定义有一个函数,用于批量转义。
要处理的数据的表现形式有如下几种:(1)单一变量(2)一维数组(3)二维数组(多维)综合成两种状况:单一变量和数组。定义以下:
//批量转义
function deepslashes($data){
//判断$data的表现形式,而且须要处理空的状况
if (empty($data)){
return $data;
}
//中高级程序员的写法
return is_array($data) ? array_map('deepslashes', $data) : addslashes($data) ;
/*
//初级程序员的写法
if (is_array($data)){
//数组,对其进行遍历
foreach ($data as $v){
return deepslashes($v);
}
} else {
//单一变量
return addslashes($data);
}
*/
}
遍历某个数组,而后对数组中的每一个元素,作了一个操做。PHP提供了一个函数 array_map,能够完成这个功能。
最终的sql语句,delete from cz_category where cat_id = 1,在后面追加一个字符 or 1,
delete from cz_category where cat_id = 1 or 1
灾难性的结果就出现了,全删除了。
因此,在接受get传参的时候,也须要处理一下,一般就是传递id的时候。处理方法很简单,只须要将参数转成整型便可。如 1 or 1 -----> 1
有哪些方式:强制转换,使用函数intval 或者 数据类型的 关键字 int; 隐式转换,经过运算,只须要 +0便可。
Xss: cross site script 跨站脚本攻击
Css 被占用,表示样式表
恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。
如何防止呢?找出xss攻击的本质,经过 标签(一对尖括号)来达到攻击的目的,因此咱们只须要将尖括号 进行 转义,这就是php中提到的 实体转义。
Htmlspecialchars函数 和 htmlentites函数
■'&' (ampersand) becomes '&'
■'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
■"'" (single quote) becomes ''' only when ENT_QUOTES is set.
■'<' (less than) becomes '<'
■'>' (greater than) becomes '>'
实体,好比咱们写的 ©
全部有表单输入的地方,都须要进行实体转义。定义一个辅助函数完成该功能
//批量实体转义
function deepspecialchars($data){
if (empty($data)){
return $data;
}
return is_array($data) ? array_map('deepspecialchars', $data) : htmlspecialchars($data);
}
结论:只要是用户的输入,都须要通过 引号转义 和 实体转义。因此咱们得进行双重验证。
//批量转义
function deepslashes($data){
//判断$data的表现形式,而且须要处理空的状况
if (empty($data)){
return $data;
}
//中高级程序员的写法
return is_array($data) ? array_map('deepslashes', $data) : addslashes($data) ;
}
//批量实体转义
function deepspecialchars($data){
if (empty($data)){
return $data;
}
return is_array($data) ? array_map('deepspecialchars', $data) : htmlspecialchars($data);
}
项目日志:有的时候,和数据库相关的一些操做,sql语句并无出错,可是结果不对。如何排除这个错误:须要打印sql语句,而后将sql放到 cmd(phpmyadmin)中执行。
若是每次都要打印,是很麻烦的一件事情。有一个简单有效的办法,就是将sql语句以日志的形式记录下来,便于查看。
//生成日志
function query($sql){
//还能够加一个开关来开启/关闭 sql日志
//以追加的方式来保存
$temp = "[" . date('Y-m-d H:i:s') ."] " . $sql . PHP_EOL;
file_put_contents("log.txt", $temp,FILE_APPEND);
}
日志结果以下: