【问题标题】:Page crashing from '#' as a GET-parameter页面从 '#' 作为 GET 参数崩溃
【发布时间】:2019-03-08 17:53:04
【问题描述】:

我一直在使用 URL 参数使搜索表单后面的登录页面更加个性化。我觉得相对这样的验证东西是防弹的

$string = $_GET['city']
$res = preg_replace("/[^a-zA-Z0-9]/", "", $string);

直到我尝试像 ?city=# 这样的值作为值,我的整个页面崩溃了,我不再那么确定了。

在不编写整个引擎或至少阻止我的页面从 # 崩溃的情况下进行验证的方法是什么?

谢谢

【问题讨论】:

  • 你必须逃避它。 url 中未转义的# 标记发送到服务器的本地部分

标签: php wordpress validation get


【解决方案1】:

PHP 有很多功能可以帮助您避免此类问题。
每当您创建要在浏览器中显示的 URL 时,它必须是 urlencoded。如果您只是将查询字符串部分附加到固定 url,您可以使用 http_build_query 构建该字符串。例如:

$querystring = [
    'param1' = 123,
    'param2' = 'hello with a #'
];
$QS_encoded = http_build_query($querystring);
echo '<a href="?'.$QS_encoded.'">My link</a>';

# in URL 表示 URL 的另一部分,即哈希部分。这不会成为您的$_GET superglobal 的一部分。

如果出于任何原因您想手动输入包含# 的查询字符串的URL,那么您需要使用编码版本%23。例如http://php.net/manual-lookup.php?pattern=%23

附带说明。您不应该使用正则表达式来过滤这样的数据。 PHP 再次为此提供了扩展:filters

【讨论】:

  • 我看到了反对票,但没有解释我的回答有什么问题。有人愿意解释一下吗?
  • 感谢您的详细解释,对我帮助很大。不知道是谁投了反对票。由于我很新,我无法再次投票给你 - 抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2017-02-21
  • 2013-06-06
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多