将用户输入作为url的一部分进行消毒



我从外部客户端脚本获得一个字符串,稍后必须将其作为url的一部分附加。现在我想知道的是,什么是最好的方式来保护这些数据?

我得到的字符串的结构是这样的:
dynamicVal#staticVal:dynamicVal

这个值将被添加到url中:
http://the-page.com/dynamicVal#staticVal:dynamicVal

url的用法如下:

$link = htmlspecialchars("http://external-page.com/dynamicVal#staticVal:dynamicVal", ENT_QUOTES);
$var = "<a href="javascript: window.open('$link')">'Open URL'</a>";

问题是,htmlspecialchars不会帮助防止随机javascript代码的执行,例如,通过将此警报添加到值:

dynamicVal#staticVal:dynamicVal'+alert("breakout")+'

使用rawurlencode也没有帮助,因为它不是参数的值,而是url的实部分。
那么,在连接到url时,对传递的字符串进行消毒的最佳方法是什么呢?

提前感谢。

编辑:

仅在动态部分使用rawurlencode实际上也没有解决问题,javascript仍然被执行。
测试代码:

$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal'+alert("breakout")+'");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode($tmpArr[0]), rawurlencode($tmpArr[1])), ENT_QUOTES);
echo "<a href="javascript: window.open('$link')">'Open URL'</a>";

Edit2: 在传递字符串作为javascript参数时使用json_encode也没有帮助。改编测试片段:

$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal"+alert('breakout')+"");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode($tmpArr[0]), rawurlencode($tmpArr[1])), ENT_QUOTES);
echo  "<a href="javascript: window.open(".htmlspecialchars(json_encode($link), ENT_QUOTES).")">'Open URL'</a>";

适应做:
更改了恶意JS中的引号。
htmlspecialchars移动到json_encode周围,因为返回双引号字符串,否则会破坏html

您应该使用urlencode()。不是整个字符串,而是动态部分。

$link = sprintf('http://external-page.com/%s#staticVal:%s', urlencode('dynamicVal'), urlencode('dynamicVal'));
$var  = "<a href="javascript: window.open('$link')">'Open URL'</a>";

编辑:

好的-我知道你的问题了。我没有意识到要将代码插入到JavaScript函数调用中。您必须确保JavaScript解释器将您的链接视为window.open()的字符串参数:

$link = sprintf('http://external-page.com/%s#staticVal:%s', urlencode('dynamicVal'), urlencode('dynamicVal'));
$var  = "<a href="javascript: window.open(".json_encode($link).")">'Open URL'</a>";

对于完整的,我能够通过在使用rawurlencode之前简单地将addslashes放在动态部分来解决这个问题。
这两个函数调用都需要防止爆发。使用addslashes可以防止正常引号(', "),使用rawurlencode可以防止已经编码的引号(%29, %22)造成伤害。

所以最终解是这样的:

$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal'+alert("breakout")+'");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode(addslashes($tmpArr[0])), rawurlencode(addslashes($tmpArr[1]))), ENT_QUOTES);
echo "<a href="javascript: window.open('$link')">'Open URL'</a>";

相关内容

  • 没有找到相关文章

最新更新