为什么filter_input()不完整?

Pek*_*ica 12 php security

我目前在基于PHP的CMS上工作很多,虽然我在这里,但我希望将用户输入的所有处理和卫生都移到一个中心位置.(目前,这里是一个$ _REQUEST,那里是$ _GET,等等).

我非常喜欢filter_input(),并希望将它用于基本的卫生设施,但我不清楚这个功能是否真的是生产就绪.例如,文档为$ type命名以下参数

INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, INPUT_SESSION (not implemented yet) and INPUT_REQUEST (not implemented yet).

该函数自5.2.0以来就存在,为什么还没有实现两个关键元素呢?如果我想从$ _REQUEST获取数据,则必须使用用户提供的注释中的解决方法.有这个特殊原因吗?这个功能还处于某种形式吗?作为处理传入数据的第一个调用,它是否值得信赖?

也许熟悉PHP开发过程的人可以对此有所了解.

bob*_*nce 8

我想将用户输入的所有处理和卫生移动到一个中心位置

是的,那将是多么可爱.它无法完成.这不是文本处理的工作方式.

如果要将文本从一个上下文插入另一个上下文,则需要使用正确的转义.(mysql_real_escape_string用于MySQL字符串文字,htmlspecialchars用于HTML内容,urlencode用于URL参数,其他用于特定上下文).在进行过滤时,在脚本开始时,您不知道输入结束的位置,因此您不知道如何逃避它.

也许一个输入字符串既可以进入数据库(需要进行SQL转义),也可以直接进入页面(需要进行HTML转义).没有一个逃脱涵盖这两种情况.您可以一个接一个地使用两个转义符,但是HTML中的值将出现奇怪的反斜杠,数据库中的副本将充满&符号.几轮这种错误的编码,你得到的情况是每次你编辑的东西,长串\\\\\\\\\\\\\\\\\\\\&出来.

您可以在开始时一次性安全地过滤的唯一方法是在您将要使用它们的任何上下文中完全删除所有需要转义的字符.但这意味着HTML中没有撇号或反斜杠,您的数据库中没有符号或更少的符号,并且可能还有一大堆其他不友好的标点符号.对于一个不带任意文本的简单网站,你可能会侥幸逃脱.但通常不会.

因此,只有当一种文本进入另一种文本时,您才能逃脱.避免此问题的最佳策略是尽可能避免将文本连接到其他上下文中,例如通过使用参数化查询而不是SQL字符串构建,并定义echo(htmlspecialchars())具有良好短名称的函数以减少它努力键入或使用默认情况下HTML转义的替代模板系统.