XSS/CSRF-Bugs behoben
bernd

bernd commited on 2007-07-30 17:15:58
Zeige 4 geänderte Dateien mit 47 Einfügungen und 28 Löschungen.


git-svn-id: https://svn.schokokeks.org/repos/tools/webinterface/trunk@574 87cf0b9e-d624-0410-a070-f6ee81989793
... ...
@@ -1,11 +1,13 @@
1 1
 <?php
2 2
 
3
+require_once("inc/security.php");
4
+
3 5
 function system_failure($reason)
4 6
 {
5 7
         include('inc/top.php');
6 8
         echo '<div class="error">
7 9
         <h3>Fehler</h3>
8
-        <p>Es ist ein Fehler aufgetreten: '.$reason.'</p>
10
+        <p>Es ist ein Fehler aufgetreten: '.filter_input_general($reason).'</p>
9 11
         </div>';
10 12
         include('inc/bottom.php');
11 13
         die();
... ...
@@ -51,7 +53,7 @@ function show_messages()
51 53
     ';
52 54
     foreach ($input_error as $error)
53 55
     {
54
-      echo '<li>'.$error."</li>\n";
56
+      echo '<li>'.filter_input_general($error)."</li>\n";
55 57
     }
56 58
     echo '</ul>
57 59
     </div>';
... ...
@@ -63,7 +65,7 @@ function show_messages()
63 65
     ';
64 66
     foreach ($warning as $msg)
65 67
     {
66
-      echo '<li>'.$msg."</li>\n";
68
+      echo '<li>'.filter_input_general($msg)."</li>\n";
67 69
     }
68 70
     echo '</ul>
69 71
     </div>';
... ...
@@ -75,7 +77,7 @@ function show_messages()
75 77
     ';
76 78
     foreach ($success_msg as $msg)
77 79
     {
78
-      echo '<li>'.$msg."</li>\n";
80
+      echo '<li>'.filter_input_general($msg)."</li>\n";
79 81
     }
80 82
     echo '</ul>
81 83
     </div>';
... ...
@@ -50,6 +50,23 @@ function filter_shell( $input )
50 50
         return ereg_replace('[^-[:alnum:]\_\.\+ßäöüÄÖÜ/%§=]', '', $input );
51 51
 }
52 52
 
53
+function check_path( $input )
54
+{
55
+  if ($input != filter_input_general($input))
56
+    return False;
57
+  DEBUG("checking {$input} for valid path name");
58
+  $components = explode("/", $input);
59
+  foreach ($components AS $item)
60
+  {
61
+    if ($item == '..')
62
+    {
63
+      return False;
64
+    }
65
+  }
66
+  return (preg_match('/^[a-z0-9.\/_-]*$/',$input) == 1);
67
+}
68
+
69
+
53 70
 function check_emailaddr( $input )
54 71
 {
55 72
         return (preg_match("/^[a-z]+[a-z0-9]*[\.|\-|_]?[a-z0-9]+@([a-z0-9]*[\.|\-]?[a-z0-9]+){1,4}\.[a-z]{2,4}$/i", $input ) == 1);
... ...
@@ -73,24 +73,24 @@ if (isset($_GET['action']) && $_GET['action'] == 'save')
73 73
 }
74 74
 elseif (isset($_GET['action']) && $_GET['action'] == 'create')
