28dfda953e18bd4be64501440f87f73ef5b07ae7
bernd input-filtering

bernd authored 17 years ago

1) <?php
Bernd Wurst Added license tags for CC0,...

Bernd Wurst authored 12 years ago

2) /*
3) This file belongs to the Webinterface of schokokeks.org Hosting
4) 
Bernd Wurst Copyright year update

Bernd Wurst authored 6 years ago

5) Written 2008-2018 by schokokeks.org Hosting, namely
Bernd Wurst Added license tags for CC0,...

Bernd Wurst authored 12 years ago

6)   Bernd Wurst <bernd@schokokeks.org>
7)   Hanno Böck <hanno@schokokeks.org>
8) 
9) To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
10) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

11) You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see
Bernd Wurst Added license tags for CC0,...

Bernd Wurst authored 12 years ago

12) http://creativecommons.org/publicdomain/zero/1.0/
13) 
14) Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
15) */
bernd input-filtering

bernd authored 17 years ago

16) 
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

17) require_once('inc/error.php');
Hanno Böck replace cracklib with zxcvbn

Hanno Böck authored 8 years ago

18) require_once('vendor/autoload.php');
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

19) 
bernd input-filtering

bernd authored 17 years ago

20) 
Hanno Böck Codingstyle PSR12 + array s...

Hanno Böck authored 3 years ago

21) function strong_password($password, $user = [])
bernd * Passwörter mit cracklib p...

bernd authored 17 years ago

22) {
Bernd Wurst support online check for pa...

Bernd Wurst authored 5 years ago

23)     $pwcheck = config('pwcheck');
24)     $result = null;
25)     if ($pwcheck) {
26)         DEBUG($pwcheck);
Bernd Wurst use POST for password checker

Bernd Wurst authored 5 years ago

27)         $req = curl_init($pwcheck);
Bernd Wurst support online check for pa...

Bernd Wurst authored 5 years ago

28)         curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
29)         curl_setopt($req, CURLOPT_SSL_VERIFYPEER, 1);
30)         curl_setopt($req, CURLOPT_SSL_VERIFYSTATUS, 1);
31)         curl_setopt($req, CURLOPT_CONNECTTIMEOUT, 5);
32)         curl_setopt($req, CURLOPT_TIMEOUT, 5);
33)         curl_setopt($req, CURLOPT_FOLLOWLOCATION, 0);
Bernd Wurst use POST for password checker

Bernd Wurst authored 5 years ago

34)         curl_setopt($req, CURLOPT_POST, 1);
Hanno Böck make sure POST data is sent...

Hanno Böck authored 3 years ago

35)         curl_setopt($req, CURLOPT_POSTFIELDS, "password=".urlencode($password));
Bernd Wurst support online check for pa...

Bernd Wurst authored 5 years ago

36)         $result = chop(curl_exec($req));
37)         DEBUG($result);
38)     }
39)     if ($result === 'good') {
40)         return true;
41)     } elseif ($result === 'bad') {
Bernd Wurst better error message for we...

Bernd Wurst authored 5 years ago

42)         return "Unsere Überprüfung hat ergeben, dass dieses Passwort in bisher veröffentlichten Passwortlisten enthalten ist. Es wird daher nicht akzeptiert.";
Bernd Wurst support online check for pa...

Bernd Wurst authored 5 years ago

43)     }
Bernd Wurst use Zxcvbn as fallback in e...

Bernd Wurst authored 5 years ago

44)     // Kein Online-Check eingerichtet oder der request war nicht erfolgreich
45)     DEBUG('using Zxcvbn for password check!');
46)     $passwordchecker = new ZxcvbnPhp\Zxcvbn();
Bernd Wurst PHP 8.0 compatibility

Bernd Wurst authored 4 years ago

47)     if ($user) {
48)         $strength = $passwordchecker->passwordStrength($password, $user);
49)     } else {
50)         $strength = $passwordchecker->passwordStrength($password);
51)     }
Bernd Wurst use Zxcvbn as fallback in e...

Bernd Wurst authored 5 years ago

52)     DEBUG('password strength: '.$strength['score']);
53)     if ($strength['score'] < 2) {
54)         return "Das Passwort ist zu einfach!";
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

55)     }
56)     return true;
bernd * Passwörter mit cracklib p...

bernd authored 17 years ago

57) }
58) 
59) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

60) function filter_input_general($input)
bernd input-filtering

bernd authored 17 years ago

61) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

62)     if ($input === null) {
63)         return null;
64)     }
Bernd Wurst accept integer parameters i...

Bernd Wurst authored 5 years ago

65)     $input = (string) $input;
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

66)     $filtered = preg_replace('/[\x00-\x09\x0b-\x0c\x0e-\x1f]/', '', $input);
67)     if ($filtered !== $input) {
68)         system_failure("Ihre Daten enthielten ungültige Zeichen!");
69)         logger(LOG_WARNING, 'inc/security', 'filter_input_general', 'Ungültige Daten!');
70)     }
71)     return $filtered;
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

