【问题标题】:Is this secure? ADOdb prepared statements这安全吗? ADOdb 准备好的语句
【发布时间】:2011-07-29 20:28:50
【问题描述】:

我正在使用 ADOdb 连接到我的 MSSQL 数据库。我想知道这是否足以防止 SQL 注入?

我正在使用的准备好的查询是:

       $db = ADONewConnection('odbc_mssql');
       $dsn = "Driver={SQL Server};Server=SERVNAME;Database=DBNAME;";
       $ADODB_COUNTRECS = false;

       $db->Connect($dsn,'LOGIN','PASS');

       $sql = 'SELECT login, etc FROM users WHERE login ='.$db->Param('0').' AND pass ='.$db->Param('1').'';
       $stmt = $db->Prepare($sql);  
       $stmt = $db->Execute($stmt,array("$user_id","$psw"));

或者您是否会建议切换到 PDO?

【问题讨论】:

    标签: php sql-server adodb


    【解决方案1】:

    我不明白为什么没有人试图回答这个问题,甚至以任何方式发表评论。我猜 SO 以神秘的方式工作.. ;) 无论如何,我已经进行了足够的研究(我想是的),能够自己回答这个问题,并且有一定的信心。

    因此,从本质上讲,准备好的查询比仅输入转义(例如 mysql_real_escape_string();)要安全得多,因为正如一些智者所说:

    是的,mysql_real_escape_string 实际上只是一个字符串转义函数。它不是灵丹妙药。它将做的只是转义危险字符,以便它们可以安全地用于单个查询字符串。但是,如果您不事先对输入进行清理,那么您将容易受到某些攻击向量的攻击。

    完整答案链接:mysql_real_escape_string

    所以我做了什么来测试我准备好的语句与转义 - 我制作了一个简单的提交表单并尝试使用 mysql_real_escape_string(); 清理输入,并且肯定它失败了像 "1 OR 1=1" 这样的示例,有些人建议添加转义值在这样的单引号内:

    $query = "SELECT * FROM mydb WHERE ID = ' ".$escapedID." ' ";

    这有助于防止出现"1 OR 1=1" 示例,但这肯定不是最佳做法。转义的问题在于它不能防止人们以恶意方式更改您的查询逻辑。

    所以从现在开始,我将坚持使用 ADODB 准备好的语句。就像我上面原始问题中的那个,或者来自bobby-tables 网站的较短版本:

       $dbConnection = NewADOConnection($connectionString); 
       $sqlResult =  $dbConnection->Execute( 
       'SELECT user_id,first_name,last_name FROM users WHERE username=? AND password=?'
       , array($_POST['username'], sha1($_POST['password']) );
    

    关于 SQL 注入的其他非常有用的问题:

    还可以观看此视频,它使 SQL 注入更容易掌握:

    【讨论】:

    • 根据您的推理,不能说您正确理解了这件事。 1.单引号是不保护的。如果没有它们,您的示例查询将只是 fail (假设理智的 name 字段将包含一些字母)。 2. 转义,如果适用,肯定会“防止人们以恶意方式更改您的查询逻辑”。 3. 我不知道 ADODB 准备好的语句下的内容,但我怀疑它是同样的旧好转义(至少为了兼容性)。 4. 您的任何良好实践示例都没有说明必须动态添加字段名称的情况。
    • 请不要将其视为冒犯。我专注于这件事,而不是外表,如果您觉得某些措辞不礼貌,那不是故意的。
    • 我不介意建设性的批评 :) 1. 你是对的,我的错误,应该是 ID 而不是 NAME。 2. 关于转义,这些真的不是我的结论slideshare.net/billkarwin/sql-injection-myths-and-fallacies 看幻灯片 47。 3. 我也不知道,但我一直认为准备好的查询与常规查询的执行方式略有不同。 4. 对于动态插入字段名称,我将使用同一视频“SQL 注入神话与谬误”所建议的“白名单”方法,也许我应该包括一个示例。
    • 有本地准备好的语句和模拟的。 PDO 默认使用仿真,我怀疑 ADODB 的行为相同。
    • 您能推荐一些阅读材料或视频吗?另外你有什么想法可以改进我的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2012-08-12
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多