我一直被告知我的代码容易受到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注入,但没有一个工作
答案 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。