CDatabase DB;
SQL.Format("{CALL InsertStoredProcedureXYZ('%s','%s')}", ParamStr1, ParamStr2);
DB.ExecuteSQL(SQL);
为查询做类似的事情:
CRecordset Recordset;
SQL.Format("{CALL QueryStoredProcedure('%s','%s')}", ParamStr1, ParamStr2);
Recordset.Open(CRecordset::forwardOnly, SQL, CRecordset::readOnly);
我担心这些语句使用的参数通常直接来自Web API参数。该代码进行了一些简单的参数筛选,主要是用“”替换为“”并验证字符串长度。
我相信
{call sp()}是ODBC的事情。我认为SQL-Server没有呼叫命令。因此,在调用存储过程之前,ODBC是否正在进行注射安全参数制备?我还知道,ODBC可以使用{call sp(?,?)}
来调用存储过程,然后是参数绑定。这似乎是更好的练习,但是对此进行更改将需要对项目代码准备呼叫声明的多次重构。
这个C ++ MFC ODBC代码似乎很老式,因此我未能找到任何可以告诉我我是否可以直接从API参数直接从API参数中构建{call sp()}字符串。这只是伪装成好习惯的糟糕的旧SQL声明大楼吗? 这个不安全。
我们看不到所有代码,但是由于注入的值被单个引号包围,因此我们可以得出结论,它们被粘贴到SQL批处理中,而不是以参数的形式发送。SQL.Format("{CALL InsertStoredProcedureXYZ('%s','%s')}", ParamStr1, ParamStr2);