72) }
73) 
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

74) function filter_input_oneline($input)
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

75) {
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

76)     if ($input === null) {
77)         return null;
78)     }
Bernd Wurst accept integer parameters i...

Bernd Wurst authored 5 years ago

79)     $input = (string) $input;
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

80)     $filtered = preg_replace('/[\x00-\x1f]/', '', $input);
81)     if ($filtered !== $input) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

82)         system_failure("Ihre Daten enthielten ungültige Zeichen!");
Bernd Wurst accept integer parameters i...

Bernd Wurst authored 5 years ago

83)         logger(LOG_WARNING, 'inc/security', 'filter_input_oneline', 'Ungültige Daten!');
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

84)     }
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

85)     return $filtered;
bernd input-filtering

bernd authored 17 years ago

86) }
87) 
88) 
Bernd Wurst New function filter_output_...

Bernd Wurst authored 5 years ago

89) function filter_output_html($data)
90) {
Bernd Wurst upgrade dependancies

Bernd Wurst authored 2 years ago

91)     if (! $data) {
92)         return "";
93)     }
Bernd Wurst New function filter_output_...

Bernd Wurst authored 5 years ago

94)     return htmlspecialchars($data, ENT_QUOTES);
95) }
96) 
97) 
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

98) function verify_input_ascii($data)
99) {
Bernd Wurst accept integer parameters i...

Bernd Wurst authored 5 years ago

100)     $data = (string) $data;
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

101)     $filtered = filter_var($data, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
102)     if ($filtered != $data) {
103)         logger(LOG_WARNING, 'inc/security', 'verify_input_ascii', 'Ungültige Daten: '.$data);
104)         system_failure("Ihre Eingabe enthielt ungültige Zeichen");
105)     }
106)     return $filtered;
107) }
108) 
109) 
110) function verify_input_identifier($data)
111) {
Bernd Wurst accept integer parameters i...

Bernd Wurst authored 5 years ago

112)     $data = (string) $data;
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

113)     if ($data === "") {
114)         system_failure("Leerer Bezeichner");
115)     }
116)     $filtered = preg_replace("/[^[:alnum:]\_\.\-]/", "", $data);
117)     if ($filtered !== $data) {
118)         logger(LOG_WARNING, 'inc/security', 'verify_input_identifier', 'Ungültige Daten: '.$data);
119)         system_failure("Ihre Daten enthielten ungültige Zeichen!");
120)     }
121)     return $filtered;
122) }
123) 
Bernd Wurst New function filter_output_...

Bernd Wurst authored 5 years ago

124) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

125) function filter_input_username($input)
bernd input-filtering

bernd authored 17 years ago

126) {
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

127)     $username = preg_replace("/[^[:alnum:]\_\.\+\-]/", "", $input);
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

128)     if ($username === "") {
129)         system_failure("Leerer Benutzername!");
130)     }
131)     return $username;
hanno Hatte die Kompatibilität ge...

hanno authored 17 years ago

132) }
133) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

134) function verify_input_username($input)
hanno Hatte die Kompatibilität ge...

hanno authored 17 years ago

135) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

136)     if (filter_input_username($input) != $input) {
137)         logger(LOG_WARNING, 'inc/security', 'verify_input_username', 'Ungültige Daten: '.$input);
138)         system_failure("Ihre Daten enthielten ungültige Zeichen!");
139)     }
bernd input-filtering

bernd authored 17 years ago

140) }
141) 
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

142) 
143) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

144) function filter_input_hostname($input, $wildcard=false)
bernd check auf hostname

bernd authored 17 years ago

145) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

146)     DEBUG('filter_input_hostname("'.$input.'", $wildcard='.$wildcard.')');
Hanno Spezialbehandlung für äöü n...

Hanno authored 6 years ago

147)     $input = strtolower($input);
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

148)     $input = trim($input, "\t\n\r\x00 .");
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

149)     if (preg_replace("/[^.]_/", "", $input) != $input) {
150)         system_failure("Der Unterstrich ist nur als erstes Zeichen eines Hostnames erlaubt.");
151)     }
Hanno Spezialbehandlung für äöü n...

Hanno authored 6 years ago

152)     if (preg_replace("/[^[:alnum:]_*\.\-]/u", "", $input) != $input) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

153)         system_failure("Ihre Daten enthielten ungültige Zeichen!");
154)     }
155)     if (preg_match("/^.+\*/", $input)) {
156)         system_failure("Ihre Daten enthielten ungültige Zeichen (Wildcard-Stern muss ganz vorne stehen)!");
157)     }
158)     if (! $wildcard && preg_replace("/^\*/", "", $input) != $input) {
159)         system_failure("Ihre Daten enthielten ungültige Zeichen (Keine Wildcards erlaubt)!");
160)     }
161)     if (strstr($input, '..')) {
162)         system_failure("Ungültiger Hostname");
163)     }
164)     return $input;
bernd check auf hostname

