我继承了PHP,MySQL和Smarty的代码库,我正在为Web应用程序实现一个菜单系统。
我有一个这样的网址:http://example.com/?url=some/page
在我的数据库中,我存储字符串'some/page'
并将其映射到文件'some/path/dir/mypage.php'
,并且在访问URL时,使用include()
在PHP脚本中包含文件,该脚本提取{{ 1}}参数。
代码包含使用GET参数发布数据的表单,如果我在url
这样的页面上,我需要包含一个名为http://example.com/?url=myform/add
的隐藏输入字段,其值为{ {1}}以便表单可以将结果发回到正确的页面。
Smarty具有类似url
的语法,可以获取url GET参数并输出它。这导致我的隐藏输入字段如下所示:
myform/add
现在,我意识到我应该在将它打印为值之前清理url参数,但我不确定如何。使用{$smarty.get.url}
将<input type="hidden" name="url" value="{$smarty.get.url}">
字符转义为{$smarty.get.url|escape:'url'}
,结果为:
/
当我提交表单时,它会转换为%2F
给我的网址:
<input type="hidden" name="url" value="myform%2Fadd">
由于%252F
应该是一个有效的查询参数,我不知道为什么它首先被编码。在查询中使用http://example.com/?url=some%252Fpage
对我来说也很重要,允许用户通过干净的网址以更好的方式理解网址。
所以问题就变成了,我应该如何处理smarty中的get参数以保持/
不变,同时防止XSS攻击呢?
因为我在阅读$ _GET ['url']后得到了很好的保护,所以我并不担心PHP方面的问题。
编辑:也许我根本不需要逃避它,因为php脚本获取url参数,如果参数与数据库中存储的不匹配,表单永远不会被加载,因此get参数是永远不会打印在隐藏的输入字段中。我仍然认为这个问题与其他用途有关。