【问题标题】:PHP $_POST works but $_GET does notPHP $_POST 有效,但 $_GET 无效
【发布时间】:2021-02-21 09:34:52
【问题描述】:

我有一个 PHP 脚本,它接受用户名和密码,并将用户登录到 wordpress。如果我创建一个简单的表单并使用它工作的表单发布值。但是,如果我将值放在 url 中并使用 get 它不会。我看到数据仍然回显,但登录不起作用。有没有人有什么想法。

所以这行得通:

表格:

 <form action="/signon.php" method="post">
     <input type="text" id="email" name="email" class="form-control" placeholder="email" required autofocus>
     <input type="password" id="password" name="password" class="form-control" placeholder="password" required>

     <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
      
</form>

脚本

    <?php

/**
  * custom log in functionality
*/

//load wordpress
if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php')) {

  require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php');

}

     if ( !isset($_POST["email"]) || !isset($_POST["password"]) ) {
        echo "no user or pass set";
         return;
     }

     if (is_email($_POST['email'])) {
         $user = get_user_by('email', $_POST['email']);
         if (empty($user)) {
           echo "no user email set";
             //wp_redirect($_POST['_wp_http_referer']);
             exit;
         }
     } else {
         $user = get_user_by('login', $_POST['email']);
         if (empty($user)) {
           echo "no username set";
             //wp_redirect($_POST['_wp_http_referer']);
             exit;
         }
     }

     $user_admin_url = get_blogaddress_by_id($user->primary_blog) . 'wp-admin/';

     $creds = array();
     $creds['user_login'] = $user->user_login;
     $creds['user_password'] = $_POST['password'];
     $creds['remember'] = true;
     $user = wp_signon($creds, false);
     if (is_wp_error($user)) {

       echo "login error";

         exit;
     }
     wp_set_current_user($user->ID);
     wp_set_auth_cookie($user->ID);
     wp_redirect($user_admin_url);
     exit;

 ?>

如果我将它放在浏览器栏中并将 $_POST 更改为 $_GET 则不会

urltoscript.com/signon.php?email=someloginemail@me.com&password=123

脚本

    <?php

/**
  * custom log in functionality
*/

//load wordpress
if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php')) {

  require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php');

}

     if ( !isset($_GET["email"]) || !isset($_GET["password"]) ) {
        echo "no user or pass set";
         return;
     }

     if (is_email($_GET['email'])) {
         $user = get_user_by('email', $_GET['email']);
         if (empty($user)) {
           echo "no user email set";
             //wp_redirect($_GET['_wp_http_referer']);
             exit;
         }
     } else {
         $user = get_user_by('login', $_GET['email']);
         if (empty($user)) {
           echo "no username set";
             //wp_redirect($_GET['_wp_http_referer']);
             exit;
         }
     }

     $user_admin_url = get_blogaddress_by_id($user->primary_blog) . 'wp-admin/';

     $creds = array();
     $creds['user_login'] = $user->user_login;
     $creds['user_password'] = $_GET['password'];
     $creds['remember'] = true;
     $user = wp_signon($creds, false);
     if (is_wp_error($user)) {

       echo "login error";

         exit;
     }
     wp_set_current_user($user->ID);
     wp_set_auth_cookie($user->ID);
     wp_redirect($user_admin_url);
     exit;

 ?>

【问题讨论】:

  • 但实际上,不要将凭据放在查询字符串上。你为什么要这样做?
  • 另外我认为@应该是url编码为%40
  • 对不起@kerbh0lz 这是我帖子中的错误

标签: php


【解决方案1】:

@是一个保留符号,用于在URL的权限部分(//后面的位)中将用户信息与主机名分开。

当您输入电子邮件地址作为参数时,您需要使用 %40 而不是 @。

当使用 %20 代替空格字符时,经常会看到这种保留符号的替换。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2016-05-17
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多