我已经尝试过SQL注入我的代码,而这些代码在技术上是'应该是脆弱的,但它不会工作

时间:2015-10-16 11:14:57

标签: php mysql sql-injection

我一直被告知我的代码容易受到SQL注入攻击,但是我已经从mysql转换为mysqli扩展,并且我已经尝试过对自己的SQL注入攻击但是它们似乎都没有用,所以我的问题是。 ..

我的代码是否真的安全,如果没有,为什么SQL注入不起作用?

<?php

session_start();
if (!isset($_SESSION["email"])){
    header ("location: logout.php");
    die();
}


include('connect-db.php');

if (mysqli_connect_errno())
  {
  echo "Failed to connect to mysqli: " . mysqli_connect_error();
  }
else 
{ 

}

function newUser()
{


    $forename = $_POST['forename'];
    $surname = $_POST['surname'];
    $email = $_POST['email'];
    $securityq = $_POST['securityq'];
    $securitya = $_POST['securitya'];
    $password = ($_POST['password']);

    $query = "INSERT INTO admin (forename,surname,email,securityq, securitya,password) VALUES ('$forename','$surname','$email','$securityq','$securitya','$password')";

    include('connect-db.php');
    $data = mysqli_query ($db, $query)or die(mysqli_error($db));
    if($data)
        {

    }

}


function SignUp()
{
    if(!empty($_POST['email']))
    {
        include('connect-db.php');
    $query = mysqli_query  ($db, "SELECT * FROM admin WHERE email = '$_POST[email]'")
        or die(mysqli_error());
        if(!$row = mysqli_fetch_array($query) or die(mysqli_error()))
        {
            newuser();
            echo ("<SCRIPT LANGUAGE='JavaScript'>
    window.alert('Admin Registration Successful')
    window.location.href='adminhome.php';
    </SCRIPT>");

        } 
        else
        {
            echo ("<SCRIPT LANGUAGE='JavaScript'>
            window.alert('Sorry You are already a registered user!')
            window.location.href='adminhome.php';
    </SCRIPT>");


        }
    }

}
if(isset($_POST['submit']))
    {
    SignUp();
}

?>

我尝试SQL注入时遇到的错误都与此类似:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP table pdf',','lll','pppppp')' at line 1

我也尝试了很多不同类型的SQL注入,但没有一个工作

2 个答案:

答案 0 :(得分:0)

如果我没记错,mysqli_query一次只能执行一个查询。这意味着,您无法通过注入将查询扩展为更多查询,例如

$query = "INSERT INTO admin (forename,surname,email,securityq, securitya,password) 
          VALUES ('$forename','$surname','$email','$securityq','$securitya','$password')";

使用

$password = "'); DROP TABLE admins; --";

但也许您可以更改它以覆盖其他一些数据。例如。使用

$password = "newPasswort') ON DUPLICATE KEY UPDATE password = VALUES(password); --";

我没有测试过这个。这只是为了得到想法。 DROP不是唯一的邪恶注射。

阻止SQL注入的最佳方法是使用预准备语句。转义字符串比什么都不做更好,但也许有一些例子,即使转义字符串也会导致注入。准备好的语句分别传递给数据库,因此它已经知道查询,输入不能再改变查询。

另请注意,存储普通密码绝对不是一个好主意。请使用password_hash或类似的东西哈希密码。

答案 1 :(得分:0)

有多种方法可以破解你的代码;它安全。不必为您的代码执行DROP语句是不安全的。

例如,函数SignUp是不安全的。如果$_POST[email]的值为' OR 1=1 --,则身份验证查询将变为:

SELECT * FROM admin WHERE email = '' OR 1=1 --

--是攻击的常见指标;其目的是将后续内容转换为注释。)此查询将始终返回结果,因为1=1始终为true。因此,您的用户将始终作为管理员进行身份验证。这意味着newUser被调用,攻击者数据被插入admin表,您就失去了对网站的控制权。

道德 始终 使用预备语句。 从不 直接插入来自用户的值,可能来自用户,来自数据库,来自API等,直接插入到您的SQL语句中。在SQL注入时不要信任任何人(包括你自己),并且每次都为每个参数或变量使用预准备语句。

您应该阅读OWASP's guide to SQL injection issues,他们的SQL Injection Prevention Cheat Sheet和他们的PHP Security Cheat Sheet