【发布时间】: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->error; 什么都没有显示。
似乎由于某种原因if (isset($_GET['vkey'])) 没有正确接收vkey。我不确定我在这里做错了什么:
警告!此示例代码显示了不安全的方法,因为直接从用户输入接受 SQL 参数。需要Prepared Statements and Bound Parameters、real_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