75 75
 {
76
+  $options = '';
77
+  $domains = get_domain_list($user['customerno'], $user['uid']);
78
+  if (count($domains) > 0)
79
+    $options .= '<option>----------------------------</option>';
80
+  foreach ($domains as $dom)
81
+    $options .= '<option value="'.$dom->fqdn.'">'.$dom->fqdn.'</option>';
82
+
76 83
   output('<h3>E-Mail-Account anlegen</h3>
77 84
 <p>Hier k&ouml;nnen Sie ein neues POP3/IMAP-Konto anlegen.</p>
78
-  <form action="accounts.php?action=save&'.$param.'" method="post">
79
-  '.generate_form_token('imap_accounts_create').'
85
+  '.html_form('imap_accounts_create', 'accounts.php', 'action=save', '
80 86
   <table style="margin-bottom: 1em;">
81 87
   <tr><th>Einstellung:</th><th>Wert:</th><th>&nbsp;</th></tr>
82 88
   <tr>
83 89
     <td>Benutzername:</td>
84 90
     <td><input type="text" id="user" name="user" />@<select name="domain" size="1">
85 91
     <option value="schokokeks.org">schokokeks.org</option>
86
-    ');
87
-    $domains = get_domain_list($user['customerno'], $user['uid']);
88
-    if (count($domains) > 0)
89
-      output('<option>----------------------------</option>');
90
-    foreach ($domains as $dom)
91
-      output('<option value="'.$dom->fqdn.'">'.$dom->fqdn.'</option>');
92
-    output('</select></td>
93
-
92
+  '.$options.'
93
+    </select></td>
94 94
   </tr>
95 95
   <tr>
96 96
     <td>Mailbox:</td>
... ...
@@ -106,8 +106,7 @@ elseif (isset($_GET['action']) && $_GET['action'] == 'create')
106 106
   </tr>
107 107
   </table>
108 108
   <p><input type="submit" name="create" value="Anlegen" /><br />
109
-  </form>
110
-  ');
109
+  '));
111 110
 }
112 111
 elseif (isset($_GET['action']) && $_GET['action'] == 'delete' && $_GET['account'] != '')
113 112
 {
... ...
@@ -127,14 +126,13 @@ elseif (isset($_GET['action']) && $_GET['action'] == 'delete' && $_GET['account'
127 126
     $_GET['account'] = (int) $_GET['account'];
128 127
     $account = get_mailaccount($_GET['account']);
129 128
     $enabled = ($account['enabled'] ? 'Ja' : 'Nein');
130
-    output('<form action="accounts.php?action=delete&amp;account='.$_GET['account'].'&amp;'.$param.'" method="post">
131
-    '.generate_form_token('imap_accounts_delete').'
132
-    <table style="margin-bottom: 1em;">
129
+    output(html_form('imap_accounts_delete', "accounts.php", "action=delete&account=".$_GET['account'], 
130
+    '<table style="margin-bottom: 1em;">
133 131
     <tr><td>Benutzername:</td>
134
-      <td>'.$account['account'].'</td>
132
+      <td>'.filter_input_general($account['account']).'</td>
135 133
     </tr>
136 134
     <tr><td>Mailbox:</td>
137
-      <td>'.$account['mailbox'].'</td>
135
+      <td>'.filter_input_general($account['mailbox']).'</td>
138 136
     </tr>
139 137
     <tr><td>Konto aktiv:</td>
140 138
       <td>'.$enabled.'</td>
... ...
@@ -143,8 +141,7 @@ elseif (isset($_GET['action']) && $_GET['action'] == 'delete' && $_GET['account'
143 141
   <p><input type="hidden" name="confirm" value="yes" />
144 142
     <input type="submit" value="Wirklich l&ouml;schen" />
145 143
   </p>
146
-  </form>
147
-  ');
144
+  '));
148 145
   }
149 146
 }
150 147
 elseif (isset($_GET['edit']))
... ...
@@ -3,6 +3,7 @@
3 3
 require_once('inc/debug.php');
4 4
 require_once('inc/db_connect.php');
5 5
 require_once('inc/base.php');
6
+require_once('inc/security.php');
6 7
 
7 8
 require_once('class/domain.php');
8 9
 
... ...
@@ -133,17 +134,19 @@ function check_valid($acc)
133 134
   if ($acc['mailbox'] != '')
134 135
   {
135 136
     if (substr($acc['mailbox'], 0, strlen($user['homedir'])+1) != $user['homedir'].'/')
136
-      return "Die Mailbox muss innerhalb des Home-Verzeichnisses liegen. Sie haben \"".$acc['mailbox']."\" als Mailbox angegeben, Ihre Home-Verzeichnis ist \"".$user['homedir']."/\".";
137
-    if (strstr($acc['mailbox'], '..') or ! preg_match('/^[a-z0-9.\/_-]*$/', $acc['mailbox']))
137
+      return "Die Mailbox muss innerhalb des Home-Verzeichnisses liegen. Sie haben »".$acc['mailbox']."« als Mailbox angegeben, Ihr Home-Verzeichnis ist »".$user['homedir']."/«.";
138
+    if (! check_path($acc['mailbox']))
138 139
       return "Sie verwenden ungültige Zeichen in Ihrem Mailbox-Pfad.";
139 140
   }
140 141
 
141 142
   if ($acc['account'] == '' || strpos($acc['account'], '@') == 0)
142 143
     return "Es wurde kein Benutzername angegeben!";
143 144
   if (strpos($acc['account'], '@') === false)
144
-    return "Es wurde kein Domain-Teil im Account-Name angegeben. Account-Namen m&uuml;ssen einen Domain-Teil enthalten. Im Zweifel versuchen Sie &quot;@schokokeks.org&quot;.";
145
+    return "Es wurde kein Domain-Teil im Account-Name angegeben. Account-Namen müssen einen Domain-Teil enthalten. Im Zweifel versuchen Sie »@schokokeks.org«.";
145 146
 
146 147
   list($local, $domain) = explode('@', $acc['account'], 2);
148
+  if ($local != filter_input_username($local))
149
+    return "Sie haben ungültige Zeichen im Accountname benutzt!";
147 150
   $tmpdomains = get_domain_list($user['customerno'], $user['uid']);
148 151
   $domains = array();
149 152
   foreach ($tmpdomains as $dom)
... ...
@@ -155,11 +158,11 @@ function check_valid($acc)
155 158
     {
156 159
       if (substr($local, 0, strlen($user['username'])) != $user['username'] || ($acc['account'][strlen($user['username'])] != '-' && $acc['account'][strlen($user['username'])] != '@'))
157 160
       {
158
-        return "Sie haben &quot;@schokokeks.org&quot; als Domain-Teil angegeben, aber der Benutzer-Teil beginnt nicht mit Ihrem Benutzername!";
161
+        return "Sie haben »@schokokeks.org« als Domain-Teil angegeben, aber der Benutzer-Teil beginnt nicht mit Ihrem Benutzername!";
159 162
       }
160 163
     }
161 164
     else
162
-      return "Der angegebene Domain-Teil (".htmlentities($domain, ENT_QUOTES, "UTF-8").") ist nicht f&uuml;r Ihren Account eingetragen. Sollte dies ein Fehler sein, wenden sie sich bitte an einen Administrator!";
165
+      return "Der angegebene Domain-Teil (»".htmlentities($domain, ENT_QUOTES, "UTF-8")."«) ist nicht für Ihren Account eingetragen. Sollte dies ein Fehler sein, wenden sie sich bitte an einen Administrator!";
163 166
   }
164 167
 
165 168
   return '';
166 169