Php 如何修复SQL Inject Me Firefox插件找到的服务器状态代码:302

Php 如何修复SQL Inject Me Firefox插件找到的服务器状态代码:302,php,mysql,sql-injection,Php,Mysql,Sql Injection,我使用Firefox插件扫描了我的登录脚本 根据测试结果,我的脚本容易受到SQL注入的攻击。以身作则 Results: Server Status Code: 302 Found Tested value: &#49&#39&#32&#79&#82&#32&#39&#49&#39&#61&#39&#49 Server Status Code: 302 Found Tested value: &

我使用Firefox插件扫描了我的登录脚本

根据测试结果,我的脚本容易受到SQL注入的攻击。以身作则

Results:
Server Status Code: 302 Found
Tested value: &#49&#39&#32&#79&#82&#32&#39&#49&#39&#61&#39&#49
Server Status Code: 302 Found
Tested value: 1' OR '1'='1
Server Status Code: 302 Found
Tested value: 1 UNI/**/ON SELECT ALL FROM WHERE
Server Status Code: 302 Found
Tested value: %31%27%20%4F%52%20%27%31%27%3D%27%31
我的剧本

  • login.php-登录表单
  • check-login.php-检查登录详细信息,下面是代码

    $email=clean($_POST['username']); $pass=clean($_POST['password']); $user=“从tbl_admin中选择*,其中admin='$email'和pass='$pass'

    //一些代码

    $\会话['login\u mes']=“您已成功登录!”; 标题(“位置:admin.php”); 退出()

    }否则{

    $\u会话['login\u mes']=“无效的电子邮件地址或密码,请重试。”; 标题(“Location:login.php”); 退出(); }

  • 登录失败时出现问题。如果我移除

    } else {
    
    $_SESSION['login_mes'] = "Invalid email address or password, please try again.";
    header("Location:login.php");
    exit();
    }
    

    SQL Inject Me没有检测到任何故障以及如何修复此部分?

    302是服务器表示“我希望您转到[其他地方]”(在本例中为login.php)的方式。 这不是一个错误,而是一个完全正常的反应。特别是在您的情况下(如果您要求我),在SQL注入尝试后将用户发送到登录页比让他进入更有意义。

    “//一些代码”没有多大帮助,但问题可能在于此
    clean()
    。试试看


    编辑:如上所述,302代码表示“您正在转发”。这并不意味着SQL注入成功,因为这也不意味着它也不成功。在这种情况下,您将只知道,如果您能够确定302将您转发到“admin.php”或“login.php”的位置,那么一些渗透测试工具更喜欢服务器不返回错误消息或至少是非常一般的消息。例如,在SQLInjectMe页面上,它说

    该工具通过表单发送数据库转义字符串来工作 领域。然后,它将查找输出到中的数据库错误消息 页面的呈现HTML

    因此,当它看到302响应代码时,可能会认为您的应用程序返回的信息太多。您可以通过为响应设置不同的状态代码并查看SQL Inject Me是否仍然给出错误来测试此理论,如下所示:

    header('HTTP/1.1 404 Not Found');
    

    当然,向他们发送404不会帮助你的用户找到返回登录页面的方法,因此你可能需要尝试其他3XX消息,可能是303或307。

    四年后,但我正在研究这个问题,并认为我会为下一个人分享

    经过一些分析,我们得出结论,302本身并不令人担忧。问题在于302之前的页面可能已发送,但在显示之前被302扫走。如果浏览器接收到的上一页(可能是Fiddler记录的)包含数据库错误(或黑客可能会发现有用的其他信息),那么这是不好的。如果302是初始响应,并且它有一个空的主体,只有一个标题,那么我认为您可以


    您必须显示错误页面(302的目的),因此我不认为这会被视为“太多信息”。

    clean函数做什么?这是一个附带问题-PHP中是否有参数化查询的概念?可能值得一看。clean函数运行良好。问题出现在}else{之后,我们也知道它没有成功,重定向到login.php(因为他删除了特定的头(“Location:…”)时就发生了)302不再被检测到。将302作为SQL注入成功的标志是一个相当愚蠢的想法,我想知道他们在想什么。是的。在我的网站上,302重定向到一个显示错误消息的错误页面。从tsql语句被泄露的意义上讲,它正在泄露信息,但似乎没有泄露se我的站点要注入。