将带有撇号和通配符的参数从C ++传递到SQL

时间:2015-08-20 15:16:03

标签: sql-server devart borland-c++

下午全部

我一直致力于应用程序的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论坛上发帖,如果得到回复,我会报告回来。

1 个答案:

答案 0 :(得分:1)

此处的一个选项是验证用户输入。浏览输入并删除任何无效字符或返回错误并删除整个输入/事务。