我继承了 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 参数隐藏的输入字段。我仍然认为这个问题与其他用途有关。