文章目录
一、考点
1、SQL查询的安全方案
1)使用预处理语句防SQL注入
DELETE FROM `user` WHERE `id` = 1;
// SQL注入语句
DELETE FROM `user` WHERE `id`=1 or 1=1;
防止SQL注入:
DELETE FROM `user` WHERE `id`=?;
2)写入数据库的数据要进行特殊字符的转义
如:SQL语句中带
""
,或者''
的都需要进行转义,在应用层要进行处理,也是为了防止SQL语句的注入。
3)查询错误信息不要返回给用户,将错误记录到日志
注:不要将错误信息返回到应用中,应用中的信息会显示给用户,用户会获取到数据库中的信息,这样本身来说,就是一种不安全的显示,所以 在此过程中可以把错误屏蔽掉,记录到错误日志中,定期查询错误的时候,只要查看错误日志即可。
注意:PHP端尽量使用 PDO
对数据库进行相关操作,PDO
拥有定义预处理语句很好的支持的方法,MySQLi
也有,但是可扩展性不如 PDO
,效率略高于 PDO
,MySQL
函数在新版本中已经趋向于淘汰,所以不建议使用,而且它没有很好的支持预处理的方法。
2、延伸:MySQL的其他安全设置
- 定期做数据备份;
- 不给查询用户root权限,合理分配权限;
- 关闭远程访问数据库权限(注:关闭远程访问数据库权限是为了防止数据库被暴力破解);
- 修改root口令,不用默认口令,使用较复杂的口令;
- 删除多余的用户;
- 改变root用户的名称(改一个特殊的,让别人猜不到的名称);
- 7)限制一般用户浏览其他库(如:现在有三个应用,每个应用建立自己独立的用户,不能去互相的访问对方的库);
- 8)限制用户对数据文件的访问权限(我们都知道,所有MySQL的数据都存储在文件中,因此我们要对文件做一些权限的限制。如:有3个应用,每个应用都有自己各自的用户,各自的用户不光要限制其MySQL的权限,还要设置MySQL中
data
目录下的每一个库的权限,每一个目录的权限)。
二、解题方法
通常情况下,SQL安全的考点都在防SQL注入的问题,因此只要遇到此类考点,优先考虑SQL注入的防护手段。
三、真题
为什么使用PDO和MySQLi连接数据库会比MySQL函数库更加安全?
- 因为
PDO
和MySQLi
本身支持预处理;- 预处理本身就可以防止SQL注入,因此比MySQL函数库更加安全;
- MySQL函数库本身是不支持预处理的。