【PHP面试题】SQL语句应该考虑哪些安全性?

文章目录

  • 一、考点
      • 1、SQL查询的安全方案
        • 1)使用预处理语句防SQL注入
        • 2)写入数据库的数据要进行特殊字符的转义
        • 3)查询错误信息不要返回给用户,将错误记录到日志
      • 2、延伸:MySQL的其他安全设置
  • 二、解题方法
  • 三、真题
      • 为什么使用PDO和MySQLi连接数据库会比MySQL函数库更加安全?

一、考点

1、SQL查询的安全方案

1)使用预处理语句防SQL注入

DELETE FROM `user` WHERE `id` = 1;

// SQL注入语句
DELETE FROM `user` WHERE `id`=1 or 1=1;

【PHP面试题】SQL语句应该考虑哪些安全性?_第1张图片

防止SQL注入:

DELETE FROM `user` WHERE `id`=?;

【PHP面试题】SQL语句应该考虑哪些安全性?_第2张图片


2)写入数据库的数据要进行特殊字符的转义

如:SQL语句中带 "",或者 ''的都需要进行转义,在应用层要进行处理,也是为了防止SQL语句的注入。


3)查询错误信息不要返回给用户,将错误记录到日志

注:不要将错误信息返回到应用中,应用中的信息会显示给用户,用户会获取到数据库中的信息,这样本身来说,就是一种不安全的显示,所以 在此过程中可以把错误屏蔽掉,记录到错误日志中,定期查询错误的时候,只要查看错误日志即可

注意:PHP端尽量使用 PDO 对数据库进行相关操作,PDO 拥有定义预处理语句很好的支持的方法,MySQLi 也有,但是可扩展性不如 PDO,效率略高于 PDOMySQL 函数在新版本中已经趋向于淘汰,所以不建议使用,而且它没有很好的支持预处理的方法。


2、延伸:MySQL的其他安全设置

  • 定期做数据备份;
  • 不给查询用户root权限,合理分配权限;
  • 关闭远程访问数据库权限(注:关闭远程访问数据库权限是为了防止数据库被暴力破解);
  • 修改root口令,不用默认口令,使用较复杂的口令;
  • 删除多余的用户;
  • 改变root用户的名称(改一个特殊的,让别人猜不到的名称);
  • 7)限制一般用户浏览其他库(如:现在有三个应用,每个应用建立自己独立的用户,不能去互相的访问对方的库);
  • 8)限制用户对数据文件的访问权限(我们都知道,所有MySQL的数据都存储在文件中,因此我们要对文件做一些权限的限制。如:有3个应用,每个应用都有自己各自的用户,各自的用户不光要限制其MySQL的权限,还要设置MySQL中 data目录下的每一个库的权限,每一个目录的权限)。

二、解题方法

通常情况下,SQL安全的考点都在防SQL注入的问题,因此只要遇到此类考点,优先考虑SQL注入的防护手段。


三、真题

为什么使用PDO和MySQLi连接数据库会比MySQL函数库更加安全?

  • 因为 PDOMySQLi 本身支持预处理;
  • 预处理本身就可以防止SQL注入,因此比MySQL函数库更加安全;
  • MySQL函数库本身是不支持预处理的。

你可能感兴趣的:(PHP面试题,MySQL数据库)