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;";
"SELECT * FROM users WHERE username='{$name}'");
函数调用应该从用户表“名称”列中由用户指定的名称相匹配的检索记录。正常情况下,名称将只包含字母数字字符,或许空间,如字符串ilia。但在这里,通过追加一个全新的$name查询,调用数据库变成灾难:注入的DELETE查询删除用户的所有记录。
@H_502_0@有不允许查询堆叠或一个函数调用执行多个查询的数据库接口。如果尝试到堆叠查询调用失败,但sqlite和Postgresql里仍进行堆查询,执行在一个字符串中所有提供的查询,并创建一个严重的安全问题。防止sql注入:
@H_502_0@可以巧妙地处理所有的转义字符,像Perl和PHP脚本语言。编程语言PHP提供了函数字符串sqlite_escape_string()来转义输入的字符是特殊的sqlite字符。(get_magic_quotes_gpc()) { $name = sqlite_escape_string($name} $result );@H_502_0@虽然编码使得它的安全插入数据,它会呈现简单的文本比较LIKE子句在查询不能包含二进制数据的列。 @H_502_0@请注意,addslashes()不应该被用来引用sqlite 查询字符串,检索数据时,它会导致奇怪的结果。 原文链接:/sqlite/199025.html