[英]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.