我正在构建一个应用程序,允许用户使用HTML5画布数据,然后以base64编码并向所有用户显示该数据。我正在考虑将数据解析为实际的.png文件并存储在服务器上,但base64路线允许我将图像存储在数据库中,并将请求最小化。图像是独特的,很少,并且页面不会经常刷新。验证base64编码图像
的jQuery位将在画布上的数据,data:image/png;base64,iVBORw...
,并将它传递给一个包装它像这样一个PHP脚本:
然而,安全是基础,需要验证的base64帆布数据,以防止通过POST
请求中的恶意数据。我主要关心的是防止将外部URL注入到<img>
标记中并在页面加载时被请求。
目前,我有这样的设置:
$data = (isset($_POST['canvas']) && is_string($_POST['canvas'])) ? $_POST['canvas'] : null;
$base = str_replace('data:image/png;base64,', '', $data);
$regx = '~^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$~'
if ((substr($data, 0, 22)) !== 'data:image/png;base64,')
{
// Obviously fake, doesn't contain the expected first 22 characters.
return false;
}
if ((base64_encode(base64_decode($base64, true))) !== $base64)
{
// Decoding and re-encoding the data fails, something is wrong
return false;
}
if ((preg_match($regx, $base64)) !== 1)
{
// The data doesn't match the regular expression, discard
return false;
}
return true;
我想确保我的当前设置是足够安全的,以防止外部URL被插入<img>
标签,如果没有,可以做什么进一步验证图像数据?
这真是棒极了!公认。 如果图像数据无效,'imagepng'将会抛出'提供的参数不是有效的图像资源',所以我将该函数包装在'if'语句中以在失败时捕获它。 – ssh2ksh
你可以使用'imagecreatefrompng($ base64)'如果返回false,意味着不是图像 – mghhgm