-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproxy_api.php
More file actions
174 lines (147 loc) · 5.76 KB
/
proxy_api.php
File metadata and controls
174 lines (147 loc) · 5.76 KB
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
define("LOADED_AS_MODULE","1");
define('ALLOWED_DOMAIN', 'le-systeme-solaire.net');
include_once('include/apiconf.php');
/**
* Vérifie que la requête provient du domaine autorisé
*/
function verifyDomain() {
// Vérifier le referer
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$refererHost = parse_url($referer, PHP_URL_HOST);
// Vérifier l'origine
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
$originHost = parse_url($origin, PHP_URL_HOST);
// Vérifier le host
$host = $_SERVER['HTTP_HOST'] ?? '';
$allowedDomain = ALLOWED_DOMAIN;
// Accepter le domaine principal et ses sous-domaines
$isValidReferer = $refererHost === $allowedDomain ||
str_ends_with($refererHost, '.' . $allowedDomain);
$isValidOrigin = $originHost === $allowedDomain ||
str_ends_with($originHost, '.' . $allowedDomain);
$isValidHost = $host === $allowedDomain ||
str_ends_with($host, '.' . $allowedDomain);
// Au moins une des vérifications doit passer
if (!$isValidReferer && !$isValidOrigin && !$isValidHost) {
http_response_code(403);
die(json_encode(['error' => 'Accès interdit']));
}
}
/**
* Vérifie que la méthode est autorisée
*/
function verifyMethod() {
if ($_SERVER['REQUEST_METHOD'] !== 'GET' && $_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
die(json_encode(['error' => 'Méthode non autorisée']));
}
}
/**
* Ajoute les en-têtes CORS pour le domaine autorisé
*/
function addCorsHeaders() {
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
$originHost = parse_url($origin, PHP_URL_HOST);
$allowedDomain = ALLOWED_DOMAIN;
// Vérifier que l'origine est autorisée
if ($originHost === $allowedDomain || str_ends_with($originHost, '.' . $allowedDomain)) {
header('Access-Control-Allow-Origin: ' . $origin);
}
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
header('Access-Control-Allow-Credentials: true');
}
// Vérifications de sécurité
verifyDomain();
verifyMethod();
addCorsHeaders();
try {
// Récupération des paramètres selon la méthode
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
if ($input) {
$lat = isset($input['lat']) ? (float)$input['lat'] : $lat;
$lon = isset($input['lon']) ? (float)$input['lon'] : $lon;
$elev = isset($input['elev']) ? (float)$input['elev'] : $elev;
$zone = isset($input['zone']) ? (float)$input['zone'] : $zone;
$datetime = isset($input['datetime']) ? $input['datetime'] : $datetime;
}
} else {
// Méthode GET
$lat = isset($_GET['lat']) ? (float)$_GET['lat'] : $lat;
$lon = isset($_GET['lon']) ? (float)$_GET['lon'] : $lon;
$elev = isset($_GET['elev']) ? (float)$_GET['elev'] : $elev;
$zone = isset($_GET['zone']) ? (float)$zone : $zone;
$datetime = isset($_GET['datetime']) ? $_GET['datetime'] : $datetime;
}
// Validation des paramètres
if ($lat < -90 || $lat > 90) {
throw new Exception("Latitude invalide: {$lat} (doit être entre -90 et 90)");
}
if ($lon < -180 || $lon > 180) {
throw new Exception("Longitude invalide: {$lon} (doit être entre -180 et 180)");
}
// Validation du format datetime (ISO 8601 basique)
if (!preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/', $datetime)) {
throw new Exception("Format de date invalide: {$datetime}. Utilisez YYYY-MM-DDTHH:MM:SS");
}
// Construction de l'URL avec paramètres
$params = http_build_query([
'lat' => $lat,
'lon' => $lon,
'elev' => $elev,
'datetime' => $datetime,
'zone' => $zone
]);
$apiUrl = API_URL . '?' . $params;
// Configuration de la requête cURL
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $apiUrl,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . API_TOKEN
]
]);
// Exécution de la requête
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
// Vérification des erreurs cURL
if ($curlError) {
throw new Exception("Erreur de connexion à l'API: " . $curlError);
}
// Gestion des codes de réponse HTTP
if ($httpCode === 401) {
throw new Exception("Token d'authentification invalide ou expiré");
} elseif ($httpCode === 403) {
throw new Exception("Accès non autorisé à l'API");
} elseif ($httpCode === 429) {
throw new Exception("Limite de requêtes dépassée - veuillez réessayer plus tard");
} elseif ($httpCode >= 400) {
throw new Exception("Erreur API: HTTP {$httpCode}");
}
// Vérification que la réponse est du JSON valide
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception("Réponse API invalide: " . json_last_error_msg());
}
// Ajout de métadonnées de proxy
if (is_array($data)) {
$data['proxy'] = [
'version' => '1.0',
'timestamp' => date('Y-m-d H:i:s'),
'processed_at' => $_SERVER['HTTP_HOST'] ?? 'localhost'
];
}
// Retour de la réponse
http_response_code($httpCode);
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
}
?>