2015-12-21 160 views
1

我正在教如何使用舊的PHP代碼進行SQL注入。我有這樣的代碼,我就可以進行測試,但我有一個錯誤,說:SQL注入登錄表單錯誤

Fatal error: Call to a member function fetch_assoc() on a non-object

這是舊代碼:

+0

不要直接將POST變量放入查詢中。看看mysqli_escape_string或使用預準備語句。 – Matt

+0

先生我做了一個代碼,它容易陷入SQL注入中,教給我的學生,以便他們瞭解sql注入是如何完成的,然後他們如何糾正它 – am90

回答

3

您已經混合在你的代碼Object oriented styleProcedural style。使用只有一種風格

面向對象的風格

$result = $mysqli->query("SELECT * FROM login WHERE username='" . $_POST["username"] . "' and password = '". $_POST["password"]."'"); 
while($row = $result->fetch_assoc()){ 

程序風格

​​

http://php.net/manual/en/mysqli-result.fetch-assoc.php

+0

先生我正在編寫一個易於進入SQL注入的代碼教給我的學生,讓他們知道sql注入是如何完成的,然後他們如何糾正它 – am90

+0

那麼你從我們這裏得到什麼?你的問題解決了嗎? – Saty

0

試試這個代碼 $row=mysqli_fetch_array($result,MYSQLI_ASSOC);

0
$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注入不會發生。

+0

不,我需要一個容易受到sql注入攻擊的代碼 – am90

+0

先生我正在編寫一個容易被SQL注入的代碼,將它教給我的學生,這樣他們就會理解sql注入是如何完成的,然後他們如何糾正它 – am90