diff --git a/interface.php b/interface.php index fb5c5c9..37f419a 100644 --- a/interface.php +++ b/interface.php @@ -4,6 +4,9 @@ ini_set("display_errors", "On"); include_once "globals.php"; +// feltöltési limit 10 percen belül +define("UPLOAD_LIMIT_10MIN", 10); + // könyvtárak define("ARTWORKS_DIR", "ARTWORKS"); define("INCOMING_DIR", ARTWORKS_DIR . DIRECTORY_SEPARATOR . "incoming"); @@ -15,6 +18,22 @@ function only_alpha_numeric($input){ return preg_replace("/[^a-zA-Z0-9_]+/", "", $input); } +// felhasználó IP címének meghatározása... nem is olyan triviális +// https://stackoverflow.com/a/2031935 +function get_client_ip(){ + foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key){ + if (array_key_exists($key, $_SERVER) === true){ + foreach (explode(',', $_SERVER[$key]) as $ip){ + $ip = trim($ip); // just to be safe + if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){ + return $ip; + } + } + } + } + return $_SERVER['REMOTE_ADDR']; +} + // csatlakozás az adatbázishoz function open_sql_connection() { @@ -30,17 +49,31 @@ function incoming_from_uid($uid) return INCOMING_DIR . DIRECTORY_SEPARATOR . $uid; } -// feltöltött fájl feldolgozása -// RET: -// -2: MIME-hiba -// -3: mérethiba -// pozitív: egyedi azonosító, a feltöltés sikerült +/* + * feltöltött fájl feldolgozása + * RET: + * -1: ismeretlen hiba + * -2: MIME-hiba + * -3: mérethiba + * -3: elérte a feltöltési limitet + * string: egyedi azonosító, a feltöltés sikerült + */ define("MIME_ERROR", -2); define("SIZE_ERROR", -3); +define("LIMIT_ERROR", -4); function process_uploaded_file($file_info) { + // feltöltési limit ellenőrzése + global $dbconn; + $ip = mysqli_real_escape_string($dbconn, get_client_ip()); // escape, biztos ami biztos + $query = "SELECT COUNT(No) FROM server_access WHERE Timestamp > TIMESTAMPADD(MINUTE, -10, CURRENT_TIMESTAMP) AND IP = '$ip';"; + $ret = (int)mysqli_query($dbconn, $query)->fetch_assoc()["COUNT(No)"]; + if ($ret === false || $ret >= UPLOAD_LIMIT_10MIN){ + return LIMIT_ERROR; + } + $ACCEPTED_MIME_TYPES = ["image/png", "image/jpeg"]; // elfogadott MIME-típusok $MINIMUM_SIZE_BY_DIM = 2000; // minimális oldalméret @@ -63,6 +96,14 @@ function process_uploaded_file($file_info) $incoming_filename = incoming_from_uid($tmp_uid); $ret = move_uploaded_file($tmp_filename, $incoming_filename); + // felhasználó IP címének eltárolása a feltöltési limit betartatásához + $query = "INSERT INTO server_access (IP, Image_FileName, Timestamp) VALUES('$ip', '$tmp_uid', CURRENT_TIMESTAMP);"; + $res = mysqli_query($dbconn, $query); + // ha valamiért sikertelen, hibával térünk vissza + if ($res !== true) { + return -1; + } + return $tmp_uid; } diff --git a/js/phw.js b/js/phw.js index 83edd45..a162290 100644 --- a/js/phw.js +++ b/js/phw.js @@ -126,6 +126,9 @@ function process_upload_response(resp) { case -3: alert("Mérethiba: a kép hosszabb oldalának legalább 2000 pixel szélesnek kell lennie!"); break; + case -4: + alert("Elérted a feltöltési limitet.\nKérlek próbáld újra később!"); + break; default: alert("Valami nem stimmel!\nHa ismételten nem sikerül, kérlek jelezd a hibát!"); break;