bernd authored 17 years ago

165) }
166) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

167) function verify_input_hostname($input, $wildcard=false)
bernd Add IP-address patterns

bernd authored 16 years ago

168) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

169)     if (filter_input_hostname($input, $wildcard) != $input) {
170)         logger(LOG_WARNING, 'inc/security', 'verify_input_hostname', 'Ungültige Daten: '.$input);
171)         system_failure("Ihre Daten enthielten ungültige Zeichen!");
172)     }
bernd Add IP-address patterns

bernd authored 16 years ago

173) }
174) 
175) 
Hanno Böck vhost-hostnamen vernünftig...

Hanno Böck authored 6 years ago

176) function verify_input_hostname_utf8($input)
177) {
178)     $puny = idn_to_ascii($input, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
179)     if ($puny === false) {
180)         system_failure("Ungültiger Hostname! idn ".$input);
181)     }
182)     $filter = filter_var($puny, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME);
Bernd Wurst Umstellung von filter_input...

Bernd Wurst authored 5 years ago

183)     if ($filter !== $puny) {
Hanno Böck vhost-hostnamen vernünftig...

Hanno Böck authored 6 years ago

184)         system_failure("Ungültiger Hostname! filter ".$input);
185)     }
186) }
187) 
188) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

189) function verify_input_ipv4($input)
bernd Add IP-address patterns

bernd authored 16 years ago

190) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

191)     if (! preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $input)) {
192)         system_failure('Keine IP-Adresse');
193)     }
bernd Add IP-address patterns

bernd authored 16 years ago

194) }
195) 
196) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

197) function verify_input_ipv6($input)
bernd Add IP-address patterns

bernd authored 16 years ago

198) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

199)     // ripped from Perl module Net-IPv6Addr v0.2
200)     if (! preg_match("/^(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}|[0-9a-f]{0,4}::|:(?::[a-f0-9]{1,4}){1,6}|(?:[a-f0-9]{1,4}:){1,6}:|(?:[a-f0-9]{1,4}:)(?::[a-f0-9]{1,4}){1,6}|(?:[a-f0-9]{1,4}:){2}(?::[a-f0-9]{1,4}){1,5}|(?:[a-f0-9]{1,4}:){3}(?::[a-f0-9]{1,4}){1,4}|(?:[a-f0-9]{1,4}:){4}(?::[a-f0-9]{1,4}){1,3}|(?:[a-f0-9]{1,4}:){5}(?::[a-f0-9]{1,4}){1,2}|(?:[a-f0-9]{1,4}:){6}(?::[a-f0-9]{1,4}))$/i", $input)) {
201)         system_failure("Ungültige IPv6-Adresse");
202)     }
bernd Add IP-address patterns

bernd authored 16 years ago

203) }
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

204) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

205) function verify_input_recorddata($input)
Hanno Böck Prüfe DNS-Records auf probl...

Hanno Böck authored 7 years ago

206) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

207)     if (strstr($input, "\\") || strstr($input, '"')) {
208)         system_failure("Ungültige Zeichen");
209)     }
Hanno Böck Prüfe DNS-Records auf probl...

Hanno Böck authored 7 years ago

210) }
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

211) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

212) function filter_quotes($input)
bernd Im Passwort dürfen auch kei...

bernd authored 17 years ago

213) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

214)     return preg_replace('/["\'`]/', '', $input);
bernd Im Passwort dürfen auch kei...

bernd authored 17 years ago

215) }
216) 
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

217) 
218) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

219) function filter_shell($input)
bernd Diverse shell-kritische zei...

bernd authored 17 years ago

220) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

221)     return preg_replace('/[^-[:alnum:]\_\.\+ßäöüÄÖÜ/%§=]/', '', $input);
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

222) }
223) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

224) function verify_shell($input)
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

225) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

226)     if (filter_shell($input) != $input) {
227)         system_failure("Ihre Daten enthielten ungültige Zeichen!");
228)     }
bernd Diverse shell-kritische zei...

bernd authored 17 years ago

229) }
bernd input-filtering

bernd authored 17 years ago

230) 
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

231) 
Hanno Böck validiere SSH-Keys korrekt

Hanno Böck authored 7 years ago

232) function filter_ssh_key($key)
233) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

234)     $keyparts = explode(" ", trim($key));
Hanno Böck validiere SSH-Keys korrekt

Hanno Böck authored 7 years ago

235) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

236)     if ((count($keyparts) > 3) || (count($keyparts) < 2)) {
237)         system_failure("Ungültiger SSH-Key!");
238)     }
Hanno Böck validiere SSH-Keys korrekt

