Raketenwilli: Variable aus PHP Session in MySQL suchen

Beitrag lesen

Was macht man, wenn ein User aus welchen Gründen auch immer ein oder mehrere Leerzeichen um seinen User-Namen hat?

Nö. Man stellt von Anfang an sinnvolle Regeln auf, was in einem Username erlaubt ist.

Generell (a.k.a: „oft“, „im Hinblick auf Interoperabilität“) ist es eine gute Idee, folgendes vorzuschreiben:

  • Mindestlänge: 3 Zeichen
  • Erlaubte Zeichen: ASCII-Buchstaben, Ziffern, "_"
  • Beginnt mit: Buchstabe
  • nur kleine Buchstaben (oft werden große und kleine nicht unterschieden - manchmal können das z.B. Datenbanken nicht)

Zudem würde ich diese Eingabe stets trimmen (Copy & Paste-Fehler), Groß/Klein-Schreibung stillschweigend durch Umwandlung sanieren, eventuell nicht erlaubte Zeichen durch Löschen „sanieren“ - macht man die beiden letzteren, dann muss man das aber künftig stets tun!

In PHP kann das so oder so ähnlich aussehen:

<?php

function saniticeUsername(
	$s,
	$returnSanitized = false,
	$minLength = 3,
	$toLower = true,
	$RegexAllowedChars = 'A-Za-z0-9_',
	$RegexAllowedFirstchar = 'A-Za-z'
) {

	#first: trim the input (blanks @start or end of a name are in most cases copy & paste-errors - or typos
	$s = trim( $s );

	# check the minlenght:

	if ( $minLength > strlen( $s ) ) {
		$out['err'] ='to short';
		$out['Username'] = false;
		$out['is_sanitized'] = false;
		return $out;
	}
	
	#sanitice to lower:
	if ( $toLower ) {
		$s = strtolower( $s );
	}
	
	# mask meta chars in regex:
	$SpecialChars = explode( ' ', '/ \ [ ^ ]' );
	foreach ( $SpecialChars as $char ) {
		$SpecialCharsReplacements[] = '\\' . $char;
	}
	$pattern = '/[^' . str_replace( $SpecialChars, $SpecialCharsReplacements, $RegexAllowedChars ) . ']/'; 
	
	# remove all not allowed chars
	$sanitized = preg_replace( $pattern, '', $s );
	
	if ( $minLength > strlen( $sanitized ) ) {
		$out['err'] = 'to short';
		$out['Username'] = false;
		$out['is_sanitized'] = false;
		return $out;
	}
	
	# check the first char and make returns:
	$firstChar = $s[0];
	$pattern = '/[' . str_replace( $SpecialChars, $SpecialCharsReplacements, $RegexAllowedFirstchar ) . ']/'; 
	
	if ( 1 !== preg_match( $pattern, $firstChar ) ) {
		$out['err'] ='first char not allowed';
		$out['Username'] = false;
		$out['is_sanitized'] = false;
		return $out;
	} 
	
	if ( $returnSanitized ) {
		if ( $s != $sanitized ) {
			$out['is_sanitized'] = true;
		} else {
			$out['is_sanitized'] = false;
		}
		$out['err'] = false;
		$out['Username'] = $sanitized;
		return $out;
	} else {
		if( $s !== $sanitized) {
			$out['err'] = 'not allowed chars in username';
			$out['Username'] = false;
			$out['is_sanitized'] = false;
			return $out;		
		} else {
			$out['err'] = false;
			$out['Username'] = $sanitized;
			$out['is_sanitized'] = false;		
			return $out;
		}
	}
}

################################## Tests: #############################
header('Content-Type: text/plain; charset=utf-8');

$userNames=[
'0joerg',
'Jörg',
'Joerg',
'<Joerg>',
' Jo',
' Jörg',
' Joerg',
' <Joerg>',
' Jo',
'Jörg ',
'Joerg ',
'<Joerg> ',
'Jo ',
' Jörg ',
' Joerg ',
' <Joerg> ',
' Jo ',
'0joerg',
' 0joerg',
'joerg$',
'joe@rg'
];

echo "Test: sanitized names allowed =============================\n";

foreach ( $userNames as $username ) {
	echo $username . ':'. PHP_EOL;
	var_dump( saniticeUsername( $username, true ) );
	echo PHP_EOL;  
}

echo "Test: sanitized names forbidden =============================\n";

foreach ( $userNames as $username ) {
	echo $username . ':'. PHP_EOL;
	var_dump( saniticeUsername( $username ) );
	echo PHP_EOL;  
}

echo "Test: $ + @ allowed =============================\n";
foreach ( $userNames as $username ) {
	echo $username . ':'. PHP_EOL;
	var_dump( saniticeUsername( $username, false, 3, true, 'A-Za-z0-9@$_' ) );
	echo PHP_EOL;  
}