【问题标题】:php SQL authentication issuephp SQL 身份验证问题
【发布时间】:2013-03-28 19:49:32
【问题描述】:

我有一个用户登录页面,其操作是“auth.php”

auth.php 看起来像这样:

<?php
session_start();

require_once('database.php');


$username = $_POST['username'];
$password = $_POST['password'];



$sql = "SELECT * FROM access_getaccountswithinfo WHERE username='".$username."' AND     password='".$password."'";

$run = mysql_query($sql);
$row = mysql_fetch_array($run);

if (mysql_num_rows($run) == 1) {
$_SESSION['logged_in'] = true;
$_SESSION['username'] = $row['username'];
$_SESSION['password'] = $row['password'];
$_SESSION['packagename'] = $row['packagename'];
$_SESSION['creation-date'] = $row['creation-date'];
$_SESSION['cap'] = $row['cap'];
$_SESSION['total'] = $row['total'];
$_SESSION['remainingtopup'] = $row['remainingtopup'];


header("location: usage.php");
} else {
header("location: user_login.php");
$message = MSG_INVALID_USERPW;
}


mysql_close($link);
?>

那么这个 auth.php 有一个 Require_once to : database.php database.php 如下:

<?php
$link = mysql_connect('localhost', 'testdatabase', '123456');
if (!$link) {
die('Could not connect: ' . mysql_error());
}

// make testdatabase the current db
$db_selected = mysql_select_db('testdatabase', $link);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}

echo 'Connected successfully';

?>

所以简而言之...您在登录页面上登录,然后使用 auth.php 操作检查用户是否可以在需要 database.php 进行连接的同时进行身份验证,如果用户进行身份验证,则将他们带到页眉设置的 usage.php 页面(“位置:usage.php”);在 auth.php 中。

现在这在我的本地机器上 100% 工作,带有 xampp Apache 和 SQL 服务器。

但是当我将它上传到网络服务器时,我在登录页面上登录,它会将我带到页面“auth.php”并停在那里并根据 database.php 中的回显显示“连接成功”。仅此而已,假设要进行身份验证,然后将我带到usage.php。我检查了数据库名称、表等,都正确,请问有什么想法吗?

【问题讨论】:

  • 使用适当的 error_reporting 启用 display_errors,如果您已经发送了输出,则可以查看无法发送标头,除非您默认设置了 output_buferring。
  • 如何启用 display_errors?
  • @StephanBotes:通过在网页的 php 代码开头添加此语句来启用显示错误 LINK:php.net/manual/en/function.error-reporting.php
  • 请不要使用 mysql_* 函数,它们已被弃用,而是使用 mysqli_*。
  • 启用display_errors 可以在:(1) php.ini (2) 在 apache 配置或 .htaccess 文件中使用php_flag,假设这是您使用的网络服务器 (3) 设置在-带有ini_set() 的脚本,但请注意最后一个将无法捕获语法错误。

标签: php mysql login


【解决方案1】:

在使用 header(...) 之前,不允许将 anything 写入输出流。它可能在某些服务器上工作,但你不应该期望它。

删除代码中的所有 echo 和 print 语句,您应该被重定向。

另外,你真的应该使用mysql_real_escape_string(..) [http://php.net/manual/en/function.mysql-real-escape-string.php],甚至改变从不推荐使用的 mysql_ 命令到 PDO。现在我可以使用用户名' OR 1=1 LIMIT 0,1; --登录您的网站

【讨论】:

    【解决方案2】:

    现在这在我的本地机器上 100% 有效

    这是一些非常糟糕的代码。绕过身份验证很简单。

    在建立连接后你不会做任何进一步的错误检查。

    【讨论】:

    • 我在哪里绕过身份验证??
    • @StephanBotes: 让$username="' or 1='1";$password="' or 1=1 LIMIT 1 -- ";,任何人都可以登录...
    【解决方案3】:

    一旦您回显某些内容,您就不能再设置任何标题。尝试删除 echo 语句。

    来源:http://php.net/manual/en/function.header.php

    引用:“请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 中。使用包含读取代码是一个非常常见的错误,或者要求、函数或其他文件访问函数,并在调用 header() 之前输出空格或空行。使用单个 PHP/HTML 文件时存在相同的问题。"

    【讨论】:

      【解决方案4】:

      尝试添加

      error_reporting(E_ALL);
      ini_set('display_errors', '1');
      

      在代码的顶部 看看是否有错误,通常错误隐藏在托管服务器中

      【讨论】:

        【解决方案5】:

        只需尝试删除回显“连接成功”;从代码中并尝试省略任何空白行,因为标头函数过于敏感,它需要您在使用它们之前没有发送任何输出,因此任何回显或任何简单的 html 都被视为输出,并且标头函数将无法正常运行header 已经发送的错误,如果错误报告级别是隐藏错误,您将不会注意到此错误

        请尝试在调用标头函数之前省略任何空格或任何回显,然后告诉我结果:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多