2013-03-28 52 views
0

我有一个用户登录页面与一个形式的行动是“auth.php”PHP SQL身份验证问题

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设置为header(“location:usage.php”);在auth.php。

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

但是,当我上传到网络服务器,我登录登录页面,它将我带到页面“auth.php”,并停在那里,显示“连接成功”按database.php回声。没有什么更进一步的,它是假设认证,然后带我到usage.php。我检查过数据库名称,表格等,是否正确,有没有想法请求?

+1

启用一个适当的error_reporting的display_errors,看看你不能发送头头功能之前的任何呼应如果你已经发送了输出,除非你有默认的output_buferring。 – Wrikken

+0

如何启用display_errors? –

+0

@StephanBotes:通过在网页中的php代码开头处添加此语句来启用显示错误LINK:http://php.net/manual/en/function.error-reporting.php –

回答

0

在使用标题(...)之前,您不得将任何东西写入输出流。它可能在一些服务器上工作,但你不应该指望它。

删除代码中的所有回显和打印语句,您应该重定向。

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

+0

谢谢!现在工作:) –

0

现在这个工程100%我的本地机器

这是一些非常糟糕的代码上。绕过认证是微不足道的。

建立连接后,您不再进行任何错误检查。

+0

我在哪里绕过验证? –

+0

@StephanBotes:让'$ username =''或1 ='1'; $ password =''或1 = 1 LIMIT 1 - “;',任何人都可以登录... – Wrikken

0

一旦您回应了某些内容,就无法再设置任何标题。尝试删除回声语句。

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

引用:“记住header()函数发送任何实际输出之前必须调用,无论是普通的HTML标记,空行的文件,或者从PHP这是一个很常见的。使用include或require函数或其他文件访问函数读取代码时出错,并在调用header()之前输出空格或空行。使用单个PHP/HTML文件时存在同样的问题。“

0

尝试在你的代码 的顶部添加

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

,看看是否有错误或没有,通常错误隐藏在托管服务器

0

只是尝试删除连接回声”成功';从代码,并尝试省略任何空行,因为头函数过于敏感,它需要你没有发送任何输出之前使用它们,所以任何回声或任何简单的HTML被视为输出和头功能不会功能正确地归因于头部已经发送的错误以及错误报告的级别是否隐藏错误R您不会注意到这个错误

请尽量省略任何空间或调用,然后告诉我结果:)