来自WCF服务的SQL查询在查询视图时避免使用SQL注入

时间:2017-05-26 06:28:51

标签: c# sql sql-server sql-injection

我有来自其他项目的类,这些项目包含SQL查询字符串。

参见我的例子

public class OtherClass
{
    myQuery = "SELECT * FROM v_My_View WHERE code = '@code'";
    // I am targeting a view, not a stored procedure
}

我的问题是,如果我在我的commandText中使用它并且只是用值替换@code,这是针对SQL注入的有效参数吗?

如果SQL注入容易受到攻击 - 它的其他选择是什么?

我尝试使用

CMD.Parameters.AddWithValue("@code", _obj.code) 

但它破坏了我的疑问。

我在访问存储过程时使用参数,但在访问我的视图时却没有。

这是我的主要内容:

public class Main
{
    public DataTable myMethod()
    {
        try
        {
            DataTable myTable = new DataTable("MyDataTable");

            using (SqlCommand CMD = new SqlCommand())
            {
                CMD.Connection = RBOSUtil.DBConnection();
                CMD.CommandType = CommandType.Text;

                // this is the part I used the string from other class
                CMD.CommandText = OtherClas.myQuery.Replace("@code", _obj.code);

                using (SqlDataAdapter DA = new SqlDataAdapter(CMD))
                {
                    DA.Fill(myTable);
                }
            }
        }
        catch
        {
            throw;
        }
        finally
        {
            //close connection
        }

        return myTable;
    }
}

2 个答案:

答案 0 :(得分:2)

使用此

 public class Main
    {
        public DataTable myMethod()
        {
            DataTable myTable = new DataTable("MyDataTable");

            try
            {
                using (SqlCommand CMD = new SqlCommand())
                {
                    CMD.Connection = RBOSUtil.DBConnection();
                    CMD.CommandType = CommandType.Text;
                    //this is the part I used the string from other class
                    CMD.CommandText = OtherClas.myQuery;
                    CMD.Parameters.Add("@code", SqlDbType.NVarChar).value = _obj.code;
                    using (SqlDataAdapter DA = new SqlDataAdapter(CMD))
                    {
                        DA.Fill(myTable);
                    }
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                //close connection
            }
            return myTable;
        }
    }

在尝试

之前声明数据表

答案 1 :(得分:1)

SQL语句中的参数名称不需要引号: myQuery = "SELECT * FROM v_My_View WHERE code = @code";。否则你所做的一切对我来说都很好。它应该工作。

编辑:我对原始问题和拉维的答案感到困惑。不知怎的,我错过了问题和第一个答案之间的分隔符。无论如何,要回答原始问题,是的,使用String.Replace将@code替换为值会受到SQL注入漏洞的影响。

您应该使用SQL参数,例如Ravi答案中的代码,但您还需要修改查询以删除参数名称周围的引号。