2013-04-04 86 views
0

所以我一直在閱讀很多關於準備好的陳述,並且不斷得到關於準備好的陳述如何防止mysql注入的各種答案。有些人說它完全覆蓋了它,而另一些人則說它們仍然有一些小的工作或某些事情。幾乎我只是想確認這個代碼,我是安全的,知道居然有準備語句中的任何孔:mysqli準備好的語句是否完全免受mysql注入?

<?php 
ignore_user_abort(true); 

$user = $_REQUEST['username']; 
$pass = $_REQUEST['password']; 

if (isset($user) && isset($pass)) { 
require('/var/www/data/config.php'); //contains the db connection 

if ($stmt = mysqli_prepare($mysqli, "SELECT password FROM users WHERE username=?")) { 
    mysqli_stmt_bind_param($stmt, 's', $user); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_bind_result($stmt, $gpass); 
    mysqli_stmt_fetch($stmt); 
    mysqli_stmt_close($stmt); 

    if ($gpass) { 
     require('/var/www/data/handles/fCrypt.php'); 

     $chk = verify($pass, $gpass); //custom blowfish validation 

     if ($chk) { 
      //password correct, continue 
     } else { 
      mysqli_close($mysqli); 
      //echo invalid password stuff 
     } 
    } else { 
     mysqli_close($mysqli); 
     //echo invalid username stuff 
    } 
} else { 
    mysqli_close($mysqli); 
    die('Query Error'); 
} 
} else { 
die('Invalid Request'); 
} 
?> 
+0

本質上是PDO準備語句安全的副本(http://stackoverflow.com/questions/1314521/how-safe-are-pdo-prepared-statements) – deceze 2013-04-04 06:49:11

回答

2

像其他任何措施,他們作品時適用
因此,當不適用時,他們不能提供幫助。

因此,只要您可以通過佔位符添加每個動態查詢部分,就可以認爲您的查詢安全。

注意。這就是爲什麼你不應該使用mysqli,而是移動到PDOSafeMysql

只要嘗試創建一個簡單的IN()語句,使用mysqli預準備語句綁定任意數量值的數組。你會立即停止使用它。

PDO與IN()語句不太好,但代碼至少合理。

+0

但是不是's'的東西採用與pdo相同的方式?編輯:非常感謝幫助我將我的網站切換到PDO。 – lemondrop 2013-04-04 06:54:10

1

我不是這個話題的專家,但我會說安全首先是一個實踐問題。但是,只要你遵循它,那麼擁有使它更容易遵循正確方式的工具確實有幫助。

對於該工具如何幫助您實現該目標存在限制:評論中提到的that post on PDO usefullness涵蓋了它們非常好。 對於他們中的一些人來說,很難理解爲什麼(IN子句問題可能是技術問題),但其他人很有意義:對於查詢的語法部分(如表或列名稱) - 除此之外對於數據庫引擎編譯和優化查詢而不知道它正在處理的是哪一列或哪一個表而言是相當不利的,因此不應該有任何這樣的數據來自用戶的理由(人們會認爲數據庫管理工具是可能發生這種情況的一種情況,但該程序類別已經與最終用戶具有一定程度的信任關係)。

db元數據已知和操縱的唯一地方是程序。這個斷言真的意味着它是ok動態構建查詢,逐位構建查詢,甚至使用庫來幫助您確保查詢在語法上是正確的,只要您遵守核心規則:不泄漏數據庫架構到用戶空間。

關於你的代碼,在我看來,你已經遵循規則,我沒有看到任何危險的陳述。

+0

這是不切實際的立場。必須爲每一個案件做好準備,而不僅僅是否認這種可能性。考慮我上面鏈接的SafeMysql庫。它也提供對標識符的保護 – 2013-04-04 07:42:27