【问题标题】:Unique identifier link value receiving failure in PHP isset GETPHP isset GET中的唯一标识符链接值接收失败
【发布时间】:2023-04-09 22:59:01
【问题描述】:

我正在尝试通过电子邮件验证注册,并向用户发送唯一标识符链接。

我从远程服务器使用它。服务器、用户名、密码、数据库值都正确,可以与其他.php-s 正常工作,唯一的区别verify.php 包含连接,而不是require 'connection.php';,但我不确定连接是否会产生以下故障。

发送:

$message = "<p>Hello, dear $user</p><a href='https://mypage.info/php/reg/verify.php?vkey=$vkey'>Confirm Account</a>";

并通过电子邮件接收:

https://mypage.info/php/reg/verify.php?vkey=4bf65cf02210b304143589e6dc3714c0

链接到verify.php,但php 抛出Something went wrong,或者 如果不是 die 我会检查 echo 'VKey: '. $vkey;echo $mysqli-&gt;error; 什么都没有显示。

似乎由于某种原因if (isset($_GET['vkey'])) 没有正确接收vkey。我不确定我在这里做错了什么:

警告!此示例代码显示了不安全的方法,因为直接从用户输入接受 SQL 参数。需要Prepared Statements and Bound Parametersreal_escape_string()

<?php
  if (isset($_GET['vkey'])) {
     $vkey = $_GET['vkey'];
     $mysqli = NEW MySQLi ('server','username','password','db');
     $resultSet = $mysqli->query("SELECT verified, vkey FROM registration WHERE verified = 0 AND vkey = '$vkey' LIMIT 1");

     if ($resultSet->num_rows == 1)
     {
         $update = $mysqli->query("UPDATE registration SET verified = 1 WHERE vkey = '$vkey' LIMIT 1");

         if($update){
            echo "Your account has been verified. You may now login.";
         } else {
            echo $mysqli->error;
         }
     } 
     else 
     {
         echo "This account invalid or already verified";
     }
    } else {
     die("Something went wrong");
  }
?>

【问题讨论】:

  • 对于初学者,请始终使用prepared statements and parameterized queries。永远不要直接从用户输入中接受 SQL 参数。绝不!另外:你的代码是否被调用过?您正在检查 POST ......但看起来您的 URL 是 GET。
  • @paulsm4 是的,当然,这只是没有准备好的语句的示例代码,我已经在上面包含了警报,但是 POST 它在我的主题中是错误的,在所有情况下我的意思是使用 GET在这里,请重新检查我的编辑
  • 只是关于您的“警报!”的注释部分。当您开始执行该任务时,您不需要准备好的语句 real_escape_string。只需准备好语句和参数就足够了。如果使用参数,则不需要 real_escape_string。
  • 无论如何,上面的代码中没有任何内容可以表明失败的原因。我建议检查您的网络服务器日志以查看实际接收到的 URL 以及它们的结构是否正确。
  • 好建议! L_O 应该在他的 PHP 中检测每个步骤(如下所示)。他应该检查他的 Apache“access.log”并验证接收到的 URL 完全是他期望的 URL。

标签: php html-email uniqueidentifier


【解决方案1】:

您的代码在 $_POST 数组而不是 $_GET 中查找

  if (isset($_GET['vkey'])) {
     $vkey = $_GET['vkey'];

【讨论】:

  • 我认为你在正确的轨道上。我不知道谁对你投了反对票,也不知道为什么:(
  • @suspectus 你好,对不起,我没有否决你的答案,其他人做了,但我用 POST 代替 GET 检查并得到相同的结果。好像这里有别的东西
  • 示例代码使用 $_POST 时不正确。因此我猜是-1。已更正。
  • @L_O 如果您收到 die 消息,则未设置 $_GET['vkey']。您可以查看网络服务器访问日志以了解收到的实际 URL 是什么吗?
  • @suspectus 好吧,我已经按时间和名称为 vkey 使用 md5 唯一标识符,现在我用 GUID 检查了它,由于某种原因,相同的代码可以正常工作并验证用户,但我还有另一个代码,它在几乎相同的情况下使用 md5,除了电子邮件,但将它与 GET 或 POST 一起使用,它工作正常
【解决方案2】:

建议:尽一切可能进行分析,然后发回您发现的内容。

例如:

<?php
  echo "vkey=" . $_GET['vkey'] . "...<br/>";
  if (isset($_GET['vkey'])) {
     $vkey = $_GET['vkey'];
     echo "vkey=" . $vkey . "...<br/>";
     $mysqli = NEW MySQLi ('server','username','password','db');
     echo "mysqli: SUCCEEDED...<br/>";
     $resultSet = $mysqli->query("SELECT verified, vkey FROM registration WHERE verified = 0 AND vkey = '$vkey' LIMIT 1");
     echo "resultSet: SUCCEEDED...<br/>";

     echo "resultSet->num_rows=" . $resultSet->num_rows . "...<br/>";
     if ($resultSet->num_rows == 1)
     {
         $update = $mysqli->query("UPDATE registration SET verified = 1 WHERE vkey = '$vkey' LIMIT 1");
         echo "update: SUCCEEDED...<br/>");

         if($update){
            echo "Your account has been verified. You may now login.";
         } else {
            echo $mysqli->error;
         }
     } 
     else 
     {
         echo "This account invalid or already verified";
     }
    } else {
      echo "ERROR STATE: " . $mysqli->error . "...<br/>";
     die("Something went wrong");
  }
?>

不,我想不出“...为什么 md5 字符串”可能是罪魁祸首。但我认为上述工具(或类似工具)可能会帮助我们确定问题发生的确切位置......以及如何解决它。

'希望对您有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2014-06-18
    相关资源
    最近更新 更多