2012-11-01 14 views
7

当我试图用包含撇号的值执行下面的PostgreSQL查询时,我咬了第一个sql转义错误(很久以前)。 O'Brien,使用FreePascal的和拉扎勒斯对于FreePascal和Delphi,是否有一个用于清理PostgreSQL或SQL的查询参数的库?

SQL.Add(format('select * from zones where upper(zn_name) >= %s and upper(zn_name) < %s order by zn_name',[sQuote(zoneMin), sQuote(zoneMax)])); 

在上述SQuote查询是一个封装在单引号的字符串的功能。是否有一些标准库用于清理Lazarus/FreePascal或Delphi的SQL查询参数?

+0

您可以使用'QuotedStr'函数(尝试sql注入...) – kobik

回答

16

您的应用程序容易受到严重类安全问题SQL injection的影响。见http://bobby-tables.com/

当然,O'Brian会导致错误,但');DROP SCHEMA public;--怎么办?或者');DELETE FROM users;--?第一个应该不起作用,因为你的应用程序应该是从来没有作为超级用户或拥有这些表的用户运行,但很少有应用程序设计人员努力实际执行此操作,并且经常运行生产中的特权用户。第二将在大多数应用程序中工作;详情请参阅帖子末尾。

最简单和最好的预防措施是在客户端库中使用参数化语句*。对于Delpi见this example

To use a prepared statement, do something like this: 

query.SQL.Text := 'update people set name=:Name where id=:ID'; 
query.Prepare; 
query.ParamByName('Name').AsString := name; 
query.ParamByName('ID').AsInteger := id; 
query.ExecSQL; 

(我从来没有用过Delphi和上次写的Pascal代码1995;我只是引述给出的例子)。

你现在在做什么是字符串插值的参数。这是非常危险的。只有当你有一个强大的引用SQL文字时,它才能安全地完成,它不仅在每一端都引用了引号,还处理了其他转义,引用加倍等。这是最后的手段;它的强烈最好使用参数化语句。


下面是我上面给出的示例的扩展。假设你正在做的用户名的用户,其中“弗雷德”是由客户端的例子用户名输入的非常普通的插入:​​

INSERT INTO users (user_name) VALUES ('Fred'); 

现在一些不愉快的人发送用户名');DELETE FROM users;--。突然,你的应用程序运行:

INSERT INTO users (user_name) VALUES ('');DELETE FROM users;--'); 

其展开后是:

INSERT INTO users (user_name) VALUES (''); 
DELETE FROM users; 
--'); 

,或者换句话说,把一个空字符串插入(虽然他们可以很容易地放在一个完全有效的用户名) ,然后是DELETE FROM users;语句 - 删除users中的所有行 - 然后是不执行任何操作的注释。啪。有你的数据。


*参数statemments有时错误地称为准备语句。这是不正确的,因为准备好的语句不一定是参数化的,并且参数化语句不一定准备好。由于许多语言的数据库接口没有提供使用参数化语句而不使用预处理语句的方式,所以引起了混淆。

+2

更进一步,类似的库设计存在于PHP(掌握它的第一步)和所有其他Web脚本语言。它还解决了字符串转义,不同DATE表示等问题。 “消毒”参数是临时的“穷人”替换,以清除参数分离。如果你看到某人的代码是“消毒”的,那么很可能他要么没有现代化的图书馆,要么就没有获得安全保障。 –

+0

我问过这个问题,因为我知道这是一个雷区,即使是那些认为他们有问题的人。我知道参数化查询,但想知道他们是否保证安全,一些更有知识的人也可以欺骗他们。 – vfclists

+2

@vfclists正确使用参数化查询将绝对防止SQL注入攻击*,除非动态SQL在数据库中执行*,例如PL/pgSQL'EXECUTE'语句。如果您在数据库中使用动态SQL,您还需要防止SQL注入,同时仔细使用'format'函数的'%I'格式说明符和'EXECUTE ... USING'。请参阅此问题的先前答案:http://stackoverflow.com/a/12995424/398670。 –

相关问题