ユーザーがPOST
HTML5 キャンバス データを使用できるようにするアプリケーションを構築しています。このデータは base64 でエンコードされ、すべてのユーザーに表示されます。データを実際の .png ファイルに解析してサーバーに保存することを検討していますが、base64 ルートを使用すると、画像をデータベースに保存してリクエストを最小限に抑えることができます。画像はユニークで数が少なく、ページが頻繁に更新されることはありません。
少しの jQuery がキャンバス データを取得し、data:image/png;base64,iVBORw...
それを次のようにラップする PHP スクリプトに渡します。<img src="$data"></img>
POST
ただし、セキュリティは基礎であり、base64 キャンバス データを検証して、リクエストで悪意のあるデータが渡されないようにする必要があります。私の主な関心事は、外部 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>
、そうでない場合は、画像データをさらに検証するにはどうすればよいですか?