sql注入登录表单错误

Posted

技术标签:

【中文标题】sql注入登录表单错误【英文标题】:sql injection login form error 【发布时间】:2015-12-21 08:52:04 【问题描述】:

我正在编写有关如何使用旧 php 代码进行 sql 注入的教程。我有这段代码,我正在测试它,但我有一个错误说:

致命错误:在非对象上调用成员函数 fetch_assoc()

这是旧代码:

<?php
$host="localhost"; // Host name 
$username="root"; // mysql username 
$password="root"; // Mysql password 
$db_name="graphic_db"; // Database name 
$tbl_name="login"; // Table name 
//if(!session_is_registered(myusername))
//header("location:index.html");
  $con=mysqli_connect($host,$username,$password,$db_name);



if(isset($_POST['login_submit']))

    if($_POST['username'] != '' && $_POST['password']!='')
        if(!isset($_SESSION)) 
     
        session_start();
        //session_register('username'); 
     

        $result = mysqli_query($con, "SELECT * FROM login WHERE username='" . $_POST["username"] . "' and password = '". $_POST["password"]."'");
        while($row  = $result->fetch_assoc($result) )
        if(is_array($row)) 
            $_SESSION["username"] = $row[$_POST["username"]];
            $_SESSION['username'] = $_POST["username"];

            header("Location:home.php");
             
            else 
            $message = "Invalid Username or Password!";

            

        
        

        

?>

【问题讨论】:

永远不要直接将 POST 变量放入查询中。看看 mysqli_escape_string 或使用准备好的语句。 先生,我正在编写一个易受 SQL 注入攻击的代码来教给我的学生,以便他们了解如何进行 sql 注入以及如何纠正它 【参考方案1】:

您在代码中混合了Object oriented styleProcedural style。只使用一种样式

面向对象的风格

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

程序风格

 $result = mysqli_query($con, "SELECT * FROM login WHERE username='" . $_POST["username"] . "' and password = '". $_POST["password"]."'");
 while($row  = mysqli_fetch_assoc($result) )

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

【讨论】:

先生,我正在编写一个易受 SQL 注入攻击的代码来教给我的学生,以便他们了解如何进行 sql 注入以及如何纠正它【参考方案2】:

试试这个代码 $row=mysqli_fetch_array($result,MYSQLI_ASSOC);

【讨论】:

【参考方案3】:
    $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 注入。

【讨论】:

不,我需要一个易受 sql 注入攻击的代码 先生,我正在编写一个易受 SQL 注入攻击的代码来教给我的学生,以便他们了解如何进行 sql 注入以及如何纠正它

以上是关于sql注入登录表单错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 实现SQL注入过滤

SQL注入新手教程(第二部分)

[安全测试入门]详解SQL注入式攻击

Web安全基础之SQL注入式攻击

Sql注入衔接

php防止sql注入漏洞都有哪些函数