役立つ情報
登録日: 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難読化

Copyright 役立つ情報.net