【问题标题】:How to sanitize ODBC database input?如何清理 ODBC 数据库输入?
【发布时间】:2011-09-06 01:42:11
【问题描述】:

我目前使用 MySql,但更喜欢 ODBC 解决方案以使其适应未来。

如何在将用户输入传递到 ODBC 数据库之前对其进行清理?

而且,当我这样做的时候,我将我的字符串用双引号括起来,例如"INSERT INTO VALUES(description) ""` - 但是如果文本本身包含双引号怎么办?

【问题讨论】:

  • 你是指什么样的用户输入?例如,如果用户向您提供要运行的查询,那么您有很多工作要做。除了转义特殊字符,正如您所提到的,您还需要注意 SQL 注入等安全问题,并且您可能还希望限制可接受的语句集(例如,不要允许 DDL。)另一方面,如果用户只是给你数据并且你的应用程序使用 ODBC 将数据写入数据库,那么你不需要做任何事情,因为数据和你的 SQL 语句不会混合。
  • ODBC 将不会让它成为未来的证明,它会让它变慢,剥夺你的选择,让它变得有问题。任何数量的替代方案都可以,ZEOS 可以连接到大约 10 个数据库,ADO 也可以。
  • @Johan:我们需要更多地了解 Mawg 的项目,然后才能确定 ODBC 将明显比某些特定的替代方案慢。确实,ODBC 会减少选项,但同样我们需要更多地了解该项目才能知道这是否可能是一个问题。虽然 ODBC 实现起来确实有点复杂,但我不敢直言不讳地说它会使项目出错。最后,ODBC 确实可以更容易地切换到不同的 DBMS,这与任何其他抽象几乎相同。
  • +1 谢谢。必须是 ODBC。我别无选择。如果我想让它被接受,我会被告知我需要支持多个数据库。

标签: mysql delphi odbc sanitization input-sanitization


【解决方案1】:

尝试使用参数化的 SQL 语句

像这样。

INSERT INTO MyTable (Field1,Field2) VALUES (:Param1,:Param2)

查看 embarcadero 的这篇文章,了解更多关于如何使用参数的信息Using Parameters in Queries.

【讨论】:

【解决方案2】:
  1. ODBC 不是使用 MySQL 的最佳方式。即使以后需要支持很少的DBMS,那么可以考虑多DBMS的数据访问库,包括dbExpress(Delphi自带)和3dparty-AnyDAC(商业),ZeosLib(免费软件)等。李>
  2. 如果需要将字符串常量替换为 MySQL 查询,则需要 esacape the special characters 或将字符串转换为 hexadecimal representation。这可以保护您免受可能的 SQL 注入和语法错误的影响。但会使您的查询准备更加复杂。
  3. 最好的方法 - 使用参数并提交文字作为参数值。这既简单又安全。

【讨论】:

    【解决方案3】:

    如果可以,请使用hibernate,也许通过delphi 的RMI。尽管它以 java 为中心,但它几乎完全将程序员与底层数据库隔离开来,并处理您提到的问题以及更多问题。

    顺便说一句,回答你关于双引号的问题,保存一个包含双引号的值,将它们转义为双引号,例如

    This is "my" text
    

    将被保存为

    "This is ""my"" text"
    

    【讨论】:

    • -1,先ODBC,比hibernate,要多少级间接,用params和native code就行了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2016-04-23
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多