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

Kri*_*hen 6 xss drupal

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

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

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

Aye*_*h K 3

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

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

<?php
echo (arg(1, 'node/<h3>/edit')); ?>Normal text 
Run Code Online (Sandbox Code Playgroud)

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

如果节点的 ID 为 4,则查看该节点时,$_GET['q']将为节点/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); ?>">
Run Code Online (Sandbox Code Playgroud)

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

http://example.com/" onclick="alert('You are clicking on me');"
Run Code Online (Sandbox Code Playgroud)

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

<body class="" onclick="alert('You are clicking on me');">
Run Code Online (Sandbox Code Playgroud)

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