【发布时间】:2012-09-30 04:31:48
【问题描述】:
我正在构建一个应用程序,允许用户POST HTML5 画布数据,然后以 base64 编码并显示给所有用户。我正在考虑将数据解析为实际的 .png 文件并存储在服务器上,但是 base64 路由允许我将图像存储在数据库中并最小化请求。图片独特,很少,页面不会经常刷新。
一点 jQuery 将获取画布数据 data:image/png;base64,iVBORw... 并将其传递给 PHP 脚本,该脚本如下所示:<img src="$data"></img>
但是,安全性是基石,需要验证 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> 标记中,如果没有,可以做些什么来进一步验证图像数据?
【问题讨论】:
-
请记住,getimagesizefromstring (php.net/manual/en/function.getimagesizefromstring.php) 会将您传递给它的字符串编码为 base64,因此如果您传递一个已经编码的字符串,它将返回 false。如果您的图像数据已经是 base64 编码,则需要在将字符串传递给 getimagesizefromstring 之前对字符串使用 base64_decode (php.net/manual/en/function.base64-decode)。
标签: php security validation base64