在用CLR/C++编写SQL语句时,我遇到了一个不知道如何防止SQL注入的大问题,下面是代码
String^ sqlstr = "SELECT * FROM ";
sqlstr += tableName + " WHERE " + field + " = " + fieldEntity;我需要能够向该语句输入正确的SQL注入预防措施。
后台代码
class database
{
protected:
string fieldEntity;
string tableName;
string field;
...
____
OleDbDataReader^ openData(String^ fieldEntity, String^ field, String^ tableName)
{
String^ sqlstr = "SELECT * FROM ";
sqlstr += tableName + " WHERE " + field + " = " + fieldEntity;
...
___
OleDbDataReader^ reader2 = testData.openData(effectID, "effectID", "effectOnUser");
while (reader2->Read())
{
Object^ dHealthptr = reader2["effectOnHealth"];
Object^ dTirednessptr = reader2["effectOnTiredness"];
Object^ dHappinessptr = reader2["effectOnHappiness"];
...发布于 2020-01-30 00:20:33
有两种方法可以防止SQL注入,SQLCLR的环境不会改变这一点:
tableName和field。请参阅:
1. Bare minimum, and by far the most common, requirement is to escape single quotes by doubling them (i.e. `'` becomes `''`)
2. Additionally (below is a quote from a related answer of mine on DBA.StackExchange): 还有一种不太为人所知的攻击类型,攻击者试图用撇号填充输入字段,使得存储过程中用于构造动态A18的字符串无法容纳所有内容,并推出结束撇号,并以某种方式以正确数量的撇号结束,从而不再在字符串中“转义”。这就是所谓的SQL截断,Bala Neerumalla在MSDN杂志的一篇题为“新的SQL截断攻击和如何避免它们”的文章中谈到了这一点,但这篇文章已经不在线了。包含本文的问题- November, 2006 edition of MSDN Magazine -仅以Windows帮助文件( .chm格式)提供。如果下载它,由于默认的安全设置,它可能无法打开。如果发生这种情况,则右键单击MSDNMagazineNovember2006en-us.chm文件并选择“属性”。在其中一个选项卡中,将有一个“信任此类型的文件”(或类似的选项)的选项,需要选中/启用。单击“确定”按钮,然后再次尝试打开.chm文件。
因此,一定要适当地调整字符串输入参数的大小。声明为VARCHAR(25)的列不需要VARCHAR(500)。有关更多详细信息和示例,请参阅我在DBA.StackExchange上的回答:Why does SQL Injection not happen on this query inside a stored procedure?
发布于 2020-01-30 01:36:59
对于tableName和field变量,它们被用作查询中的SQL标识符。您不能使用查询参数的通用方法或转义。您只需确保将这些变量的值列入白名单。换句话说,根据数据库中已知的表和列的标识符检查它们。
对于另一个变量fieldEntity,我认为应该将其用作SQL查询中的常量值。您可以通过使用查询参数来防止SQL注入。
我不知道CLR,但在C++或C#中使用SQL查询参数的例子有很多。
https://stackoverflow.com/questions/59970364
复制相似问题