首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用带有多个变量的CLR/C++时,如何防止SQL语句被SQL注入?

问在使用带有多个变量的CLR/C++时,如何防止SQL语句被SQL注入?
EN

Stack Overflow用户
提问于 2020-01-29 23:28:46
回答 2查看 166关注 0票数 1

在用CLR/C++编写SQL语句时,我遇到了一个不知道如何防止SQL注入的大问题,下面是代码

代码语言:javascript
复制
String^ sqlstr = "SELECT * FROM ";
sqlstr += tableName + " WHERE " + field + " = " + fieldEntity;

我需要能够向该语句输入正确的SQL注入预防措施。

后台代码

代码语言:javascript
复制
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"];
...
EN

回答 2

Stack Overflow用户

发布于 2020-01-30 00:20:33

有两种方法可以防止SQL注入,SQLCLR的环境不会改变这一点:

  1. 首选机制是使用参数化查询。不同的语言和库以不同的方式实现这一点,但至少您应该能够使用预准备语句。请注意,这不适用于无法接受变量的场景,例如代码中包含tableName和field。

请参阅:

  1. Issuing a Parameterized Query
  2. Using Stored Procedures

​

  1. 清理输入:

代码语言:javascript
复制
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?

​

票数 1
EN

Stack Overflow用户

发布于 2020-01-30 01:36:59

对于tableName和field变量,它们被用作查询中的SQL标识符。您不能使用查询参数的通用方法或转义。您只需确保将这些变量的值列入白名单。换句话说,根据数据库中已知的表和列的标识符检查它们。

对于另一个变量fieldEntity,我认为应该将其用作SQL查询中的常量值。您可以通过使用查询参数来防止SQL注入。

我不知道CLR,但在C++或C#中使用SQL查询参数的例子有很多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59970364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档