laravel 登录在 url 中显示密码和 id

Posted

技术标签:

【中文标题】laravel 登录在 url 中显示密码和 id【英文标题】:laravel login showing password and id in url 【发布时间】:2019-12-30 10:24:25 【问题描述】:

我在 laravel 中创建了一个登录名,实际上是 laravel 的新手,该网站已经在 laravel 中创建,我尝试添加登录名并在其中注册,welcome.blade.php 中的登录名如下:

<?php
$username = "";
$errors = array();
$db = mysqli_connect('localhost', 'root', 'root', 'test');

$user_check_query = "SELECT * FROM registers WHERE username='$username' LIMIT 1";
  $result = mysqli_query($db, $user_check_query);
  $user = mysqli_fetch_assoc($result);

  if ($user)  // if user exists
    if ($user['username'] === $username) 
      array_push($errors, "Username already exists");
    

?>

<form method="get" action="">
    
    
    <div style="width: 300px;">    
        <input type="text" name="username" class="form-control" placeholder="Username"  >
    </div>
    
        <br>
        <div style="width: 300px;"> 
        <input type="password" name="password" class="form-control" placeholder="Password" >
        </div>
    <br>
    
        <button type="submit" class="btn" name="login_user">Login</button>
   
    
  </form>
<?php if (isset($_GET['login_user'])) 
  $username = mysqli_real_escape_string($db, $_GET['username']);
  $password = mysqli_real_escape_string($db, $_GET['password']);

  if (empty($username)) 
    array_push($errors, "Username is required");
  
  if (empty($password)) 
    array_push($errors, "Password is required");
  

  if (count($errors) == 0) 
    
    $query = "SELECT * FROM registers WHERE username='$username' AND password='$password'";
    $results = mysqli_query($db, $query);
    if (mysqli_num_rows($results) == 1) 
      $_SESSION['username'] = $username;
      $_SESSION['success'] = "You are now logged in";
      header('location: index.php');
    else 
        array_push($errors, "Wrong username/password combination");
    
  
?>

每当我尝试登录时,它都不会登录,而是重新加载同一页面,并在 url 中显示输入的密码和用户名,如下所示

http://demo.website/teia/members/?username=test&password=testing&login_user=

谁能告诉我我的代码有什么问题

【问题讨论】:

这是核心 PHP 代码而不是 laravel 【参考方案1】:

https://laravel.com/docs/5.8/authentication

您可以找到用于创建 laravel 登录/注册的工作流程。

Laravel 自带身份验证/登录/注销,您无需自己编写代码!

【讨论】:

我不明白,那我应该如何更改我的代码? 好吧,在你的控制台中。此命令:“php artisan make:auth”将创建一个注册页面 + 登录页面,它将处理包括数据库在内的所有内容。 这个网站有一个基本的 laravel 视频教程:laracasts.com/series/laravel-from-scratch-2018 它涵盖了所有的基础知识,我相信它也是由 laravel 团队制作的【参考方案2】:

您在表单中使用了错误的方法。 GET 方法总是使用输入数据生成 URI,这在处理数据(例如用户个人信息)时确实是一个巨大的漏洞。 GET用于向指定资源请求数据,查询字符串在GET请求的URL中发送。

关于 GET 请求的一些其他说明:

GET 请求可以被缓存 GET 请求保留在浏览器历史记录中 GET 请求可以添加书签 在处理敏感数据时绝不应使用 GET 请求 GET 请求有长度限制

为防止这种情况发生,请使用 POST 方法。 POST 用于向服务器发送数据。使用 POST 发送到服务器的数据存储在 HTTP 请求的请求体中,而不是存储在 URI 中,这样更安全。

关于 POST 请求的一些其他说明:

POST 请求永远不会被缓存 POST 请求不会保留在浏览器历史记录中 无法为 POST 请求添加书签 POST 请求对数据长度没有限制

将您的表单更改为:

<form method="POST" action="">

参考:w3schools。

编辑:不要忘记将您的路线也更改为 POST。

【讨论】:

我之前用过post,但是显示post not supported,我应该用get,这就是我用get的原因 我也将路线更改为发帖,但仍不支持显示帖子 您能否编辑您的问题并包含您的路线。同时在控制台中运行php artisan route:list,并粘贴登录路径的输出。【参考方案3】:

第一个问题是您使用表单方法作为“get”。它应该是“帖子”。否则,您插入的数据将显示在 URL 中。

其次,表单的动作是空的。这就是它重新加载同一页面的原因。

要解决这个问题,你应该更深入地挖掘。您应该为表单定义一个操作 URL,并在 routes/web.php 中定义它。 然后它应该由控制器处理。您应该制作一个控制器并将其命名为 LoginController.php 之类的名称。 那么处理用户认证的逻辑应该存储在那里。

此外,laravel 有一个样板工作人员,可以使身份验证更容易一些。如果你喜欢,你应该通过这个documentation。

【讨论】:

【参考方案4】:

您正在使用表单方法 GET 而不是 POST,即输入值显示在 URL 中也转换下面的行

php if (isset($_GET['login_user'])) 
$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);

 php if (isset($_POST['login_user'])) 
 $username = mysqli_real_escape_string($db, $_POST['username']);
 $password = mysqli_real_escape_string($db, $_POST['password']);

【讨论】:

以上是关于laravel 登录在 url 中显示密码和 id的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 Laravel Vue 应用程序的 vue-router,如果我在登录后转到基本 URL,它会显示 404

Laravel 密码重置链接指向旧的 APP_URL

在 Laravel Auth() 中通过电子邮件/电话号码登录

Laravel sanctum 获得合适的用户

使用 vuejs 和 laravel 在 URL 中传递参数

Laravel 验证登录表单验证在密码确认中失败?