6

我正在安装 arg(x) 的 drupal 7

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

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

4

1 回答 1

3

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

如果 URL(或更准确地说,$_GET['q'])是node/<h3>/edit,则arg(1)返回<h3>不带检查的内容。如果您想自己测试,请添加下面的代码段并自己查看。

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

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

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

使用arg()in t()、 url()l()和其他函数将始终对结果进行转义/清理,因此在实际世界中,您不太可能找到有人可以对您的网站进行 XSS 攻击的真实案例。

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

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

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

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

所以 body 标签的实际 HTML 应该是这样的:

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

现在你会看到 body 标签有一个空的 class 属性,并且 body 还添加了一个 onclick 事件。这可能是你能看到的最糟糕的例子——但我只是想给你看一些真实的例子。不过使用$node->nid是安全的。

于 2012-11-28T06:23:09.267 回答