-
Notifications
You must be signed in to change notification settings - Fork 1
/
displayPics.php
133 lines (119 loc) · 3.53 KB
/
displayPics.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
/*
* Copyright 2008-2024 Anael MOBILIA
*
* This file is part of image-heberg.fr.
*
* image-heberg.fr is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* image-heberg.fr is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with image-heberg.fr. If not, see <http://www.gnu.org/licenses/>
*/
namespace ImageHeberg;
/*
* Affichage d'une image & mise à jour des stats
*/
if (!defined('_PHPUNIT_')) {
require 'config/config.php';
}
// URL demandée
$url = $_SERVER['REQUEST_URI'];
// Nom du fichier demandé - Nettoyer les paramètres
$fileName = basename(parse_url($url, PHP_URL_PATH));
// Faut-il forcer l'affichage (et ne pas enregistrer les stats) ?
$adminForceAffichage = false;
/**
* Gestion du God mode
*/
if (
str_contains($url, 'forceDisplay=1') // Mis en premier pour éviter d'ouvrir des sessions inutiles
&& UtilisateurObject::checkAccess(UtilisateurObject::LEVEL_ADMIN, false)
) {
$adminForceAffichage = true;
}
/**
* Définition du type
*/
if (preg_match('#/' . _REPERTOIRE_MINIATURE_ . '#', trim($url))) {
// Miniature
$monObjet = new MiniatureObject();
} else {
// Image (ou erreur)
$monObjet = new ImageObject();
}
/**
* Est-ce que le fichier existe en BDD et sur le système de fichier ?
*/
if (
!$monObjet->charger($fileName)
|| !file_exists($monObjet->getPathMd5())
) {
// Fichier non trouvé...
$monObjet = new ImageObject();
$monObjet->charger(_IMAGE_404_);
// Envoi d'un header en 404
header('HTTP/2 404 Not Found');
} elseif (
isset($_SERVER['HTTP_USER_AGENT'])
&& in_array($_SERVER['HTTP_USER_AGENT'], _ABUSE_DISABLE_PICS_WHEN_USERE_AGENT_, true)
) {
// Détection des User-Agent malveillant et blocage des images demandées
$monObjet->setSignalee(true);
$monObjet->sauver();
if (!_PHPUNIT_) {
// Générer un mail d'erreur à l'admin
require 'cron/abuse.php';
}
}
/**
* Le fichier est-il bloqué ?
*/
if (
!$adminForceAffichage
&& ($monObjet->isBloquee() || $monObjet->isSignalee())
) {
$monObjet = new ImageObject();
$monObjet->charger(_IMAGE_BAN_);
// Envoi d'un header en 451 -> Unavailable For Legal Reasons
header('HTTP/2 451 Unavailable For Legal Reasons');
} elseif (
!$adminForceAffichage
&& !$monObjet->isApprouvee()
&& (
// Image non suspecte
(!$monObjet->isSuspecte() && $monObjet->getNbViewPerDay() > _ABUSE_NB_AFFICHAGES_PAR_JOUR_BLOCAGE_AUTO_)
// Image suspecte -> seuils réduits
|| ($monObjet->isSuspecte() && $monObjet->getNbViewPerDay() > (_ABUSE_NB_AFFICHAGES_PAR_JOUR_BLOCAGE_AUTO_ / _ABUSE_DIVISION_SEUILS_SI_SUSPECT_))
)
) {
// Lancer un blocage de l'image si trop affichée
require 'cron/abuse.php';
}
/**
* Mise à jour des stats d'affichage
*/
if (!$adminForceAffichage) {
$monObjet->updateStatsAffichage($_SERVER['REMOTE_ADDR']);
}
/**
* Fermeture du lien sur la BDD
*/
MaBDD::close();
/**
* Envoi du bon entête HTTP
*/
if (!_PHPUNIT_) {
header('Content-type: ' . HelperImage::getMimeType($monObjet->getPathMd5()));
}
/**
* Envoi du fichier
*/
readfile($monObjet->getPathMd5());