簡體   English   中英

這樣安全嗎? ADOdb准備好的聲明

[英]Is this secure? ADOdb prepared statements

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

我不明白為什么沒有人試圖回答這個問題,甚至以任何方式發表評論。 所以我猜想這會以神秘的方式運作......;)無論如何,我已經研究了足夠的(我想是這樣的)能夠以一定程度的自信來回答這個問題。

因此,本質上准備好的查詢比輸入轉義更安全,例如mysql_real_escape_string(); ,因為正如一些有智慧的人所說:

是的,mysql_real_escape_string實際上只是一個字符串轉義函數。 它不是一個神奇的子彈。 它所做的只是逃避危險的字符,以便在單個查詢字符串中使用它們是安全的。 但是,如果您事先沒有對輸入進行消毒,那么您將容易受到某些攻擊媒介的攻擊。

鏈接到完整答案: mysql_real_escape_string

那么我做了什么來測試我准備好的語句vs轉義 - 我做了一個簡單的提交表單並試圖用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注入更容易掌握:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM