2011-06-01 47 views
5

我目前使用MySql,但宁愿使用ODBC解决方案使其成为未来的证明。如何清理ODBC数据库输入?

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

而且,当我在它的时候,我用双引号包裹我的字符串,例如, “INSERT INTO VALUES(介绍)‘’` - 但如果文字本身包含双引号

+1

你是指什么样的用户输入?例如,如果用户给你提供查询来运行,那么你就有很多工作要做。正如你所提到的,除了转义特殊字符之外,还需要注意诸如SQL注入之类的安全问题,并且您可能还想限制可接受的语句集(例如,不要允许DDL)。另一方面,如果用户只是给你提供数据,而你的应用程序使用ODBC将数据写入数据库,那么你不必做任何事情,因为数据和SQL语句不会混合。 – 2011-06-01 07:57:42

+1

可能重复的[Delphi - 预防SQL注入](http://stackoverflow.com/questions/6000648/delphi-prevent-against-sql-injection) – Johan 2011-06-01 08:58:27

+0

ODBC将**不会**使它成为未来的证明,它会让它慢下来,剥夺你的选择,并使其越野车。任何数量的替代品都可以,ZEOS可以连接大约10个数据库,ADO也可以。 – Johan 2011-06-01 22:03:59

回答

8

尝试使用参数化的SQL语句

这样。

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

检查本文从英巴卡迪诺有关如何使用参数Using Parameters in Queries.

+0

+1我试图按照http://docwiki.embarcadero.com/CodeExamples/en/ADOQuery_%28Delphi%29的例子,但我得到一个'_latin1'的例外我会发表另一个问题,要求帮助。 – Mawg 2011-06-05 04:42:37

3

使用hibernate如果可以的话,可能通过RMI从德尔福虽然它的Java为中心的,它几乎完全隔绝的程序员?底层的数据库,并处理您提到的问题和更多的问题。

btw,回答你的问题重新双引号,保存包含双引号的值,将它们转义为双引号,例如

This is "my" text 

将被保存为

"This is ""my"" text" 
+0

-1,首先是ODBC,而不是hibernate,需要多少级别的间接寻址,只需使用params和本地代码即可。 – Johan 2011-06-01 22:01:07

8
  1. ODBC不是使用MySQL的最佳方式。即使您将来需要支持少数DBMS,那么您也可以考虑使用dbExpress(附带Delphi)和3d方--DifRex(AnyDAC)(商业版),ZeosLib(免费软件)等多DBMS数据访问库。
  2. If您需要将字符串常量替换为MySQL查询,然后您需要esacape the special characters或将字符串转换为hexadecimal representation。这可以保护您免受可能的SQL注入和语法错误。但是使您的查询准备更加复杂。
  3. 最好的方法 - 使用参数并提交文字作为参数值。这很简单,安全。