我有一个可以由用户通过界面修改的数据库。对于一个字段(companyID),他们应该能够在字符串中将星号作为通配符放置。
例如,他们可以使用G378 *来代表以G378开头的任何公司ID。
现在,在我的客户端程序中,我提供了一个“完整”的companyID作为参数:
SELECT * FROM table WHERE companyID = '" + myCompanyID + "'
但是我必须检查通配符,有什么我可以添加到我的查询来检查这个。我不确定如何解释它,但它有点像我习惯的那样倒退。我可以修改我提供的值(完整的companyID)以匹配查询本身的通配符值吗?
我希望这有意义。
谢谢!
编辑:用户未使用SELECT
。用户仅使用INSERT
或UPDATE
,而THEY是将*放在字段中的用户。我的程序正在使用SELECT
,我只有完整的公司ID(没有星号)。
答案 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)
select * from table where companyid like replace(mycompanyid,'*','%');