我们是否需要验证、清理或过滤简单的数字超全局变量(Cookie和Post)?

时间:2015-09-05 作者:CK MacLeod

我正在编写一个插件,该插件将UNIX日期时间存储在浏览器cookie中,并使用一个基于发送当前WordPress帖子ID号的简单表单的$\\u POST变量。

在阅读了WordPress和PHP中关于清理和验证的几篇文章和帖子之后,我还没有发现任何以这种方式处理cookie数据的文章和帖子,尽管我在这个网站上读到的语句似乎表明,通过隐藏字段以编程方式设置的简单$\\u POST变量可能不需要验证或转义。

Cookie使用JSON,插件设置并解码这三个Cookie,所有这些Cookie都包含简单的数组,以Post ID为键,以UNIX datetime为值。除了在条件中相互比较之外,有时还会转换和显示datetimes。

现在,在NetBeans上,每当代码使用COOKIE变量时,我都会收到“请勿直接访问超全局COOKIE数组”的警告,即使我只是检查它是否已设置,如下所示:

if (isset($_COOKIE[\'new_session\'])) {
    //stuff
}
(是的,我知道,如果您想通过插件或其他代码启用WordPress的$\\u会话,您也可以启用该会话-我决定反对该路线,但如果有人给我这样做的理由,我仍然可以说服我改变主意!)

我在提取数据时也会收到警告,例如:

$prev_visit = json_decode( stripslashes( $_COOKIE[\'prev_visit\'] ), true );
编辑:UNIX日期时间作为结果中的值进行访问$prev_visit 大堆因此,为了获得日期时间,我们使用$prev_visit[$id], $id是从get\\u the\\u id()直接或间接(在第二种情况下通过下面的$\\u Post变量)派生的WP Post id号,并用作键。

POST变量

对于$\\u POST数据,正如我所说,它是通过一个简单的表单创建的:用户按下按钮,隐藏输入发送Wordpress POST ID号作为“标记所有已读”值。关键线路:

$id = get_the_ID();
在PHP中创建按钮/表单:

$mark-all-read-button .= \'<input type="hidden" name="mark-all-read" value="\' . $id . \'" />\';
在下一次刷新(操作添加到“init”)时,我们检查\'mark-all-read\' 设置,如果设置了,则使用$id为上述cookie[编辑:]设置键,如上面更一般的示例所示。(这就是我所说的使用通过get\\u the\\u ID()派生的ID“间接”的意思。)

我不知道这是否是在这个插件中实现我的目标的最佳方式,但到目前为止它运行得很好。然而,在我与全世界分享之前,我想知道它是否安全使用。

问题是,我们是否需要验证和/或清理上面使用的超全局,如果需要,具体如何?

1 个回复
SO网友:Mark Kaplun

不看问题,只看标题,答案是肯定的。来自外部世界的任何输入都应该在适当的情况下进行验证和清理,这包括输入服务器收到的事实是,它可能是以您设计的表单生成的,这与此无关。绝不应信任输入。

现在谈谈内部一致性。在验证和清理输入字段之后,应该检查数据在预期处理的上下文中是否有意义。如果您需要一个post的post id,那么您不仅需要检查它是否确实存在,还需要检查它是否不是页面。这实际上只是验证的另一个方面。。。您越早在代码路径中执行此操作,错误消息越详细,您的生活就越轻松。

那么具体怎么做呢?没有配方,不同的环境需要不同的验证和卫生条件。最好从尽可能严格的检查开始,然后只有在检查过的情况下才放松检查。

相关推荐

Setting Cookies

我创建了两个主题(浅色和深色),但我不知道如何设置cookie,以便用户在页面之间导航或下周返回站点时,主题保持不变。是否有一个简单的脚本可以添加到现有代码中?HTML<html> <head> <link id=\"lightTheme\" rel=\"stylesheet\" type=\"text/css\" href=\"styleSheetLightTheme.css\"> <link id=\"darkTheme\" r