我从外部客户端脚本获得一个字符串,稍后必须将其作为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>";