wordpress — ссылка для подтверждения электронной почты не работает в переполнении стека

Я работаю над пользовательским шаблоном страницы с подтверждением по электронной почте. Все работает отлично, за исключением того, что когда я нажимаю на ссылку в письме, она дает мне «страница не найдена».

В чем проблема в PHP-скриптах?

Вот фрагмент:

ob_start();
$email= '';

if(isset($_POST['submit'])){
if(!($_POST['subscriptions']=="")){
$email= isset($_POST['subscriptions']) ? $_POST['subscriptions'] : '';

function encryptLink($stringValue){
$key = "12345";
$qryStr = "subscriptions=".$stringValue;
$query = base64_encode(urlencode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $qryStr, MCRYPT_MODE_CBC, md5(md5($key)))));
$link = 'www.example.com/testEnvironment/confirmation/'.$query;

return $link;
}
$string = $email;
$pagelink = encryptLink($string);

//Email Details
$mail_to = $email;
$from_mail = "[email protected]";
$from_name = "";
$reply_to = "";
$subject = "Confirmation";
$message_body =
'Hey,

<span style="overflow-wrap: break-word; word-wrap: break-word;">'.$pagelink.'</span>';

//Generate a boundary
$boundary = md5(uniqid(time()));

//Email Header
$header = "From: ".$from_mail." \r\n";
$header .= "Reply-To: ".$reply_to."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed;\r\n";
$header .= " boundary=\"".$boundary."\"";

//Multipart wraps the Email Content
$message_body .= "\r\n\r\n";
$message_body  .= "--".$boundary."\r\n";
$message_body  .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n";
$message_body .= "Content-Transfer-Encoding: 7bit\r\n";
$message_body  .= "\r\n";
$message_body .= "$message_body\r\n";
$message_body .= "--".$boundary."\r\n";

//Send email
if (mail($mail_to, $subject, $message_body, $header)){
echo "Sent";
} else {
echo "Error";
}
}
}

Страница подтверждения PHP-фрагмент:

$key = "12345";

$queryString = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), urldecode(base64_decode($_SERVER['QUERY_STRING'])), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

parse_str($queryString);

if(!empty($stringValue)){
echo $stringValue;
} else{
exit("Invalid parameters passed");
}

1

Решение

Я думаю, что проблема заключается в том, что вы используете ссылку, для которой сервер не подготовлен — строка в кодировке base64 выглядит как страница или каталог в сгенерированном URL-адресе и, поскольку она случайна, не будет существовать — отсюда необходимость правила перезаписи и связанная логика в php.

В файле htaccess возможно такое правило:

RewriteEngine On
RewriteBase /testEnvironment/
RewriteRule ^confirmation/([a-zA-Z0-9_-]+)$ confirmation/index.php?data=$1 [NC,L]
/* this will need to be adjusted to your url - is it simply confirmation.php or other? */

уведомление data!

<?php
if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['data'] ) ){

$data=$_GET['data'];
$key = "12345";$queryString = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $key ), urldecode( base64_decode( $data ) ), MCRYPT_MODE_CBC, md5( md5( $key ) ) ), "\0");/* there is no return value from parse_str() so you would need to manually retrieve the variables to find `subscriptions` */
parse_str( $queryString );/* does this show anything ? */
print_r( $queryString );/*
if(!empty( $stringValue )){
print_r( $stringValue );
} else{
exit("Invalid parameters passed");
}
*/
}
?>My test environment
-------------------

## .htaccess ##
RewriteEngine On
RewriteBase /
RewriteRule ^stackconfirm/([a-zA-Z0-9_-]+)(/)?$ /test/stackconfirm.php?data=$1 [NC,L]/* PHP script to generate email and confirmation link*/

function encryptLink( $stringValue ){
$key = "12345";
$qryStr = "subscriptions=".$stringValue;
$query = base64_encode( urlencode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, md5( $key ), $qryStr, MCRYPT_MODE_CBC, md5( md5( $key ) ) ) ) );

/* for my test I changed this portion to match url structure on test server */
$link = '/stackconfirm/'.$query;
return $link;
}$link=encryptLink('[email protected]');
echo "<a href='$link'>Click here to confirm membership</a>";stackconfirm.php
----------------

<?php
if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['data'] ) ){

$data=$_GET['data'];
$key = "12345";

$queryString = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $key ), urldecode( base64_decode( $data ) ), MCRYPT_MODE_CBC, md5( md5( $key ) ) ), "\0");

echo '<pre>', $data, PHP_EOL, print_r( $queryString,true ), '</pre>';
}
?>Result
------
[email protected]
1

Другие решения

Вы соединяете свой ключ с URL-адресом подтверждения напрямую. Это всегда приведет к ошибке страницы 404, потому что ссылка не существует.
Вместо этого вы можете получить запрос через запрос get и обработать его в скрипте подтверждения следующим образом.

$link = 'www.example.com/confirmation/?key='.$query;

В скрипте подтверждения получите запрос через метод get следующим образом.

$key=$_GET['key'];

Пусть оригинальный ключ будет храниться как $original_key=12345;
Теперь проверьте, похож ли переданный ключ на исходный ключ,

if($key==$original_key)
{
//confirm e-mail
}
else
{
//invalid key
}
0

По вопросам рекламы [email protected]