2017-10-15 117 views
-1

以下是我在php中的登录页面代码。如何在php登录页面中使用多个标题

<?php 
session_start(); 

if($_SERVER["REQUEST_METHOD"] == "POST") { 
    // username and password sent from form 

    $myusername = $_POST['username']; 
    $mypassword = $_POST['password']; 
    $f_password = md5($mypassword); 

    $sql = "SELECT id,user_name FROM users WHERE user_name = '$myusername' and password = '$f_password'"; 
    $result = mysqli_query($db,$sql); 
    $row = mysqli_fetch_assoc($result); 

    $count = mysqli_num_rows($result); 

    // If result matched $myusername and $mypassword, table row must be 1 row 

    if($count == 1) { 
     $_SESSION['us_name'] = $row['user_name']; 
     header("Location: /main-page.php"); 
    }else { 
    $error = "<script>alert('Incorrect Credentials.Please login again');</script>"; 
    echo $error; 
    } 
} 
?> 

当我在else块中使用另一个头时,它会引发一些错误。 但我希望用户在输入错误凭证时重定向到相同的登录页面。 我如何在php中执行此操作? 请不要告诉我使用js方法window.location。

+4

当然,“一些错误”是告诉你什么问题与你写的任何代码? – David

+0

您的代码容易受到SQL注入攻击。您应该使用参数化查询和准备语句来帮助防止攻击者通过使用恶意输入值来危害数据库。 http://bobby-tables.com给出了风险的解释,以及如何使用PHP/mysqli安全编写查询的一些示例。 **从不**将未经协商的数据直接插入到您的SQL中。 – ADyson

+0

并且不要使用md5进行密码加密,它很容易被现代计算能力破解 - 这在一段时间后才被发现。而是使用PHP的内置密码散列函数。 – ADyson

回答

0

首先回答你的问题:我假设错误来自发送数据 - 您在else块中执行的echo - 然后尝试添加标头。在发送第一个数据之前,您必须发送所有标题,其中包括echo的打印内容。

如果您将header()行右移到else块的开头,并确保在之前没有其他输出(例如使用var_dump()),则问题应该消失。

此外,还有在你的脚本中的许多安全问题:

  • 您使用md5()编码这是非常不安全的密码。现代PHP有一个函数password_hash()(自PHP 5.5起可用),您应该使用它
  • 您的用户名和密码在不过滤输入的情况下使用。这会向您显示SQL注入,因为它们在SQL查询中以不安全的方式重用。你应该看看准备陈述或者至少过滤器和引用用户输入

为什么你需要的标题相关的另一个问题:如果你想重定向到登录页面,你为什么有<script> -snippet在页面上?当改变位置时它不会影响,对吧?

最后一个问题,你的问题被标记为laravel。所以我很好奇你为什么不使用Authentication mechanism呢?