dsarttv037029 2019-08-13 09:46
浏览 82

如何正确处理未编码的URL重定向到我的网站?

We are using CleverReach to redirect people to our website after they have double opt-in their mail account. We redirect the email as a query parameter to our website, like: example.com/thanks?email=foo@bar.com (by setting up a redirect in the CleverReach backend like example.com/thanks?email={EMAIL}). Apparently, the email parameter doesnt get urlencoded by cleverreach.

Now, in Drupal, if the URL is like so: example.com/thanks?email=hello+world@bar.com and using this code:

$request = \Drupal::request();
$email = $request->query->get('email');

$email is hello world@bar.com. Now, I dont know what the correct processing is here. Obviously, I cant tell CleverReach to urlencode their redirects beforehand. I dont even know if that would be best practice or if I need to imlement something...

The only thing I found out is that $_SERVER['QUERY_STRING'] contains the "real" string, which I can urlencode and then redirect, and then, by reading the query params, urldecode them. But I feel like I am missing some crucial inbuilt functionality.

TL;DR

If a website redirects to my website using not urlencoded query params, how do I read them?

My current approach:

<?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));

drupal request() docs

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 c程序不知道为什么得不到结果
    • ¥40 复杂的限制性的商函数处理
    • ¥15 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置