接受应该是 base64编码的图像数据的POST
数据并将其用作src
的{{1}}属性是否安全?
img
显然,如果没有过滤,可能很容易突破<img src="data:image/png;base64,[data here]" />
属性和src
标记,并插入恶意img
或其他标记,所以我的想法是
<script />
检查是否已解码,然后
base64_decode($rawPostData)
将其放在base64_encode($decodedData)
属性中。
使用这种方法是否存在任何漏洞(例如XSS,可能是缓冲区溢出?)?
我需要将此页面转换为使用JavaScript将第三方src
转换为svg
到canvas
编码数据的页面(准确地使用“canvg”)。我需要将图像传递给服务器端脚本以使用图像执行其他任务,还需要将图像显示给用户/客户端。
答案 0 :(得分:3)
我会接受图像作为图像,然后base64_encode
。它保存了非常不必要的中间步骤,检查它是否按预期提交,也使得无法导致XSS。
如果你必须像在图像中一样验证base64,只需检查它只包含base64字符就足够了,因为你只是将它嵌入到img标签中(并且在base64中不允许使用标记符号。
使用内置功能:
if (base64_decode($mystring, true)) {
// is valid
} else {
// not valid
}
答案 1 :(得分:1)
如果您不验证数据的内容,则不安全。
示例:
$data= '"/><script>alert("hi");</script>';
print '<img src="data:image/png;base64,'.$data.'" />';
检查$data
only contains valid base64 characters非常简单。这些都不会破坏你的标签。
修改强>
以下内容只会导致图像损坏:
$data= '"/><script>alert("hi");</script>';
$data64 = base64_encode($data);
print '<img src="data:image/png;base64,'.$data64.'" />';
答案 2 :(得分:-1)
主要的安全问题是您无法将干净的XSS应用于此类数据。字符串&#34;数据的一部分:image / png; base64,&#34;删除如果应用了干净的XSS,则会破坏图像。
考虑到这一点,我建立了一个能够很好地回答我的解决方案:
我们知道base64图像的开头遵循类似于&#34; data:image / png; base64,&#34;的模式,因此以下代码可以捕获此开头
$data = substr($imageBase64, 0, strpos($imageBase64, ",") + 1);
好的,但我们只依赖于找到的第一个逗号,但没有提供任何安全性。因此,让我们使用preg_replace()来确保我们捕获的字符串确实是我们所期望的。
$data = preg_replace('#^data:image/[^;]+;base64,#', '', $data);
如果一切按计划进行,$data
中存储的结果将为空字符串。否则我们的图片在这里不再有效。现在我们需要验证第一个逗号之后的内容,因此我们只需使用base64_decode。
$img = preg_replace('#^data:image/[^;]+;base64,#', '', $imageBase64);
if(base64_decode($img, true)) {
// is valid
} else {
// not valid
}
我们使用相同的preg_replace替换字符串的开头,然后我们测试其余的以查看它是否与有效的base64数据匹配。如果肯定你可以将原始字符串存储在数据库中而不用担心,因为它的字符串非常干净,如果再次为负,我们的图像无效。