消毒/逃避drupal的arg(x)的输出是必要的吗?

时间:2012-11-28 03:36:38

标签: drupal xss

我正在进行drupal 7安装,其中arg(x)

http://api.drupal.org/api/drupal/includes!bootstrap.inc/function/arg/7

已经在html输出中使用了很多,在视图模板和其他地方等。虽然我查看了文档并搜索了这个主题,但我仍然感到困惑,如果我需要清理/逃避使用php的htmlspecialchars或drupal的check_plain等输出arg(x)以防止xss。

1 个答案:

答案 0 :(得分:3)

从技术上讲,根据我的测试,你确实需要来逃避它。 但好的一面是,arg()始终不使用直接用户输入。

如果网址(或更确切地说,$_GET['q'])为node/<h3>/edit,则arg(1)会返回<h3>,而不会检查明确。 如果您想自己测试一下,请在下方添加一个片段,然后看看自己。

<?php
echo (arg(1, 'node/<h3>/edit')); ?>Normal text 

现在您将在h3中看到“普通文本”。

如果节点具有ID​​ 4,则在查看节点时,$_GET['q']将是节点/ 4。如果路径没有别名,则URL将相同。 根据上面的示例,如果用户打开node/<h3>,则arg(1)<h3>而不会转义,但有疑问用户会看到您使用arg()的代码段,因为该页面返回404结果(您没有看到任何块,页面内容等)。

arg()中使用t(),url(),l()和其他函数将始终逃避/清理结果,因此在实际应用中,您不太可能找到真实案例有人可以XSS您的网站。

这是一个我可以考虑的不好用途。 在page.tpl.php文件中,您可以从URL路径添加一个类,如下所示:

<body class="<?php print arg(0); ?>">

您可以预期在节点页面上,您会看到body标签的类是“node”,而在admin页面上,class是“admin”。但想象用户打开这样一个页面:

http://example.com/" onclick="alert('You are clicking on me');"

所以body标签的实际HTML就像这样:

<body class="" onclick="alert('You are clicking on me');">

现在您将看到body标签具有空的class属性,并且正文还添加了onclick事件。这可能是你能看到的最糟糕的例子 - 但我只是想向你展示一些真实的例子。 使用$node->nid是安全的。