当前位置: 首页 > 面试题库 >

是否有一个用于清理PostgreSQL或SQL(对于FreePascal和Delphi)的查询参数的库?

慕容宇
2023-03-14
问题内容

当我尝试使用包含撇号的值来执行下面的PostgreSQL查询时,我咬了我的第一个sql转义错误(很早就应该这样做)。O'Brien,使用FreePascal和Lazarus

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查询参数?


问题答案:

您的应用程序容易受到称为SQL注入的严重安全问题的攻击。参见http://bobby-
tables.com/

当然,O'Brian会导致错误,但是那又如何');DROP SCHEMA public;--呢?还是');DELETE FROM users;--?第一个不起作用,因为您的应用程序 永远
不应以超级用户或拥有表的用户身份运行,但是很少有应用程序设计人员会努力做到这一点,并经常在生产环境中运行特权用户。第二个将在大多数应用程序中工作;有关详细信息,请参见帖子末尾。

最简单,最好的预防措施是在客户端库中使用 参数化语句 *。有关Delpi的信息,请参见以下示例:

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,最后一次在1995年编写了Pascal代码;我仅引用给出的示例)。

您当前正在做的是参数的 字符串插值 。这是非常危险的。仅当您具有强大的 SQL文字引号
功能时,才能安全地完成此操作,该功能不仅可以在两端使用引号,而且还可以处理其他转义符,加倍引用等。这是 强烈 最好使用参数化的语句。

这是我上面给出的示例的扩展。假设您正在按用户名进行用户的完全普通插入,其中“ Fred”是客户端输入的示例用户名:

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-然后是一条不执行任何操作的注释。摔得痛。你的数据到了。

*参数化声明有时被错误地称为 准备好的语句 。这是不正确的,因为没有必要对准备好的语句进行参数化,并且也不一定必须准备有参数化的语句。之所以引起这种混乱,是因为许多语言的数据库接口都没有提供一种使用参数化语句而不使用预准备语句的方法。



 类似资料:
  • 我正在处理一个电影数据集,该数据集有电影、genre和桥接表in_Genre的表。下面的查询试图查找两部电影之间的共同类型。我做了两个连接来获得流派列表,并做了一个交叉来找到常见的流派。有没有更有效率的办法? null

  • 我是JPA新手,这里是我的一个查询,我有几个参数作为查询的一部分,任何参数都可以是空值

  • 每个数字都应该大于或等于另一个数字。如果所有数字相等,则返回false。 例子: 通常的方式是不断地除以10,然后比较余数。 null null

  • 我在JPA repository类中编写了一个查询,如下所示: 上述查询的问题是,如果参数:和都为空,则需要获取所有记录,而这不会发生。到目前为止,没有获取任何记录。 基本上,我希望编写的查询能够正确地适用于所有情况,即参数和都采用空值和非空值。 在这方面,我已经了解了CriteriaBuilder的概念,但无法正确掌握该概念以实现我的案例。 有人能帮忙吗?谢谢 编辑 我已经在控制台中记录了查询,

  • 我想构建一个类似于< code>/cities的endpoint。population__gt=100000获取人口超过100,000的所有城市。 在FastAPI中最好的方法是什么?我不喜欢列举给定字段的所有可能的操作符,比如:

  • 可用的查询功能有: 我已经测试了isEqualTo,如果我设置一个字符串传入,这可以很好地工作,但我不能让它与列表一起工作。在官方的Firebase文档中似乎有一个IN函数,该函数将提供最多10项: https://firebase.google.com/docs/firestore/query-data/queries#in_and_array-contains-any 谢谢