登録日:
2025-02-12
最終更新日:
2025-03-21
ホームページ画像URL暗号化
ホームページの画像URLを暗号化する方法はいくつかありますが、目的によって適切な方法を選ぶ必要があります。 主な目的としては、セキュリティ強化、URLの直接アクセス防止、盗用防止 などが考えられます。
署名付きURLを使用する(AWS S3、CloudFrontなど)
クラウドサービスの署名付きURL(Signed URL)を利用すると、特定の条件(有効期限、IP制限など)を満たした場合のみ画像を表示できます。
AWS S3 + CloudFront
- 署名付きURLを生成し、一定時間後に無効化
- CloudFrontのSigned Cookiesでアクセス制限
Google Cloud Storage
- Cloud CDNを利用し、署名付きURLを発行
Firebase Storage
- 認証が必要な画像のみを提供
メリット
画像の直接アクセスを防止できる
デメリット
設定がやや複雑
URLのハッシュ化(Token付きURL)
画像URLにトークン(ハッシュ値)を含めることで、正規のページからしかアクセスできないようにする。
例
$secret_key = "my_secret_key";
$image_path = "/images/sample.jpg";
$timestamp = time();
$hash = hash_hmac('sha256',
$image_path . $timestamp,
$secret_key);
$url = "https://example.com/images/sample.jpg
?ts={$timestamp}
アクセス時にサーバー側で検証
$received_token = $_GET['token'] ?? '';
$received_ts = $_GET['ts'] ?? '';
$expected_hash = hash_hmac('sha256',
"/images/sample.jpg" . $received_ts,
$secret_key);
if ($received_token !== $expected_hash
|| time() - $received_ts > 300) {
header("HTTP/1.1 403 Forbidden");
exit();
}
メリット
有効期限付きで安全
デメリット
URLをコピーされるとその間はアクセス可能
Base64エンコード(簡易的な隠蔽)
画像URLをBase64エンコードして簡易的に隠す方法。
例
$image_url = "https://example.com/images/sample.jpg";
$encoded_url = base64_encode($image_url);
$final_url = "https://example.com/view.php
?img={$encoded_url}";
アクセス時にデコード
$image_url = base64_decode($_GET['img']);
header("Location: " . $image_url);
メリット
URLが直接分かりにくくなる
デメリット
Base64はデコード可能なため、セキュリティ強度は低い
画像をPHPスクリプト経由で配信
画像ファイルに直接アクセスさせず、PHPスクリプトで認証チェック後に画像を配信する。
例: exsample.php
session_start();
if (!isset($_SESSION['user_logged_in'])) {
header("HTTP/1.1 403 Forbidden");
exit();
}
$image_path = "images/sample.jpg";
header("Content-Type: image/jpeg");
readfile($image_path);
メリット
ログインユーザーのみ画像表示可能
デメリット
サーバー負荷が上がる
JavaScriptやCSSで画像パスを難読化(クライアントサイド)
JSで画像URLを動的生成し、HTMLソースコードに直接URLを記載しない方法。
const secretPath = "aHR0cHM6Ly9leGFtcGxlLmNvbS9==";
document.getElementById("image").src = atob(secretPath);
メリット
画像URLが直接表示されない
デメリット
JSを無効化すると表示不可
おすすめの方法
- 短期間のURL保護:署名付きURL(AWS CloudFront, GCS, Firebase)
- 一定期間の制限付きアクセス:Token付きURL(HMAC署名)
- ログインユーザー限定:PHPスクリプト経由で配信
- 単なる隠蔽:Base64エンコード or JS難読化