这样安全吗? ADOdb准备好的声明

时间:2011-07-29 20:28:51

标签: php sql-server adodb

我正在使用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吗?

1 个答案:

答案 0 :(得分:7)

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

因此,实质上准备好的查询比输入转义(如mysql_real_escape_string();更安全),因为正如一些有智慧的人所说:

  

是的,mysql_real_escape_string实际上只是一个字符串转义函数。它不是一个神奇的子弹。它所做的只是逃避危险的字符,以便在单个查询字符串中使用它们是安全的。但是,如果您事先没有对输入进行消毒,那么您将容易受到某些攻击媒介的攻击。<​​/ p>

链接至完整答案:mysql_real_escape_string

那么我做了什么来测试我准备好的语句vs转义 - 我已经做了一个简单的提交表单,并试图用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注入更容易掌握: