PHP项目常见的安全问题

常见安全问题:恶意攻击,暴力破解;Sql注入;Xss攻击。

(1)恶意攻击,暴力破解

Get方式恶意攻击,(dos),通常硬件的方式来防止,防火墙。

Post方式暴力破解,从程序的角度来防止,最通用的方法就是增加验证码。

(2)Sql注入

黑客通过在表单中填入特殊的字符或者 url中增加特殊的字符,然后想数据库发起请求,拼凑出sql语句,达到攻击的目的。

有两种形式:Post表单提交;Get,url传参。

a.表单提交-万能密码   xxx' or '1




password = '$password'=>Password = ‘ xxx' or ‘1 ‘

如何防范万能密码呢?最简单的方式,就是给密码加密。加密的方式有很多,比如md5,sha1。  $password=md5($password)。

或者用addslashes()和mysql_real_escape_string()等转义函数进行转义,一般addslashes()和mysql_real_escape_string()更常用。


万能用户名



如何防止万能用户名?不要加密,不可取。不管是万能用户名  万能密码, 他们都利用了 一个 特殊字符-------单引号,让你的单引号失去本身的意义。

单引号转义,使用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,可以完成这个功能。



b.Get提交方式的攻击,Url 传递参数,然后在程序中接受参数,并构造sql语句


最终的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即可。

(3).Xss攻击

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放到 cmdphpmyadmin)中执行。

如果每次都要打印,是很麻烦的一件事情。有一个简单有效的办法,就是将sql语句以日志的形式记录下来,便于查看。

//生成日志
function query($sql){
//还可以加一个开关来开启/关闭 sql日志
//以追加的方式来保存
	$temp = "[" . date('Y-m-d H:i:s') ."] " . $sql . PHP_EOL;
	file_put_contents("log.txt", $temp,FILE_APPEND);
}

日志结果如下:





 




  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值