我正在教如何使用舊的PHP代碼進行SQL注入。我有這樣的代碼,我就可以進行測試,但我有一個錯誤,說:SQL注入登錄表單錯誤
Fatal error: Call to a member function fetch_assoc() on a non-object
這是舊代碼:
我正在教如何使用舊的PHP代碼進行SQL注入。我有這樣的代碼,我就可以進行測試,但我有一個錯誤,說:SQL注入登錄表單錯誤
Fatal error: Call to a member function fetch_assoc() on a non-object
這是舊代碼:
您已經混合在你的代碼Object oriented style
和Procedural style
。使用只有一種風格
在面向對象的風格
$result = $mysqli->query("SELECT * FROM login WHERE username='" . $_POST["username"] . "' and password = '". $_POST["password"]."'");
while($row = $result->fetch_assoc()){
在程序風格
試試這個代碼 $row=mysqli_fetch_array($result,MYSQLI_ASSOC);
$host="localhost"; // Host name
$username="root"; // Mysql username
$password="root"; // Mysql password
$db_name="graphic_db"; // Database name
$tbl_name="login"; // Table name
session_start();
$mysqli = new mysqli($host, $username, $password, $db_name);
if(isset($_POST['login_submit'])){
$stmt = $mysqli->prepare("SELECT * FROM login WHERE email=? AND password=? ");
$email = $_POST['username'];
$password = md5($_POST['password']);
$stmt->bind_param('ss', $email, $password);
$stmt->execute();
$stmt->bind_result($email, $password);
$stmt->store_result();
if($stmt->num_rows == 1) //To check if the row exists
{
while($stmt->fetch()) //fetching the contents of the row
{
$_SESSION['Logged'] = 1;
$_SESSION['Email'] = $email;
header('Location: home.php');
exit();
}
}
else
{
echo "Wrong Username or Password!";
}
$stmt->close();
$stmt->free_result();
}
使用準備查詢您的SQL注入的代碼。這是最好的做法。
準備好的語句對SQL注入非常有用,因爲稍後使用不同協議傳輸的參數值無需正確轉義。如果原始語句模板不是從外部輸入派生的,則SQL注入不會發生。
不要直接將POST變量放入查詢中。看看mysqli_escape_string或使用預準備語句。 – Matt
先生我做了一個代碼,它容易陷入SQL注入中,教給我的學生,以便他們瞭解sql注入是如何完成的,然後他們如何糾正它 – am90