首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法停止SQL注入错误

无法停止SQL注入错误
EN

Stack Overflow用户
提问于 2015-05-29 12:08:50
回答 1查看 80关注 0票数 1

我终于明白了。它不仅是我用来执行ExecuteScalar方法的代码,而且主要是执行类的上游代码流。这是一切都叫你的代码。这就是说,请有人看看执行my类的代码是否有错误。我还是不能通过扫描。首先,我将向您展示调用我的代码的代码的两个示例,然后是调用代码,最后是执行代码,这是我从上一篇文章中制定和显示的。

具有三个参数的调用代码:

代码语言:javascript
运行
复制
public bool isTamAsp(int aspKey, int fy, string accountCode)
{
    MyParam myParam;

    string sqlQuery = "select isTamMacom = count(macom_key) FROM hier_fy " +
        "WHERE hier_key = @aspKey AND fy = @fy  AND @accountCode NOT IN (3,4,7,8) AND macom_key IN (select hier_key from lkup_e581_MacomThatRequireTAM) AND is_visible = 1 AND is_active = 1";

    QueryContainer Instance = new QueryContainer(sqlQuery);

    myParam = new MyParam();

    myParam.SqlParam = new SqlParameter("@aspKey", Instance.AddParameterType(_DbTypes.Int));

    myParam.SqlParam.Value = aspKey;

    Instance.parameterList.Add(myParam);

    myParam = new MyParam();

    myParam.SqlParam = new SqlParameter("@fy", Instance.AddParameterType(_DbTypes.Int));

    myParam.SqlParam.Value = fy;

    Instance.parameterList.Add(myParam);

    myParam = new MyParam();

    myParam.SqlParam = new SqlParameter("@accountCode", Instance.AddParameterType(_DbTypes._string));

    myParam.SqlParam.Value = accountCode;

    Instance.parameterList.Add(myParam);

    if (Convert.ToInt32(ExecuteScaler(Instance)) < 1)
        return false;

    return true;
}

没有参数的调用代码:

代码语言:javascript
运行
复制
public long GetMarinesUploadNextUploadKey()
{
    string query = "SELECT MAX(upload_key) FROM temp_auth_usmc_upload";

    QueryContainer Instance = new QueryContainer(query);

    string result = Convert.ToString(ExecuteScaler(Instance));
    if (string.IsNullOrEmpty(result))
        return 1;
    else
        return Convert.ToInt64(result) + 1;
} 

代码用三个参数调用我以前的代码:

代码语言:javascript
运行
复制
public bool isTamAsp(int aspKey, int fy, string accountCode)
{
    return e581provider.isTamAsp(aspKey, fy, accountCode);
}

方法调用执行我的代码的SQL:

代码语言:javascript
运行
复制
DbCommand command = _provider.CreateCommand();

command.Connection = _connection;
{
    command.CommandText = Instance.Query;
    command.CommandType = CommandType.Text;

    if (Instance.parameterList.Count > 0)
    {
        foreach (var p in Instance.parameterList)
        {
            command.Parameters.Add(p.SqlParam);
        }
    }

    if (_useTransaction) { command.Transaction = _transaction; }

    try
    {
        returnValue = command.ExecuteScalar();
    }

包含SQL字符串和cmd参数列表的My

代码语言:javascript
运行
复制
public enum _DbTypes
{
    Int = 1, _string = 2, _long = 3, _bool = 4, _DateTime = 5,
    _decimal = 6, _float = 7, _short = 8, _bite = 9
} 

public class MyParam
{
    public SqlParameter SqlParam { get; set; }
}
/// <summary>
/// Summary description for QueryContainer SGH
/// </summary>
public class QueryContainer
{

    string _query;

    public List<MyParam> parameterList = new List<MyParam>();

    public QueryContainer(string query) { _query = query; }

    public SqlDbType AddParameterType(_DbTypes id)
    {
        switch (id)
        {
            case _DbTypes.Int:
                return (SqlDbType)Enum.Parse(typeof(SqlDbType), "int", true);
            case _DbTypes._string:
                return (SqlDbType)Enum.Parse(typeof(SqlDbType), "NVarChar", true);
            case _DbTypes._long:
                return (SqlDbType)Enum.Parse(typeof(SqlDbType), "SqlDbType.BigInt", true);
            case _DbTypes._bool:
                return (SqlDbType)Enum.Parse(typeof(SqlDbType), "SqlDbType.Bit", true);
        }

        return SqlDbType.VarChar;

    }

    public string Query
    {
        get
        {
            return _query;
        }

        set { _query = value; }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-05-29 13:56:27

我没有在代码中看到一个漏洞,但我知道扫描可能要求什么。问题可能是,这段代码使开发人员很容易忽略类中的parameterList集合。如果我是您组织中的一个新开发人员,还没有发现Sql注入,那么我可能会忽略所有复杂的查询参数,在设置Query属性之前只使用字符串连接。

与其将其包装在类中,我更习惯看到的是一个具有如下签名的方法:

代码语言:javascript
运行
复制
IEnumerable<T> GetData<T>(string query, IEnumerable<Sqlparameter> parameters)

...or某些可能使用数组或列表而不是IEnumerable的方法签名的置换。这迫使下游开发人员处理方法的parameters参数。他们不能忽视这一点,因此减少了使用快速、延迟的字符串连接调用将用户提供的数据替换到查询中的诱惑。

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

https://stackoverflow.com/questions/30529260

复制
相关文章

相似问题

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