当使用filter_input()(When to use filter_input())

2019-07-20 14:32发布

这个问题本来是问评论这里 。

是filter_input()仍然是必要的,如果你正在使用参数化查询,并用htmlspecialchars()打印所有用户提供的数据之前?

它似乎没有必要给我,但我一直被告知“过滤输入,转义输出”。 所以,除了从数据库中(或存储的另一种形式),是否有任何需要过滤输入的数据?

Answer 1:

那么,有将要不同的意见。

我的观点是,你应该总是使用它(或者,在filter扩展一般)。 至少有3个方面的原因:

  1. 消毒输入是你应该总是这样。 由于该功能为您提供了这个功能实在是没有理由找消毒输入的其他方式。 因为它是一个扩展的过滤器也会比大多数PHP解决方案在那里,这当然不会伤害更快,最有可能的安全。 唯一的例外是,如果你需要一个更专业的过滤器。 即使如此,你应该抓住用价值FILTER_UNSAFE_RAW过滤器(见#3)。

  2. 有很多的好东西的filter扩展。 它可以节省你的写作消毒和验证码小时。 当然,这并不涵盖每一种情况下,但有足够的,这样就可以更专注于特定的滤波/验证码。

  3. 使用功能是当你在调试/审计你的代码非常好。 当使用功能你确切地知道输入的是什么。 例如,如果您使用FILTER_SANITIZE_NUMBER_INT过滤器,那么你可以肯定的是,投入将是一个数-没有SQL注入,没有HTML或JavaScript代码等。如果,在另一方面,使用类似FILTER_UNSAFE_RAW那么你就知道它应该被认真对待,它可以很容易造成安全问题。



Answer 2:

作为Sverri M.奥尔森说,有这个不同意见。

我非常同意哲学过滤输入,转义输出

是filter_input()仍然是必要的,如果你正在使用参数化查询并用htmlspecialchars()打印所有用户提供的数据之前?

简短的回答:IMO,不,这是没有必要的,但在某些情况下是有用的。


filter_input功能有许多有用的过滤器,和我使用它们中的一些(即FILTER_VALIDATE_EMAIL)。 的验证过滤器是用于确认输入有用。 然而,国际海事组织,即转换数据的那些只应在输出中使用。

有人鼓励逃逸输入。 事实上,在给出的例子filter_input手册页似乎鼓励这一点。

$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);

唯一的例子是转义 。 这与功能(filter_ 输入 )名称合并似乎表明,逃逸的输入是很好的做法。 转义是必要的,但,IMO,应做输出之前,不能输入。 至少有返回值被存储在适当命名的变量。

我强烈逃逸输入不同意 。 我已经遇到现实世界的情况下过早地将数据转换是一个问题。

例如,谷歌分析中,是造成我的编码符号(%26)将要被解码以查询现有参数被排除这样的方式处理输入。 其结果是,我有那个实际上并不在我的网址,甚至存在查询参数统计。 见我的问题关于这一议题仍未解决。

您可能还需要阅读为什么要逃跑,在输入是一个坏主意 。 以下是一些摘录,我同意,以防万一文章[原强调]消失。

[...]逃生的输入是错误的 [...]这是一个分层冲突-它混合输出格式化关注到输入处理。 分层违规使你的代码更难理解和维护,因为你必须要考虑到的,而不是让每个组件层做自己的工作的其他层。

你已经在默认情况下损坏的数据。 该系统[...]现在躺在什么数据已经进来了。

逃离输入不但不能处理多个输出的问题,这实际上使您的数据不正确的许多输出。

PHP曾经有一个叫魔术引号功能。 这是一种逃避,对输入的功能,[...]造成的各种问题。 [...]根据Lerdorf就备受新的PHP“过滤器”延伸“magic_quotes的做对”。 但它仍然几乎所有在这里描述的问题困扰。

因此,如何是过滤器扩展比魔术引号(不是事实,它有许多不同的过滤器等)更好? 该过滤器会导致许多相同的问题,那魔术引号一样。


下面是我用的编码约定:

  • 在_POST,$ _GET,$ _REQUEST等值不应该逃脱,应始终被视为不安全
  • 数值应被写入数据库之前被验证1或存储在$ _SESSION
  • 预期值是数字或布尔应被写入数据库之前进行消毒2或存储在$ _SESSION
  • 从数据库相信,数字和布尔值和$ _SESSION确实是数字或布尔
  • 字符串值应该是SQL转义被直接用于任何SQL查询之前(非字符串值应当被消毒2)或使用预准备语句
  • 字符串值应该是HTML转义在被使用之前HTML输出(非字符串值应该被消毒2)
  • 字符串值应该是百分比编码在查询字符串中使用(非字符串值应当被清洁2)之前
  • 使用变量命名约定(如* _url,* _html,* _SQL)来存储变换的数据

术语

在这里我的目的,我这是怎么定义上面使用的术语。

  1. 验证装置确认任何假设正在作出关于具有值的数据,例如具有特定的格式或所需的字段
  2. 消毒手段来确认值是完全相同的预期(即$ ID_NUM应该包含什么,但数字)

摘要

一般(有一些例外),我提出以下建议:

  • 使用验证的过滤器上输入
  • 使用了sanitize滤波器 输出
  • 记得TIMTOWDI -举例来说, 我更喜欢用htmlspecialchars()(其中有更多的选择)在FILTER_SANITIZE_FULL_SPECIAL_CHARS或FILTER_SANITIZE_SPECIAL_CHARS(其逃脱换行符)


文章来源: When to use filter_input()
标签: php security