
- SQLite 教程
- SQLite - 首页
- SQLite - 概述
- SQLite - 安装
- SQLite - 命令
- SQLite - 语法
- SQLite - 数据类型
- SQLite - 创建数据库
- SQLite - 附加数据库
- SQLite - 分离数据库
- SQLite - 创建表
- SQLite - 删除表
- SQLite - INSERT 查询
- SQLite - SELECT 查询
- SQLite - 运算符
- SQLite - 表达式
- SQLite - WHERE 子句
- SQLite - AND & OR 子句
- SQLite - UPDATE 查询
- SQLite - DELETE 查询
- SQLite - LIKE 子句
- SQLite - GLOB 子句
- SQLite - LIMIT 子句
- SQLite - ORDER BY 子句
- SQLite - GROUP BY 子句
- SQLite - HAVING 子句
- SQLite - DISTINCT 关键字
- 高级 SQLite
- SQLite - PRAGMA
- SQLite - 约束
- SQLite - JOIN
- SQLite - UNION 子句
- SQLite - NULL 值
- SQLite - 别名语法
- SQLite - 触发器
- SQLite - 索引
- SQLite - INDEXED BY 子句
- SQLite - ALTER 命令
- SQLite - TRUNCATE 命令
- SQLite - 视图
- SQLite - 事务
- SQLite - 子查询
- SQLite - AUTOINCREMENT
- SQLite - 注入
- SQLite - EXPLAIN
- SQLite - VACUUM
- SQLite - 日期和时间
- SQLite - 常用函数
- SQLite 有用资源
- SQLite - 快速指南
- SQLite - 有用资源
- SQLite - 讨论
SQLite - 注入
如果您通过网页获取用户输入并将其插入 SQLite 数据库,则您可能面临一个称为 SQL 注入的安全问题。在本节中,您将学习如何帮助防止这种情况发生,并帮助您保护您的脚本和 SQLite 语句。
注入通常发生在您向用户索取输入(例如他们的姓名)时,他们提供的不是姓名,而是一个您会在不知情的情况下在数据库上运行的 SQLite 语句。
永远不要相信用户提供的数据,只有在验证之后才能处理这些数据;通常,这是通过模式匹配来完成的。在下面的示例中,用户名被限制为字母数字字符加下划线,长度在 8 到 20 个字符之间 - 根据需要修改这些规则。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){ $db = new SQLiteDatabase('filename'); $result = @$db->query("SELECT * FROM users WHERE username = $matches[0]"); } else { echo "username not accepted"; }
为了演示这个问题,请考虑以下摘录:
$name = "Qadir'; DELETE FROM users;"; @$db->query("SELECT * FROM users WHERE username = '{$name}'");
该函数调用应该从 users 表中检索一条记录,其中 name 列与用户指定的 name 匹配。在正常情况下,$name 只包含字母数字字符和空格,例如字符串 ilia。但是,在这种情况下,通过将一个全新的查询附加到 $name,对数据库的调用变成了灾难:注入的 DELETE 查询删除了 users 中的所有记录。
有些数据库接口不允许查询堆叠或在单个函数调用中执行多个查询。如果您尝试堆叠查询,则调用会失败,但 SQLite 和 PostgreSQL 会愉快地执行堆叠查询,执行在一个字符串中提供的所有查询,并造成严重的安全问题。
防止 SQL 注入
您可以在 PERL 和 PHP 等脚本语言中巧妙地处理所有转义字符。编程语言 PHP 提供函数 sqlite_escape_string() 来转义对 SQLite 特殊的输入字符。
if (get_magic_quotes_gpc()) { $name = sqlite_escape_string($name); } $result = @$db->query("SELECT * FROM users WHERE username = '{$name}'");
尽管编码使插入数据安全,但对于包含二进制数据的列,它将使简单的文本比较和查询中的 LIKE 子句无法使用。
注意 - addslashes() 不应用于为 SQLite 查询引用字符串;这会在检索数据时导致奇怪的结果。