防注入
更新时间:2024年9月16日 05:10
浏览:482
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);