过滤器函数

目录

添加注释

用户贡献的注释 6 个注释

3
vojtech at x dot cz
17 年前
还要注意,过滤器函数只使用传递给脚本的原始变量值,即使您在脚本中稍后更改了超级全局变量($_GET、$_POST 等)中的值。

<?php
echo filter_input(INPUT_GET, 'var'); // 打印 'something'
echo $_GET['var']; // 打印 'something'
$_GET['var'] = 'changed';
echo
filter_input(INPUT_GET, 'var'); // 打印 'something'
echo $_GET['var']; // 打印 'changed'
?>

实际上,外部数据在脚本处理之前在 SAPI 中被复制,过滤器函数不再使用超级全局变量(如以下过滤器教程中“它是如何工作的?”部分所述)。
0
fumble1 at web dot de
17 年前
我建议您使用 FILTER_REQUIRE_SCALAR(或 FILTER_REQUIRE_ARRAY)标志,因为您可以使用方括号来访问字符串偏移量和数组元素——但是,这不仅会导致意外的行为。请看这个例子

<?php
$image
= basename(filter_input(INPUT_GET, 'src', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW));
// 进一步检查
?>

/script.php?src[0]=foobar 会导致警告。 :-(
因此我推荐

<?php
$image
= basename(filter_input(INPUT_GET, 'src', FILTER_UNSAFE_RAW, FILTER_REQUIRE_SCALAR | FILTER_FLAG_STRIP_LOW));
// 进一步检查
?>
-1
vojtech at x dot cz
17 年前
只需注意,如以下过滤器教程中提到的,“服务器和环境支持可能无法在所有 SAPI 中工作,对于过滤器 0.11.0 或 PHP 5.2.0”。

解决方法显而易见
而不是
<?php
$var
= filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_DEFAULT);
?>
使用
<?php
$var
= filter_var(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : NULL, FILTER_DEFAULT);
?>
-5
Richard Davey rich at corephp dot co dot uk
17 年前
有一个 FILTER_VALIDATE_BOOLEAN 的未记录过滤器标志。文档暗示,如果值不匹配允许的真/假值,它将返回 NULL。但是,除非您像这样给出 FILTER_NULL_ON_FAILURE 标志,否则不会发生这种情况

<?php
$value
= 'car';
$result = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
?>

在上面的代码中,$result 将等于 NULL。如果没有额外的标志,它将等于 FALSE,这通常不是此特定过滤器的预期结果。
-13
ckroll at rightmedia dot com
17 年前
注意,FILTER_SANITIZE_STRING 标志的功能与 strip_tags 非常相似,因此 < 将从输入中过滤掉,无论它是否实际上是标签的一部分。当尝试在动态按钮上打印 < 时,我们在编写的图形库中遇到了意外的结果。URL 的输入类似于 ?string=%3C (<),但在过滤器运行后它为空。为了解决这个问题,您可以对该参数使用 FILTER_UNSAFE_RAW。
-19
user
17 年前
以下是一些使用过滤器 API 来限制 IPv4 私有地址范围访问局域网的代码。

这些注释可以节省其他人一些时间

filter_input_array() 对于对同一个键运行多个过滤器毫无用处。
无法链接或否定过滤器。

<?php

/* 仁慈的评论! */
function FILTER_NEGATE_HACK($_){ return (bool)!$_; }

function
client_is_private_ipv4(){
return (
filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) &&
FILTER_NEGATE_HACK(filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE));
}

if (!
client_is_private_ipv4())
exit(
'此应用程序仅限于本地网络用户');

?>
To Top