Browse code

hardening domain input (II)

Bernd Wurst authored on06/02/2018 17:55:49
Showing5 changed files
... ...
@@ -35,21 +35,13 @@ output(html_form('adddomain_search', '', '', $form));
35 35
 
36 36
 if (isset($_REQUEST['domain'])) {
37 37
     $request = idn_to_utf8($_REQUEST['domain'], 0, INTL_IDNA_VARIANT_UTS46);
38
-    verify_input_general($request);
39
-    $punycode = idn_to_ascii($request, 0, INTL_IDNA_VARIANT_UTS46);
40
-    if (!check_domain($punycode)) {
41
-        warning("Ungültige Zeichen im Domainnamen!");
42
-        redirect('');
43
-    }
44 38
     if (substr($request, 0, 4) == 'www.') {
45 39
         $request = str_replace('www.', '', $request);
46 40
     }
47
-    if (strpos($request, ' ') !== false) {
48
-        warning('Leerzeichen sind in Domainnamen nicht erlaubt.');
49
-        redirect('');
50
-    }
51
-    if (strpos($request, '.') === false) {
52
-        warning('Das ist kein Domainname.');
41
+    verify_input_general($request);
42
+    $punycode = idn_to_ascii($request, 0, INTL_IDNA_VARIANT_UTS46);
43
+    if (!check_domain($punycode)) {
44
+        warning("Ungültiger Domainname: ".filter_input_general($request));
53 45
         redirect('');
54 46
     }
55 47
     $dom = new Domain();
... ...
@@ -27,15 +27,30 @@ require_once('contacts.php');
27 27
 
28 28
 $dom = NULL;
29 29
 if (isset($_REQUEST['domain'])) {
30
-    $domain = $_REQUEST['domain'];
31
-    if (strpos($domain, ' ') !== false) {
32
-        system_failure('Leerzeichen sind in Domainnamen nicht erlaubt.');
30
+    $request = idn_to_utf8($_REQUEST['domain'], 0, INTL_IDNA_VARIANT_UTS46);
31
+    if (substr($request, 0, 4) == 'www.') {
32
+        $request = str_replace('www.', '', $request);
33
+    }
34
+    verify_input_general($request);
35
+    $punycode = idn_to_ascii($request, 0, INTL_IDNA_VARIANT_UTS46);
36
+    if (!check_domain($punycode)) {
37
+        warning("Ungültiger Domainname: ".filter_input_general($request));
38
+        redirect('');
39
+    }
40
+    $dom = new Domain();
41
+    if ($dom->loadByName($request) !== false) {
42
+        if ($dom->is_customerdomain()) {
43
+            warning('Diese Domain ist bereits in Ihrem Kundenkonto eingetragen!');
44
+        } else {
45
+            warning('Diese Domain ist bei einem anderen Kunden von uns in Nutzung. Kontaktieren Sie den Support, wenn Sie eine Domain in ein anderes Kundenkonto übertragen möchten.');
46
+        }
47
+        redirect('');
33 48
     }
34 49
     $dom = new Domain();
35
-    if ($dom->loadByName($domain) === false) {
50
+    if ($dom->loadByName($request) === false) {
36 51
         // Eintragen mit DNS und Mail
37
-        $id = insert_domain_external($domain, true, true);
38
-        $dom->loadByName($domain);
52
+        $id = insert_domain_external($request, true, true);
53
+        $dom->loadByName($request);
39 54
     } 
40 55
     $dom->ensure_customerdomain();
41 56
     if ($dom->provider == 'terions') {
... ...
@@ -47,7 +62,7 @@ if (isset($_REQUEST['domain'])) {
47 62
 
48 63
     $_SESSION['domains_domainreg_owner'] = $dom->owner;
49 64
     $_SESSION['domains_domainreg_admin_c'] = $dom->admin_c;
50
-    $_SESSION['domains_domainreg_domainname'] = $domain;
65
+    $_SESSION['domains_domainreg_domainname'] = $request;
51 66
     $_SESSION['domains_domainreg_detach'] = 0;
52 67
     
53 68
 } elseif (isset($_SESSION['domains_domainreg_domainname'])) {
... ...
@@ -141,7 +156,8 @@ if ($pricedata['setup']) {
141 156
     $form .= '<tr><td>Setup-Gebühr (einmalig):</td><td style="text-align: right;">'.$pricedata['setup'].' €</td></tr>';
142 157
 }
143 158
 $form .='</table>';
144
-$form .= '<p>Der Domain-Vertrag beginnt mit Zuteilung der Domain durch die Regisrierungsstelle und läuft jeweils ein Jahr. Er verlängert sich stets automatisch um ein weiteres Jahr, wenn nicht bis 14 Tage vor Ende der Laufzeit eine Kündigung vorliegt.</p>';
159
+$form .= '<p>Mit dieser Bestellung geben Sie eine verbindliche Willenserklärung ab, diese Domain registrieren zu wollen. Sie treten in ein Vertragsverhältnis zu '.config('company_name').' unter dem Vorbehalt, dass die Domain registriert werden kann. Die Hoheit über die Vergabe der Domains hat die jeweils zuständige Registrierungsstelle. Es gelten die Vergabe-Bedingungen der jeweils zuständigen Registrierungsstelle.</p>
160
+<p>Der Domain-Vertrag beginnt mit Zuteilung der Domain durch die Regisrierungsstelle und läuft jeweils '.$pricedata['interval'].' Monate. Er verlängert sich stets automatisch um weitere '.$pricedata['interval'].' Monate, wenn nicht bis 14 Tage vor Ende der Laufzeit eine Kündigung vorliegt.</p>';
145 161
 
146 162
 $form .= '<p><input type="hidden" name="domain" value="'.filter_input_general($dom->fqdn).'">
147 163
 <input type="submit" name="submit" value="Kostenpflichtigen Vertrag abschließen"></p>';
... ...
@@ -30,7 +30,7 @@ if (! (isset($_REQUEST['domain']) && $_REQUEST['domain']) ||
30 30
     $_REQUEST['domain'] != $_SESSION['domains_domainreg_domainname']) {
31 31
     system_failure("Fehler im Programmablauf!");
32 32
 }
33
-
33
+// Validierung der Domain entfällt hier, weil wir nur bestehende Domain aus der Datenbank laden. Bei ungültiger Eingabe wird kein Treffer gefunden.
34 34
 $dom = new Domain((string) $_REQUEST['domain']);
35 35
 $dom->ensure_userdomain();
36 36
 
... ...
@@ -239,9 +239,9 @@ function get_domain_offer($tld)
239 239
 
240 240
   $data = array("tld" => $tld);
241 241
 
242
-  $result = db_query("SELECT tld, gebuehr, setup FROM misc.domainpreise_kunde WHERE kunde=:cid AND tld=:tld AND ruecksprache='N'", array(":cid" => $cid, ":tld" => $tld));
242
+  $result = db_query("SELECT tld, gebuehr, `interval`, setup FROM misc.domainpreise_kunde WHERE kunde=:cid AND tld=:tld AND ruecksprache='N'", array(":cid" => $cid, ":tld" => $tld));
243 243
   if ($result->rowCount() != 1) {
244
-    $result = db_query("SELECT tld, gebuehr, setup FROM misc.domainpreise WHERE tld=:tld AND ruecksprache='N'", array(":tld" => $tld));
244
+    $result = db_query("SELECT tld, gebuehr, `interval`, setup FROM misc.domainpreise WHERE tld=:tld AND ruecksprache='N'", array(":tld" => $tld));
245 245
   }
246 246
   if ($result->rowCount() != 1) {
247 247
     warning('Die Endung »'.$tld.'« steht zur automatischen Eintragung nicht zur Verfügung.');
... ...
@@ -249,6 +249,7 @@ function get_domain_offer($tld)
249 249
   }
250 250
   $temp = $result->fetch();
251 251
   $data["gebuehr"] = $temp["gebuehr"];
252
+  $data["interval"] = $temp["interval"];
252 253
   $data["setup"] = ($temp["setup"] ? $temp["setup"] : 0.0);
253 254
   
254 255
   return $data;
... ...
@@ -26,8 +26,18 @@ $section='domains_domains';
26 26
 if (!isset($_REQUEST['domain'])) {
27 27
     system_failure('Kein Domainname übergeben');
28 28
 }
29
+$request = idn_to_utf8($_REQUEST['domain'], 0, INTL_IDNA_VARIANT_UTS46);
30
+if (substr($request, 0, 4) == 'www.') {
31
+    $request = str_replace('www.', '', $request);
32
+}
33
+verify_input_general($request);
34
+$punycode = idn_to_ascii($request, 0, INTL_IDNA_VARIANT_UTS46);
35
+if (!check_domain($punycode)) {
36
+    warning("Ungültiger Domainname: ".filter_input_general($request));
37
+    redirect('');
38
+}
29 39
 
30
-$id = insert_domain_external($_REQUEST['domain'], ($_REQUEST['dns'] === 'enable'), ($_REQUEST['email'] === 'enable'));
40
+$id = insert_domain_external($request, ($_REQUEST['dns'] === 'enable'), ($_REQUEST['email'] === 'enable'));
31 41
 
32 42
 redirect('detail?id='.$id);
33 43