l'accès aux images privées est correctement protégé
This commit is contained in:
parent
025ed3cd9c
commit
d42ac6ddba
@ -38,3 +38,9 @@ Options -Indexes
|
|||||||
Header set X-Frame-Options "SAMEORIGIN"
|
Header set X-Frame-Options "SAMEORIGIN"
|
||||||
Header set X-XSS-Protection "1; mode=block"
|
Header set X-XSS-Protection "1; mode=block"
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
|
# Bloquer l'accès direct aux images privées
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^liste_albums_prives/.+\.(jpg|jpeg|png|gif)$ - [F]
|
||||||
|
</IfModule>
|
@ -228,7 +228,10 @@ $config = getSiteConfig();
|
|||||||
<div class="images-grid">
|
<div class="images-grid">
|
||||||
<?php foreach($images as $image):
|
<?php foreach($images as $image):
|
||||||
$imagePath = str_replace('\\', '/', substr($currentPath, strpos($currentPath, '/liste_albums_prives/') + strlen('/liste_albums_prives/')));
|
$imagePath = str_replace('\\', '/', substr($currentPath, strpos($currentPath, '/liste_albums_prives/') + strlen('/liste_albums_prives/')));
|
||||||
$imageUrl = getBaseUrl() . '/liste_albums_prives/' . ($imagePath ? $imagePath . '/' : '') . $image;
|
$imageUrl = getBaseUrl() . '/images.php?path=' . urlencode($currentPath . '/' . $image);
|
||||||
|
if (isset($_SESSION['admin_id'])) {
|
||||||
|
$imageUrl .= '&admin_session=' . session_id();
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
<div class="image-item">
|
<div class="image-item">
|
||||||
<input type="checkbox" name="images[]" value="<?php echo htmlspecialchars($image); ?>"
|
<input type="checkbox" name="images[]" value="<?php echo htmlspecialchars($image); ?>"
|
||||||
|
@ -34,7 +34,7 @@ if (empty($shareKey)) {
|
|||||||
if (in_array($extension, ALLOWED_EXTENSIONS)) {
|
if (in_array($extension, ALLOWED_EXTENSIONS)) {
|
||||||
// Obtenir le chemin relatif depuis la racine du projet
|
// Obtenir le chemin relatif depuis la racine du projet
|
||||||
$relativePath = str_replace('\\', '/', substr($file->getPathname(), strlen(realpath('./'))));
|
$relativePath = str_replace('\\', '/', substr($file->getPathname(), strlen(realpath('./'))));
|
||||||
$url = $baseUrl . '/' . ltrim($relativePath, '/');
|
$url = $baseUrl . '/images.php?path=' . urlencode($file->getPathname()) . '&key=' . urlencode($shareKey);
|
||||||
// Vérifier que le fichier existe et est accessible
|
// Vérifier que le fichier existe et est accessible
|
||||||
if (file_exists($file->getPathname())) {
|
if (file_exists($file->getPathname())) {
|
||||||
$images[] = $url;
|
$images[] = $url;
|
||||||
@ -148,7 +148,7 @@ $config = getSiteConfig();
|
|||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<div class="gallery-item <?php echo $isTop ? 'gallery-item-top' : ''; ?> <?php echo $spanClass; ?>">
|
<div class="gallery-item <?php echo $isTop ? 'gallery-item-top' : ''; ?> <?php echo $spanClass; ?>">
|
||||||
<a href="partage.php?image=<?php echo urlencode($image); ?>" target="_blank">
|
<a href="partage.php?image=<?php echo urlencode($image); ?>&key=<?php echo urlencode($shareKey); ?>" target="_blank">
|
||||||
<img src="<?php echo htmlspecialchars($image); ?>"
|
<img src="<?php echo htmlspecialchars($image); ?>"
|
||||||
alt="Image de la galerie"
|
alt="Image de la galerie"
|
||||||
loading="lazy">
|
loading="lazy">
|
||||||
|
34
images.php
Normal file
34
images.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
// images.php
|
||||||
|
require_once 'fonctions.php';
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
$path = $_GET['path'] ?? '';
|
||||||
|
$key = $_GET['key'] ?? '';
|
||||||
|
$adminSession = $_GET['admin_session'] ?? '';
|
||||||
|
|
||||||
|
// Vérifier que le chemin est valide et dans un album privé
|
||||||
|
if (!isSecurePrivatePath($path) || !file_exists($path)) {
|
||||||
|
header("HTTP/1.0 404 Not Found");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vérifier l'authentification (admin ou clé de partage valide)
|
||||||
|
if ($adminSession) {
|
||||||
|
session_id($adminSession);
|
||||||
|
session_start();
|
||||||
|
if (!isset($_SESSION['admin_id'])) {
|
||||||
|
header("HTTP/1.0 403 Forbidden");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!$key || !validateShareKey($key)) {
|
||||||
|
header("HTTP/1.0 403 Forbidden");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Servir l'image avec le bon Content-Type
|
||||||
|
$mime = mime_content_type($path);
|
||||||
|
header("Content-Type: $mime");
|
||||||
|
readfile($path);
|
32
partage.php
32
partage.php
@ -3,12 +3,36 @@ require_once 'fonctions.php';
|
|||||||
|
|
||||||
// Vérifier que nous avons une URL d'image
|
// Vérifier que nous avons une URL d'image
|
||||||
$imageUrl = isset($_GET['image']) ? $_GET['image'] : null;
|
$imageUrl = isset($_GET['image']) ? $_GET['image'] : null;
|
||||||
$imagePath = realpath('.') . str_replace(getBaseUrl(), '', $imageUrl);
|
|
||||||
if (!$imageUrl || !file_exists($imagePath)) {
|
if (!$imageUrl) {
|
||||||
header('Location: index.php');
|
header('Location: index.php');
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Si c'est une image privée
|
||||||
|
if (strpos($imageUrl, 'images.php') !== false) {
|
||||||
|
// On récupère les paramètres de l'URL de l'image
|
||||||
|
parse_str(parse_url($imageUrl, PHP_URL_QUERY), $params);
|
||||||
|
$path = $params['path'] ?? '';
|
||||||
|
$key = $params['key'] ?? '';
|
||||||
|
|
||||||
|
if (strpos($path, 'liste_albums_prives') !== false) {
|
||||||
|
$isPrivateImage = true;
|
||||||
|
if (!isset($_SESSION['admin_id'])) {
|
||||||
|
if (!$key || !validateShareKey($key)) {
|
||||||
|
header('Location: index.php');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} elseif (isset($_SESSION['admin_id'])) {
|
||||||
|
// Pour les admins, on remplace la clé par la session admin
|
||||||
|
$imageUrl = preg_replace('/&key=[^&]*/', '', $imageUrl) . '&admin_session=' . session_id();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Récupérer le nom du fichier pour le téléchargement
|
||||||
|
$filename = basename(parse_url($imageUrl, PHP_URL_PATH));
|
||||||
|
|
||||||
// Si pas d'image, redirection
|
// Si pas d'image, redirection
|
||||||
if (!$imageUrl) {
|
if (!$imageUrl) {
|
||||||
header('Location: index.php');
|
header('Location: index.php');
|
||||||
@ -30,7 +54,7 @@ $config = getSiteConfig();
|
|||||||
<link rel="stylesheet" href="styles.css">
|
<link rel="stylesheet" href="styles.css">
|
||||||
</head>
|
</head>
|
||||||
<body class="share-page">
|
<body class="share-page">
|
||||||
<button onclick="var referrer = document.referrer; if (referrer.includes('galeries.php')) { window.close(); } else { window.location.href='index.php'; }" class="back-button">Retour</button>
|
<button onclick="var referrer = document.referrer; if (referrer.includes('galeries.php') || referrer.includes('galeries-privees.php')) { window.close(); } else { window.location.href='index.php'; }" class="back-button">Retour</button>
|
||||||
|
|
||||||
<div class="share-container">
|
<div class="share-container">
|
||||||
<div class="share-image">
|
<div class="share-image">
|
||||||
@ -47,6 +71,7 @@ $config = getSiteConfig();
|
|||||||
Partager
|
Partager
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
<?php if (!$isPrivateImage): ?>
|
||||||
<button class="action-button" onclick="embedImage()">
|
<button class="action-button" onclick="embedImage()">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2">
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
<polyline points="16 18 22 12 16 6"></polyline>
|
<polyline points="16 18 22 12 16 6"></polyline>
|
||||||
@ -54,6 +79,7 @@ $config = getSiteConfig();
|
|||||||
</svg>
|
</svg>
|
||||||
Intégrer
|
Intégrer
|
||||||
</button>
|
</button>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
<a href="<?php echo htmlspecialchars($imageUrl); ?>"
|
<a href="<?php echo htmlspecialchars($imageUrl); ?>"
|
||||||
download="<?php echo htmlspecialchars($filename); ?>"
|
download="<?php echo htmlspecialchars($filename); ?>"
|
||||||
|
@ -1 +1 @@
|
|||||||
1.1.0
|
1.1.1
|
Loading…
x
Reference in New Issue
Block a user