1

我继承了 PHP、MySQL 和 Smarty 的代码库,并且正在为 Web 应用程序实现一个菜单系统。

我有一个这样的网址:http://example.com/?url=some/page

在我的数据库中,我存储字符串'some/page'并将其映射到一个文件'some/path/dir/mypage.php',当访问 URL 时,该文件包含include()在获取url参数的 PHP 脚本中。

该代码包含使用 GET 参数发布数据的表单,如果我在一个页面上,例如http://example.com/?url=myform/add我需要包含一个隐藏输入字段,其名称url为值所在的位置,myform/add以便表单可以将结果回发到正确的页面。

Smarty 的语法类似于{$smarty.get.url}获取 url GET 参数并输出它。这导致我的隐藏输入字段如下所示:

<input type="hidden" name="url" value="{$smarty.get.url}">

现在,我意识到我应该在将其打印为值之前清理 url 参数,但我不确定如何。使用{$smarty.get.url|escape:'url'}转义/字符以%2F导致:

<input type="hidden" name="url" value="myform%2Fadd">

当我提交表单时,它会转换为%252F给我网址:

http://example.com/?url=some%252Fpage

由于/应该是一个有效的查询参数,我不明白为什么它首先被编码。在查询中使用/对我来说也很重要,它可以让用户使用干净的 url 更好地理解 url。

所以问题就变成了,我应该如何处理 smarty 中的 get 参数以保持/原样,同时防止 XSS 攻击?

我不担心 PHP 方面的事情,因为我在阅读 $_GET['url'] 后得到了很好的保护。

编辑:也许我根本不需要转义它,因为 php 脚本获取 url 参数,如果参数与数据库中存储的参数不匹配,则永远不会加载表单,因此永远不会打印 get 参数隐藏的输入字段。我仍然认为这个问题与其他用途有关。

4

0 回答 0