【发布时间】:2023-04-11 05:25:01
【问题描述】:
我们正在使用 CleverReach 将人们重定向到我们的网站,因为他们已经双重选择了他们的邮件帐户。我们将电子邮件作为查询参数重定向到我们的网站,例如:example.com/thanks?email=foo@bar.com(通过在 CleverReach 后端设置重定向,例如 example.com/thanks?email={EMAIL})。显然,email 参数没有被cleverreach 进行urlencoded。
现在,在 Drupal 中,如果 URL 是这样的:example.com/thanks?email=hello+world@bar.com 并使用此代码:
$request = \Drupal::request();
$email = $request->query->get('email');
$email 是 hello world@bar.com。现在,我不知道这里的正确处理是什么。显然,我不能告诉 CleverReach 事先对他们的重定向进行 urlencode。我什至不知道这是否是最佳做法,或者我是否需要实施某些东西......
我发现的唯一一件事是 $_SERVER['QUERY_STRING'] 包含“真实”字符串,我可以对其进行 urlencode 然后重定向,然后通过读取查询参数对它们进行 urldecode。但我觉得我缺少一些重要的内置功能。
TL;DR
如果网站使用非 urlencoded 查询参数重定向到我的网站,我该如何阅读它们?
我目前的做法:
<?php
public function redirectIfIllegalUri() {
$request = \Drupal::request();
$email = $request->query->get('email', '');
$needsRedirect = (false !== strpos($email, ' ') || false !== strpos($email, '@'));
if ($needsRedirect && isset($_SERVER['QUERY_STRING']) && false !== strpos($_SERVER['QUERY_STRING'], 'email=')) {
$sqs = $_SERVER['QUERY_STRING'];
$sqs = htmlspecialchars($sqs);
$sqs = filter_var($sqs, FILTER_SANITIZE_STRING);
$sqs = filter_var($sqs, FILTER_SANITIZE_ENCODED);
$sqs = urldecode($sqs);
$sqs = explode('&', $sqs);
foreach ($sqs as $queryParam) {
if (false === strpos($queryParam, 'email=')) continue;
$values = explode('=', $queryParam);
$email = $values[1];
}
$emailEncoded = urlencode($email);
$query = $request->query->all();
$query['email'] = $emailEncoded;
$refreshUrl = Url::fromRoute('<current>');
$refreshUrl->setOptions([
'query' => $query,
]);
$response = new RedirectResponse($refreshUrl->toString(), 301);
$response->send();
return;
}
}
$request = \Drupal::request();
$email = urldecode($request->query->get('email', false));
【问题讨论】:
-
我不太明白,
?email=hello+world@bar.com是hello world@bar.com的 url 编码形式,这是一个无效的电子邮件地址,对吧? -
@johnSmith 如果它的编码很好,那么为什么
$_GET['email']返回hello world@bar.com呢?我认为编码版本将+替换为%2B。此外,这实际上是一个有效的电子邮件地址 -
那我不明白你的问题,如果
$_GET['email']总是返回 urldecoded 你应该没问题,不是吗?当电子邮件未进行 url 编码时,您有什么错误? -
正如我所说,
$_GET['email']返回hello world@bar.com而我期望hello+world@bar.com -
该问题必须从 ClerverReach 方面解决:无论此链接是在电子邮件模板中还是在最终确认页面模板中,都应该能够正确地转义该部分 url。负责为新订阅者生成此链接的代码在哪里?
标签: php apache symfony drupal-8 cleverreach