导读 | SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最普遍部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。 |
SQLite 注入html
若是您的站点容许用户经过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种状况的发生,确保脚本和 SQLite 语句的安全。linux
注入一般在请求用户输入时发生,好比须要用户输入姓名,但用户却输入了一个 SQLite 语句,而这语句就会在不知不觉中在数据库上运行。sql
永远不要相信用户提供的数据,因此只处理经过验证的数据,这项规则是经过模式匹配来完成的。在下面的实例中,用户名 username 被限制为字母数字字符或者下划线,长度必须在 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"; }
为了演示这个问题,假设考虑此摘录:To demonstrate the problem, consider this excerpt:编程
$name = "Qadir'; DELETE FROM users;"; @$db->query("SELECT * FROM users WHERE username='{$name}'");
函数调用是为了从用户表中检索 name 列与用户指定的名称相匹配的记录。正常状况下,$name 只包含字母数字字符或者空格,好比字符串 ilia。但在这里,向 $name 追加了一个全新的查询,这个对数据库的调用将会形成灾难性的问题:注入的 DELETE 查询会删除 users 的全部记录。安全
虽然已经存在有不容许查询堆叠或在单个函数调用中执行多个查询的数据库接口,若是尝试堆叠查询,则会调用失败,但 SQLite 和 PostgreSQL 里仍进行堆叠查询,即执行在一个字符串中提供的全部查询,这会致使严重的安全问题。服务器
防止 SQL 注入编程语言
在脚本语言中,好比 PERL 和 PHP,您能够巧妙地处理全部的转义字符。编程语言 PHP 提供了字符串函数 SQLite3::escapeString($string) 和 sqlite_escape_string() 来转义对于 SQLite 来讲比较特殊的输入字符。ide
注意:使用函数 sqlite_escape_string() 的 PHP 版本要求为 PHP 5 < 5.4.0。 更高版本 PHP 5 >= 5.3.0, PHP 7 使用以上函数:函数
SQLite3::escapeString($string);//$string为要转义的字符串
如下方式在最新版本的 PHP 中不支持:
if (get_magic_quotes_gpc()) { $name = sqlite_escape_string($name); } $result = @$db->query("SELECT * FROM users WHERE username='{$name}'");
虽然编码使得插入数据变得安全,可是它会呈现简单的文本比较,在查询中,对于包含二进制数据的列,LIKE 子句是不可用的。
请注意,addslashes() 不该该被用在 SQLite 查询中引用字符串,它会在检索数据时致使奇怪的结果。Linux就该这么学