将base64编码的用户数据放入img的src是否安全?

时间:2012-02-06 08:53:39

标签: php xss base64 filtering src

接受应该是 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转换为svgcanvas编码数据的页面(准确地使用“canvg”)。我需要将图像传递给服务器端脚本以使用图像执行其他任务,还需要将图像显示给用户/客户端。

3 个答案:

答案 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,则会破坏图像

考虑到这一点,我建立了一个能够很好地回答我的解决方案:

  1. 我们知道base64图像的开头遵循类似于&#34; data:image / png; base64,&#34;的模式,因此以下代码可以捕获此开头

    $data = substr($imageBase64, 0, strpos($imageBase64, ",") + 1);
  2. 好的,但我们只依赖于找到的第一个逗号,但没有提供任何安全性。因此,让我们使用preg_replace()来确保我们捕获的字符串确实是我们所期望的。

    $data = preg_replace('#^data:image/[^;]+;base64,#', '', $data);
  3. 如果一切按计划进行,$data中存储的结果将为空字符串。否则我们的图片在这里不再有效。现在我们需要验证第一个逗号之后的内容,因此我们只需使用base64_decode。

    $img = preg_replace('#^data:image/[^;]+;base64,#', '', $imageBase64);
    if(base64_decode($img, true)) {
      // is valid
    } else {
      // not valid
    }
  4. 我们使用相同的preg_replace替换字符串的开头,然后我们测试其余的以查看它是否与有效的base64数据匹配。如果肯定你可以将原始字符串存储在数据库中而不用担心,因为它的字符串非常干净,如果再次为负,我们的图像无效。