下午全部
我一直致力于应用程序的dll扩展,它是关于客户活动的报告,第一部分是用户搜索以查找客户。
查询本身工作正常但是当我试图通过参数传递使其成为SQL注入证明时,我无法使其工作。
我尝试在主查询中使用撇号和通配符,但是当我执行q-> Params-> ParamByName(“ID”) - > AsString = param函数时抛出一个异常,说它无法找到参数我已经证实是撇号的影响。当我传入撇号和通配符作为参数的一部分,如下所示,没有错误,但查询没有返回任何内容。
我试过逃避撇号和通配符,但它没有任何区别。
如果我需要提供更多信息,请告诉我。
TStringList* SQLString = new TStringList;
SQLString->Add("select p.id, p.givenName, p.surname, p.dateOfBirth, vm.MaxRowDate ");
SQLString->Add("from ( ");
SQLString->Add(" select pid, customer_systemID, customer_dbID, max(datetime) as MaxRowDate ");
SQLString->Add(" from Visit ");
SQLString->Add(" group by pid, customer_systemID, customer_dbID");
SQLString->Add(" ) vm ");
SQLString->Add("inner join Customer p ");
SQLString->Add("ON vm.pid = p.pid ");
SQLString->Add("and vm.customer_systemID = p.systemID ");
SQLString->Add("and vm.customer_dbID = p.databaseID ");
AnsiString joiningTerm("where ");
if(id != "")
{
SQLString->Add(joiningTerm+"id like :ID ");
joiningTerm = "and ";
}
SQLString->Add("order by surname ");
TMSQuery* q;
try
{
try
{
q = new TMSQuery(NULL);
q->Connection = _db;
q->SQL->Assign(SQLString);
if(id != "")
{
AnsiString param("'%"+id+"%'");
q->Params->ParamByName("ID")->AsString = param;
}
q->Open();
这是我的原始SQL查询:
SELECT p.id, p.givenName, p.surname, p.dateOfBirth, vm.MaxRowDate
FROM
(
SELECT pid, customer_systemID, customer_dbID, MAX(DATETIME) AS MaxRowDate
FROM Visit
GROUP BY pid, customer_systemID, customer_dbID
) vm
INNER JOIN Customer p
ON vm.pid = p.pid AND vm.customer_systemID = p.systemID AND vm.customer_dbID = p.databaseID
编辑:有人向我建议,这可能是图书馆的限制。我将在Devart论坛上发帖,如果得到回复,我会报告回来。
答案 0 :(得分:1)
此处的一个选项是验证用户输入。浏览输入并删除任何无效字符或返回错误并删除整个输入/事务。