Hanno Böck authored 7 years ago

239) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

240)     if (preg_match("/^[a-z0-9]+-[a-z0-9-]+$/", $keyparts[0]) === 0) {
241)         system_failure("Ungültiger SSH-Key!");
242)     }
Hanno Böck validiere SSH-Keys korrekt

Hanno Böck authored 7 years ago

243) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

244)     if (base64_decode($keyparts[1], 1) == false) {
245)         system_failure("Ungültiger SSH-Key!");
246)     }
Hanno Böck validiere SSH-Keys korrekt

Hanno Böck authored 7 years ago

247) 
Hanno Böck fix regular expression (was...

Hanno Böck authored 4 years ago

248)     if ((count($keyparts) === 3) && (preg_match("/^[a-zA-Z0-9@._-]+$/", $keyparts[2]) === 0)) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

249)         system_failure("Ungültige Zeichen im Kommentar des SSH-Keys!");
250)     }
Hanno Böck validiere SSH-Keys korrekt

Hanno Böck authored 7 years ago

251) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

252)     if (count($keyparts) === 2) {
253)         return $keyparts[0]." ".$keyparts[1];
254)     } else {
255)         return $keyparts[0]." ".$keyparts[1]." ".$keyparts[2];
256)     }
Hanno Böck validiere SSH-Keys korrekt

Hanno Böck authored 7 years ago

257) }
258) 
bernd Umfangreiche Code-Aufräumar...

bernd authored 17 years ago

259) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

260) function check_path($input)
bernd XSS/CSRF-Bugs behoben

bernd authored 17 years ago

261) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

262)     DEBUG("checking {$input} for valid path name");
Bernd Wurst New function filter_output_...

Bernd Wurst authored 5 years ago

263)     if ($input != filter_output_html($input)) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

264)         logger(LOG_WARNING, 'inc/security', 'check_path', 'HTML-Krams im Pfad: '.$input);
265)         DEBUG("HTML-Krams im Pfad");
266)         return false;
267)     }
268)     $components = explode("/", $input);
269)     foreach ($components as $item) {
270)         if ($item == '..') {
271)             logger(LOG_WARNING, 'inc/security', 'check_path', '»..« im Pfad: '.$input);
272)             DEBUG("»..« im Pfad");
273)             return false;
274)         }
Hanno prevent breaking kvhostcrea...

Hanno authored 6 years ago

275)         if (strlen($item) > 255) {
276)             return false;
277)         }
278)     }
279)     if (strlen($input) > 2048) {
280)         return false;
bernd XSS/CSRF-Bugs behoben

bernd authored 17 years ago

281)     }
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

282)     return (preg_match('/^[ A-Za-z0-9.@\/_-]*$/', $input) == 1);
bernd XSS/CSRF-Bugs behoben

bernd authored 17 years ago

283) }
284) 
285) 
bernd * alle internen Links sinnv...

bernd authored 15 years ago

286) function in_homedir($path)
287) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

288)     DEBUG("Prüfe »{$path}«");
289)     if (! check_path($path)) {
290)         DEBUG('Kein Pfad');
291)         return false;
292)     }
293)     if (! isset($_SESSION['userinfo']['homedir'])) {
294)         DEBUG("Kann homedir nicht ermitteln");
295)         return false;
296)     }
Bernd Wurst Syntaxfehler

Bernd Wurst authored 6 years ago

297)     return strncmp($_SESSION['userinfo']['homedir'], $path, strlen($_SESSION['userinfo']['homedir'])) == 0;
bernd * alle internen Links sinnv...

bernd authored 15 years ago

298) }
299) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

300) function check_date($input)
Bernd Wurst Erste Version des SEPA-Mand...

Bernd Wurst authored 11 years ago

301) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

302)     return (bool) preg_match("/[0-9]{4}-(0?[1-9]|10|11|12)-([012]?[0-9]|30|31)/", $input);
Bernd Wurst Erste Version des SEPA-Mand...

Bernd Wurst authored 11 years ago

303) }
304) 
bernd * alle internen Links sinnv...

bernd authored 15 years ago

305) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

306) function check_emailaddr($input)
bernd Neues Modul für "Kunde werden"

bernd authored 17 years ago

307) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

308)     return (bool) filter_var($input, FILTER_VALIDATE_EMAIL) == $input;
bernd don't be too complicated. /...

bernd authored 16 years ago

309) }
310) 
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

311) function check_domain($input)
bernd don't be too complicated. /...

bernd authored 16 years ago

312) {
Hanno Fix coding style with php-c...

Hanno authored 6 years ago

313)     return (bool) preg_match("/^[a-z0-9\.\-]+\.[a-z\-]{2,63}$/i", $input);
bernd Neues Modul für "Kunde werden"

bernd authored 17 years ago

314) }