- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在过滤 $_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() 函数中被清理。说地址是
然后净化后的请求 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"] 的值。
我不喜欢这个解决方案,您可能不想这样做。我看到的问题:
避免全局的好的解决方案是在 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/
据我了解,在获得( $_GET )网址后,%20 已经转换为空格。所以如果我再使用 filter_var($url, FILTER_SANITIZE_URL)函数,它删除已经转换的空格。 我该如何解决
我正在过滤 $_SERVER["REQUEST_URI"] 这样: $_request_uri = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_S
我是一名优秀的程序员,十分优秀!