SQL通配符问题

时间:2012-05-16 17:31:32

标签: sql

我有一个可以由用户通过界面修改的数据库。对于一个字段(companyID),他们应该能够在字符串中将星号作为通配符放置。

例如,他们可以使用G378 *来代表以G378开头的任何公司ID。

现在,在我的客户端程序中,我提供了一个“完整”的companyID作为参数:

SELECT * FROM table WHERE companyID = '" + myCompanyID + "'

但是我必须检查通配符,有什么我可以添加到我的查询来检查这个。我不确定如何解释它,但它有点像我习惯的那样倒退。我可以修改我提供的值(完整的companyID)以匹配查询本身的通配符值吗?

我希望这有意义。

谢谢!

编辑:用户未使用SELECT。用户仅使用INSERTUPDATE,而THEY是将*放在字段中的用户。我的程序正在使用SELECT,我只有完整的公司ID(没有星号)。

3 个答案:

答案 0 :(得分:3)

这是一个经典的SQL Injection目标!你应该很高兴你现在找到它。

回到您的问题,当用户输入'*'时,请将其替换为'%',并在查询中使用LIKE代替=

例如,当最终用户输入"US*123"时,请运行此查询:

SELECT * FROM table WHERE companyID LIKE @companyIdTemplate

@companyIdTemplate参数设置为"US%123",然后运行查询。

我在示例中使用了.NET的@,但查询参数以特定于您的托管语言的方式表示。例如,它们在Java中变为?。查看任何关于使用参数化查询的DB编程教程,了解它是如何在您的系统中完成的。

编辑:如果您想基于指定另一个表中的记录的通配符执行插入,您可以执行insert-from-select,就像这样:

INSERT INTO CompanyNotes (CompanyId, Note)
   SELECT c.companyId, @NoteText
   FROM Company c
   WHERE c.companyId LIKE 'G378%'

对于ID为@NoteText的每家公司,这会将CompanyNotes参数值的记录插入"G378%"表。

答案 1 :(得分:0)

这在某种程度上取决于实现,你没有提到你正在处理哪种类型的SQL。但是,查看MS SQL Server通配符包括%(对于任意数量的字符)或_(对于单个字符)。通配符仅在与"类似"使用时被评估为通配符。而不是=比较。但是你可以传入一个包含通配符的参数,并且只要你使用"就像#34;

一样将它评估为通配符。

答案 2 :(得分:0)

在TSQL中我会使用replace和like。即:

select * from table where companyid like replace(mycompanyid,'*','%');