2013-05-04 41 views
2

我會如何防止SQL注入這樣的SQL查詢?如何在使用MySQLi時防止SQL注入?

<?php 
$mysqli = new mysqli("ip", "username", "pass", "database"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Sorry, the login server is 'Under Maintainance'"); 
    exit(); 
} 

$username = $_POST["username1"]; 
$username = strtolower($username); 
$password = $_POST['password1']; 
$hash = sha1(strtolower($username) . $password); 

$query = "SELECT * FROM accounts WHERE name='$username'"; 

if ($result = $mysqli->query($query)) { 
    /* determine number of rows result set */ 
    $rownum = $result->num_rows; 

if($rownum != 0) 
{ 
while ($row = $result->fetch_assoc()) { 
    { 
    $acct = $row['acct']; 
    $pass = $row['pass']; 
} 
if($hash == $pass){ 
session_start(); 
$_SESSION['name']=$username; 
$_SESSION['acct']=$acct; 
header('Location:index.php'); 
} else { 
echo 'There was an error when logging in. Make sure your password and username are correct.'; 
} 
} 
    $result->close(); 
} 
else 
{ 
echo 'Account does not exist. Please <a href="register.php">Register</a> an account before logging in.'; 
} 
    $mysqli->close(); 
} 
?> 

我已經添加了加密,但我似乎無法找到一種預防方法,我知道如何使用呢。另外,用戶是否可以在不使用輸入框的情況下使用MySQL注入? (分割頁面)

+0

防止黑客行爲是不可能的。你必須僱用人來保護你的代碼庫,以防有人在添加保護之前及時回擊它。 – 2013-05-04 20:31:09

+0

haha​​hah post是關於sql注入的,而不是像緩衝區溢出和所有那些很酷的東西 – 2013-05-04 20:32:23

回答

2

加密和查詢衛生沒有關係。

您已經在使用mysqli,這很好,但是您不會清理查詢的輸入(即$username,這可能不需要strtolower也可以)。

您應該正確使用參數化查詢進行衛生處理。

$query = "SELECT * FROM accounts WHERE name = ?"; 
$stmt = $mysqli->prepare($query); 
$stmt->bind_param("s", $username); 
$stmt->execute(); 
$stmt->bind_result($acct, $pass); 
$stmt->fetch(); 
//$act and $pass are now properly set 

SQL注入限制與用戶無關。甚至有可能你無意中將自己注入自己的代碼中,注入甚至不必是惡意的。因此,您應該始終正確地參數化您的查詢,即使您不認爲有任何惡意注入的風險。

+1

strtolower只是我使用的東西,以便多個用戶不具有相同的用戶名。例如:用戶和用戶R。 :) – 2013-05-04 20:52:23