【问题标题】:Is this code vulnerable to SQL Injection? How would I make it safe?此代码是否容易受到 SQL 注入的影响?我怎样才能让它安全?
【发布时间】:2019-04-12 12:24:56
【问题描述】:

我有一个朋友,我想在一个项目上帮忙,我根本不是渗透测试方面的专家,事实上,我真的很陌生,但他让我帮忙识别他的程序的潜在安全问题。

我不太确定,但我有一种感觉,特别是一段代码容易受到 SQL 注入的攻击,我想知道是否有人可以提供它如何易受攻击的示例(如果是的话)以及任何建议关于如何对输入进行清理。

这是一个sn-p的代码

nextwork:
        cDataBase *db = NewManagerDB();
        if( !db->QueryDirect( dbginfo,  "SELECT * FROM Account WHERE UserID = '%s'", szManagerID ) )
        {
                ErrDB(db);
                DelManagerDB(db);
                if( Retire == MAX_RETIRE )
                {
                        LOG("QueryDirect error MAX_RETIRE db QueryDirect failed");
                        SendManagerAuthenResult( MgrCode::SvrError );                        
                        return;
                }
                Retire++;
                goto nextwork;
        }

感谢您的帮助!

【问题讨论】:

  • 您是否正在使用用户输入处理查询字符串?是的。所以你的代码很容易受到攻击。您是否使用参数来传递常量值?不,所以你需要学习如何做到这一点。
  • @WGHaven,非常感谢您查看我对您的问题的回答,如果我能够帮助您,请通过单击答案分数下方的 v 将答案标记为已接受。谢谢

标签: c++ mysql sql sql-injection


【解决方案1】:

如何清理(不确定 100% 使用您的特定 db 类实现会如何):

        db->Parameters.AddWithValue("@userid", szManagerID);  
        if( !db->QueryDirect( dbginfo,  "SELECT * FROM Account WHERE UserID = @userid" ) )

这里是一个 SQL 注入的例子:

szManagerID = "' OR UserID LIKE '%";

结果查询将是:

SELECT * FROM Account WHERE UserID = '' OR UserID LIKE '%'

这样你就可以得到所有用户的账户数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2015-04-17
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多