我正在进行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。
答案 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
是安全的。