0

我有一个用户登录页面,其操作形式为“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 到: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(“位置: 用法.php"); 在 auth.php 中。

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

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

4

5 回答 5

0

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

那是一些非常糟糕的代码。绕过身份验证是微不足道的。

建立连接后,您无需进行任何进一步的错误检查。

于 2013-03-28T19:52:53.383 回答
0

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

删除代码中的所有 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; --

于 2013-03-28T19:55:20.410 回答
0

一旦你回显了一些东西,你就不能再设置任何标题了。尝试删除 echo 语句。

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

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

于 2013-03-28T19:55:43.120 回答
0

尝试添加

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

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

于 2013-03-28T19:57:08.197 回答
0

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

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

于 2013-03-28T20:49:41.713 回答