开发文档 v2.x

防注入

更新时间:2022年8月26日 14:28 浏览:61

BE 数据库类提供了 quoteKey, quoteValue, escape 三个方法处理拼接到 sql 中的数据,在需要拼接 SQL 的操作中,我们都应该使用这些处理方法处理数据,以防止SQL注入。

  • quoteKey - 处理插入数据库的字段名或表名
  • quoteValue - 写入的值处理
  • escape - 写入的值处理 (不带外层引号)

在此前的示例代码中,编写的 SQL 均为 MySQL 版本,且未作任何防注入相关的处理,通过使用本文中介绍的方法,我们的 代码 将更加安全,并且不需做任何改动,就可以兼容 MySQL/MSSQL/Oracle 三种数据库

实际项目中,我们应尽可能的使用 表模型(Table)行模型(Tuple)进行数据库操作,这两种模型进行了完善的防注入处理。

 

quoteKey - 处理插入数据库的字段名或表名

public function quoteKey(string $field): string

参数:

  • string $field - 字段名或表名

返回值:

  • string - 处理后的字段名或表名

 

$db = Be;;getDb();

$sql = 'SELECT * 
        FROM ' . $db->quoteKey('user') . ' 
        WHERE ' . $db->quoteKey('age') . ' < 20' ;
// 根据数据库类型,将生成不同的SQL
// MySQL: SELECT * FROM `user` WHERE `age` < 20
// MSSQL: SELECT * FROM [user] WHERE [age] < 20
// Oracle: SELECT * FROM "user" WHERE "age" < 20

 

quoteValue - 写入的值处理

public function quoteValue($value): string

参数:

  • $value - 写入的值(字符或数字类型)

返回值:

  • string - 处理后的写入的值

 

$db = Be;;getDb();

$name = "abc'abc";
$sql = 'SELECT * 
        FROM ' . $db->quoteKey('user') . ' 
        WHERE ' . $db->quoteKey('name') . ' = ' .$db->quoteValue($name) ;
// 根据数据库类型,将生成不同的SQL
// MySQL: SELECT * FROM `user` WHERE `name` = 'abc\'abc'
// MSSQL: SELECT * FROM [user] WHERE [name] = 'abc\'\'abc'
// Oracle: SELECT * FROM "user" WHERE "name" = 'abc\'\'abc'

 

escape - 写入的值处理 (不带外层引号)

public function escape($value): string

参数:

  • string $field - 字段名或表名

返回值:

  • string - 处理后的字段名或表名

 

处理插入数据库的字符串值,防注入, 仅处理敏感字符,不加外层引号,

与 quoteValue 方法的区别可以理解为 quoteValue 比 escape 多了最外层的引号

$name = "abc'abc";

// 'abc\'abc'
$db->quoteValue($name);

// abc\'abc
$db->escape($name);

 

导航