我正在尝试学习SQL注入成为白帽子,但我觉得很难......
我在一个网站上发现了这个代码,并且它被告知是一个容易解决的问题。
HTML代码有一个用户名,密码框和一个按钮。
if(isset($_POST['autentificare']) && $_POST['autentificare']=='OK' && $_POST['admin']!="" && $_POST['adm_password']!="")
{
$admin=$_POST['admin'];
$adm_password=$_POST['adm_password'];
$login="SELECT admin,password FROM owner where admin='".$admin."' AND password='".$adm_password."' ";
$result_auth=mysql_query($login,$db) or die("Query failed: ".mysql_error()." Actual query: ".$login);
$user_identity;
while($dates = mysql_fetch_object($result_auth))
{
$user_identity=$dates->admin;
$password_ident=$dates->password;
}
if($result_auth && $user_identity==$admin && $password_ident==$adm_password)
{
$_SESSION['adm_username']=$admin;
$_SESSION['adm_password']=$adm_password;
$authval="V";
}
else
{
$authval="D";
}
}
答案 0 :(得分:1)
是。您的查询是SQLi易受攻击的。我强烈建议使用PDO。它负责为您提供转义查询。 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers#Named_Placeholders
答案 1 :(得分:1)
针对SQL注入的最佳“武器”是准备好的语句。 通过这种方式,您不会像在上面的查询中那样将代码与数据混合在一起。
当然......你很容易受到SQL注入攻击。
通过混合代码和数据,攻击者可以通过这样的方式发送输入,实际上可以改变查询的形式。
答案 2 :(得分:0)
从安全/ sql注入角度看代码的明显问题:
数据未经清理。无论何时您从用户那里获取输入并在查询中处理它,您都希望通过编码任何特殊字符来清除它。有很多功能可以做到这一点,因为你是一名学生,我会让你研究这一点(学习如何为你的目的找到功能是开发中的一项重要技能)。
您没有使用绑定参数(并且您不应该使用$ mysqli)。绑定参数有助于以应用程序知道所期望的输入类型的方式构建查询。它阻止人们将子查询隐藏到您的代码中。
密码以未加密状态存储。密码应该始终加密,因此如果它们被盗,就不会像未加密一样坏。
这应该让你开始。