gpt4 book ai didi

php - filter_input() $_SERVER ["REQUEST_URI"] 与 FILTER_SANITIZE_URL

转载 作者:可可西里 更新时间:2023-11-01 13:24:18 24 4
gpt4 key购买 nike

我正在过滤 $_SERVER["REQUEST_URI"] 这样:

$_request_uri = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL);

php.net 中所述:

FILTER_SANITIZE_URL

Remove all characters except letters, digits and $-_.+!*'(),{}|\^~[]`<>#%";/?:@&=.

但是,

浏览器发送这个 REQUEST_URI 值 urlencode,因此它没有在这个 filter_input() 函数中被清理。说地址是

http://www.example.com/abc/index.php?q=abc��123

然后净化后的请求 url 是

/abc/index.php?q=abc%EF%BF%BD%EF%BF%BD123

但应该是

/abc/index.php?q=abc123

有可能是 urldecode($_SERVER["REQUEST_URI"]) 然后使用 filter_var() 我们可以获得经过清理的值。

$_request_uri = filter_var(urldecode($_SERVER['REQUEST_URI']), FILTER_SANITIZE_URL);

我不知道为什么最后一个在我看来“不够优雅”,我正在寻找一种优雅的方式,清理 $_SERVER["REQUEST_URI"].

也许,在编码时直接访问 super 全局数组($_SERVER['REQUEST_URI'])会打扰我,因此“不雅”。

有什么优雅的方法吗?

最佳答案

我认为您可以使用 mod_rewrite 或 apaches SetEnv 指令来取消对 url 服务器端的解码。这会改变 apache 中的 REQUEST_URI,从而改变 php 中 $_SERVER["REQUEST_URI"] 的值。

我不喜欢这个解决方案,您可能不想这样做。我看到的问题:

  • 它不允许多个 get 参数可能具有不同的验证规则。
  • 它允许任意参数。
  • 它需要用户可能没有的权限并更改默认服务器行为。
  • mod_rewrite 很少是好的解决方案。

避免全局的好的解决方案是在 INPUT_GET(而不是 INPUT_SERVER)上调用 filter_input 或 filter_input_array。

$urlParameters = http_build_query(
filter_input_array(
INPUT_GET,
FILTER_SANITIZE_URL
)
);

$_request_uri = filter_input(INPUT_SERVER, 'SCRIPT_URL', FILTER_SANITIZE_URL). ($urlParameters ? "?{$urlParameters}" : "");
print_r($_request_uri);

更好的解决方案是将特定参数列入白名单并使用特定规则进行验证,并直接使用这些参数(避免设置和解析 $_request_uri)

$_request_parameters = filter_input_array(
INPUT_GET,
array(
'q' => FILTER_SANITIZE_URL,
)
);

print_r($_request_parameters['q']);

关于php - filter_input() $_SERVER ["REQUEST_URI"] 与 FILTER_SANITIZE_URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24431460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com