0

可能重复:
PHP 已发送的标头

在下面的代码中,没有任何标题重定向到指定的位置..我不知道为什么...在调用标题之前我没有发送或回显任何输出。也没有意外的“空白”也会导致标题()出现故障。我也尝试过使用 ob_start() 但它是徒劳的。我所有的文件也都在一个文件夹中,即在 WAMP 的“www”文件夹中.....有人能告诉我有什么问题吗?

此代码处理用于注册新用户的表单.....使用 POST 方法

$user= "root" ;
$host= "localhost" ;
$password= "" ;

$database= "online_examination" ;
$fn=$_POST['fn'] ;    // firstname
$ln=$_POST['ln'] ;    // lastname
$un=$_POST['un'] ;  // username
$pass=$_POST['pw'] ;  // password

$connection= mysql_connect($host,$user,$password) ;
$db= mysql_select_db($database,$connection);
$query=" SELECT username FROM user_info " ;
$result=mysql_query ($query,$connection) ;

for ($i=0 ; $i<mysql_num_rows($result) ; $i++ )
{
    $uname=mysql_result($result,$i,"username") ;

    if ($un==$uname)
       {
           header ("Location : /username_exists.php") ;
           exit;
       }
}

$query=" SELECT password FROM user_info " ;
$result=mysql_query ($query,$connection) ; 

for ($i=0 ; $i<mysql_num_rows($result) ; $i++ )
{
     $pword=mysql_result($result,$i,"password") ;
     if ($pass==$pword)
       {
            header ("Location : /password_exists.php") ;
            exit;
       }
}

$query=" INSERT INTO user_info (firstname,lastname,username,password) VALUES
('$fn','$ln','$un','$pass') " ;

mysql_query ($query,$connection)

header ("Location : /successfully_registered.php") ;
4

3 回答 3

0

这段代码充满了安全漏洞和逻辑错误,但我已经尽力重写它。

$user = 'root';
$host = 'localhost';
$password = '';
$database = 'online_examination';

// Attempt to connect to MySQL
if( !( $connection = mysql_connect( $host , $user , $password ) ) ){
  die( 'Failed to connect to server' );
}elseif( !( $db = mysql_select_db( $database , $connection ) ) ){
  die( 'Failed to connect to database' );
}

// Default values for Form Submitted Fields
$fn = $ln = $un = $pass = false;
// Check if Form Submitted
if( $_POST ){
  // For each value, perform some basic validation before trusting them
  if( isset( $_POST['fn'] ) && $_POST['fn']!='' )
    $fn = $_POST['fn'] ;    // firstname
  if( isset( $_POST['ln'] ) && $_POST['ln']!='' )
    $ln = $_POST['ln'] ;    // lastname
  if( isset( $_POST['un'] ) && $_POST['un']!='' )
    $un = $_POST['un'] ;  // username
  if( isset( $_POST['pw'] ) && $_POST['pw']!='' )
    $pass = $_POST['pw'] ;  // password
}

// If a Username was submitted
if( !$fn || !$ln || !$un || !$pw ){

  // One or more of the fields were empty or not submitted.
  // Show the form again (maybe with an error message)

}else{

  // Perform a Query looking for any instances where the same username is already in use
  $query = 'SELECT COUNT(*) AS matches FROM user_info WHERE username="'.mysql_real_escape_string( $un ).'"';
  $result = @mysql_query( $query , $connection ) ;
  if( !$result ){
    die( 'Query for Usernames Failed' );
  }
  $row = mysql_fetch_array( $result )
  if( $row['matches']!=0 ){
    // The Username is already in use
    if( !headers_sent() ){
      header( 'Location: /username_exists.php' );
    }else{
      echo 'Username already in use - <a href="/username_exists.php">Click here</a>';
    }
    die();
  }

  // If we have gotten to this point, the username is OK to use
  $sqlTpl = 'INSERT INTO user_info ( firstname , lastname , username , password ) VALUES ( "%s" ,  "%s" ,  "%s" , "%s" )';
  $sqlStr = sprintf( $sqlTpl ,
    mysql_real_escape_string( $fn ) ,
    mysql_real_escape_string( $ln ) ,
    mysql_real_escape_string( $un ) ,
    mysql_real_escape_string( $pw ) );
  $result = mysql_query( $sqlStr , $connection );
  if( $result ){
    if( !headers_sent() ){
      header( 'Location: /successfully_registered.php' );
    }else{
      echo 'Successfully registered - <a href="/successfully_registered.php">Click here</a>';
    }
    die();
  }else{
    // Something went wrong
  }
}

臀部的几点:

  • 遍历所有返回的行并单独匹配它们是检查值是否存在的一种钝方法。SQL 在做这种事情方面要好得多 - 阅读它。
  • 执行检查以查看密码是否已被使用是没有意义的。我敢打赌,StackOverflow 上的一两个人拥有相同的密码,但他们没有收到提示“有人已经将 'abc123' 作为密码。选择另一个”的消息。如果有的话,这种消息是一种安全风险,而不是一种安全措施。
  • 永远不要相信输入。假设会有一个 POST 提交是灾难的根源。
  • 因此,不验证您获得的任何输入。
  • 更重要的是不要将其转义以在数据库查询中使用。谷歌搜索“小鲍比桌”。
  • 如果您要存储密码,则切勿以纯文本形式存储它们。它们应该被散列和加盐。(同样,谷歌是你的朋友。)
  • 假设您可以更改标题是需要谨慎的事情。检查headers_sent()是一个很好的做法。
  • 随时测试错误。一开始的一个小错误,可以被检测到并中止任何后续操作,总比让一个小错误滚雪球要好。

查看一些预先存在的教程和/或处理用户注册的 PHP 类。他们中的很多人都有好主意,您应该将其纳入您的解决方案,而不是重新发明轮子。

于 2012-06-26T03:08:58.763 回答
-1
$connection= mysql_connect($host,$user,$password); 
$db= mysql_select_db($database,$connection);

它可能由于php错误而失败。你错过了你的分号。

尝试 error_reporting(E_ALL); 在顶部仔细检查错误;

于 2012-06-25T19:43:43.397 回答
-1

此外,请确保您的<?php标签之外没有空格,因为这会导致文本被发送到浏览器,除非您打开输出缓冲,否则将导致错误提示“标头已发送”。此外,您的 SQL 处理非常不安全。您的任何变量都可以用于成功的 SQL 注入。

于 2012-06-25T19:23:45.233 回答