From 9f6c7cfbfab6eee4d58dd4f8939e50c16c0ea478 Mon Sep 17 00:00:00 2001 From: Pinga <121483313+getpinga@users.noreply.github.com> Date: Fri, 11 Aug 2023 01:12:24 +0300 Subject: [PATCH] DAS server validation improvements --- das/das.php | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/das/das.php b/das/das.php index c2b3bec..57d2712 100644 --- a/das/das.php +++ b/das/das.php @@ -21,6 +21,15 @@ $server->on('connect', function ($server, $fd) { // Register a callback to handle incoming requests $server->on('receive', function ($server, $fd, $reactorId, $data) { + // Connect to the database + try { + $pdo = new PDO('mysql:host=localhost;dbname=registry', 'registry-select', 'EPPRegistrySELECT'); + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + } catch (PDOException $e) { + $server->send($fd, "Error connecting to database"); + $server->close($fd); + } + // Validate and sanitize the domain name $domain = trim($data); if (!$domain) { @@ -32,26 +41,43 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) { $server->close($fd); } $domain = strtoupper($domain); - if (preg_match("/[^A-Z0-9\.\-]/", $domain)) { - $server->send($fd, "domain name invalid format"); - $server->close($fd); - } if (preg_match("/(^-|^\.|-\.|\.-|--|\.\.|-$|\.$)/", $domain)) { $server->send($fd, "domain name invalid format"); $server->close($fd); } - if (!preg_match("/^[A-Z0-9-]+\.(XX|COM\.XX|ORG\.XX|INFO\.XX|PRO\.XX)$/", $domain)) { - $server->send($fd, "please search only XX domains at least 2 letters"); + + // Extract TLD from the domain and prepend a dot + $tld = "." . end(explode('.', $domain)); + + // Check if the TLD exists in the domain_tld table + $stmtTLD = $pdo->prepare("SELECT COUNT(*) FROM domain_tld WHERE tld = :tld"); + $stmtTLD->bindParam(':tld', $tld, PDO::PARAM_STR); + $stmtTLD->execute(); + $tldExists = $stmtTLD->fetchColumn(); + + if (!$tldExists) { + $server->send($fd, "Invalid TLD. Please search only allowed TLDs"); $server->close($fd); + return; // Return to avoid further processing } - // Connect to the database - try { - $pdo = new PDO('mysql:host=localhost;dbname=registry', 'registry-select', 'EPPRegistrySELECT'); - $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - } catch (PDOException $e) { - $server->send($fd, "Error connecting to database"); + // Fetch the IDN regex for the given TLD + $stmtRegex = $pdo->prepare("SELECT idn_table FROM domain_tld WHERE tld = :tld"); + $stmtRegex->bindParam(':tld', $tld, PDO::PARAM_STR); + $stmtRegex->execute(); + $idnRegex = $stmtRegex->fetchColumn(); + + if (!$idnRegex) { + $server->send($fd, "Failed to fetch domain IDN table"); $server->close($fd); + return; // Return to avoid further processing + } + + // Check for invalid characters using fetched regex + if (!preg_match($idnRegex, $domain)) { + $server->send($fd, "Domain name invalid format"); + $server->close($fd); + return; // Return to avoid further processing } // Perform the DAS lookup