2010-12-21 147 views
2

請問此代碼是否安全?參數化查詢

/* Create a new mysqli object with database connection parameters */ 
$mysqli = new mysql('localhost', 'username', 'password', 'db'); 

if(mysqli_connect_errno()) { 
echo "Connection Failed: " . mysqli_connect_errno(); 
exit(); 
} 

/* Create a prepared statement */ 
if($stmt = $mysqli -> prepare("SELECT priv FROM testUsers WHERE username=? 
AND password=?")) { 

/* Bind parameters 
s - string, b - boolean, i - int, etc */ 
$stmt -> bind_param("ss", $user, $pass); 

/* Execute it */ 
$stmt -> execute(); 

/* Bind results */ 
$stmt -> bind_results($result); 

/* Fetch the value */ 
$stmt -> fetch(); 

echo $user . "'s level of priviledges is " . $result; 

/* Close statement */ 
$stmt -> close(); 
} 

/* Close connection */ 
$mysqli -> close(); 
+7

迂腐的筆記:這些評論中的每一個都是100%無用的,應該刪除。他們使代碼難以閱讀,並且不添加額外的信息......我覺得和對象方法調用('$ stmt-> execute()`一樣,沒有理由用空白區分調用)...另外,正確縮進你的代碼,它也將有助於可讀性... – ircmaxell 2010-12-21 14:19:43

+0

是的,它是安全的,但它也是boooooring – 2010-12-21 14:54:06

回答

8

就防範mySQL注入而言:是的。 Mysqli的參數化查詢對注入攻擊是安全的。

如果$user來自外部源,您可能需要添加htmlentities()從與用戶名註冊像<script>(some malicious code)</script>

+0

你會想要將原始值存儲在數據庫中,並對輸出進行格式設置,包括htmlentities。如果您需要,您可以通過這種方式更改操作數據的方式。 – Malfist 2010-12-21 14:48:37

3

調用本身echo語句來防止用戶是安全的。不過,您可能希望將$mysqli = new mysql('localhost', 'username', 'password', 'db');放在單獨的文件中,但不要放置在公共Web目錄之外。

1

除了Pekka的評論:還可以在echo語句中使用$ result的htmlspecialchars。