Sicherheit: Variablen überprüfen (so richtig?)

supersalzi

Erfahrenes Mitglied
Hey,

jetzt reißt mir nicht den Kopf ab, weil ich mich erst jetzt dem Thema annehme:)

Ich habe mich belesen und nun drei Funktionen geschrieben, mit denen ich all meine übergebenen Variablen prüfen will.

Aber ich habe Angst irgend etwas übersehen zu haben. Also frage ich euch: ist das so Sicher?

PHP:
<?php
// für MySQL
function cleanPara_sql($param) { 
	$param = stripslashes($param);
	$param = mysql_real_escape_string($param, $sql_connection );
	return $param;
}

// für integer Werte (zahlen)
function cleanPara_int($param) {
	return (NULL === $param ? "NULL" : intVal ($param));
}

// für gemischte Zeichenketten
function cleanPara_varchar($param) {
	$param = strip_tags($param);
	
	if(!empty($param)){
		if(preg_match('/^[a-zA-Z0-9\-_]+$/', $param)){
			$varchar = $param;
		}else{
			$varchar = "FaslchesZeichen";
		}
	}
	return $varchar;
}

edit:
Vor allem bin ich mir mit dem Regulären Ausdruck unsicher (ist mein erster).
 
Zuletzt bearbeitet:
Validiere lieber die Eingaben statt sie nur zu filtern, etwa:
PHP:
function validate_int( $var )
{
	return is_numeric($var) && $var == (int) $var;
}
function validate_intabs( $var )
{
	return is_numeric($var) && $var == (int) abs($var);
}
function validate_real( $var )
{
	return is_numeric($var) && $var == (real) $var;
}

// …

if( validate_int($_GET['foobar']) ) {
	$errors[] = 'Der eingegebene Wert ist keine Ganzzahl!';
}
Die Validierung könntest du schließlich automatisieren, so dass nur noch Name und erwarteter Datentyp anzugeben sind, etwa:
PHP:
// Fehlermeldungen
$errormsg = array(
	'missing' => 'Für "%s" ist kein Wert eingegeben.',
	'int'     => 'Der für "%s" eingegebene Wert ist keine Ganzzahl!',
	'intabs'  => 'Der für "%s" eingegebene Wert ist keine positive Ganzzahl!',
	// …
);

// erwartete Werte
$validate = array(
	'_GET' => array(
		'foobar' => array('Foobar-Formularelement', 'int'),
		// …
	),
);

// automatische Validierung der erwarteten Werte
foreach( $validate as $method => $array ) {
	foreach( $array as $key => $val ) {
		if( !isset($GLOBALS[$method][$key]) || $GLOBALS[$method][$key] == '' ) {
			$errors[] = sprintf($errormsg['missing'], $val[0]);
		} else {
			$func = 'validate_'.$val[1];
			if( $func($GLOBALS[$method][$key]) ) {
				$errors[] = sprintf($errormsg[$val[1]], $val[0]);
			}
		}
	}
}

if( !empty($errors) ) {
	echo '<div class="note error"><p>Bei der Verarbeitung sind Fehler aufgetreten:</p>';
	echo '<ul><li>'.implode('</li><li>', $errors).'</li></ul></div>';
} else {
	// Verarbeitung fortsetzen
}
 
Danke Gumbo!

ich habe versucht deinen Rat umzusetzen...

wo kann man den etwas zu (int) und (real) nachlesen, mir ist das nicht ganz klar.

es sieht jetzt so aus:

PHP:
<?php
// für MySQL
function cleanPara_sql($param) { 
	$param = stripslashes($param);
	$param = mysql_real_escape_string($param ); // 2. argumet , $sql_connection
	if($param == (real) $param){
		return $param;
	}else{
		return "NULL";
	}
}

// für integer Werte (zahlen)
function cleanPara_int($param) {
	if(is_numeric($param) && $param == (int)$param ){
		return abs($param);
	}else{
	return "NULL";
	}
}

// für gemischte Zeichenketten
function cleanPara_varchar($param) {
	$param = strip_tags($param);
	
	if(!empty($param)){
		if(preg_match('@^[a-zA-Z0-9\-_]+$@', $param) or $param === intval($param)){
			return $param;
		}else{
			return "NULL";
		}
	}
}

besser?

nachtrag:

Eigentlich könnte ich doch die dritte Funktion cleanPara_varchar weglassen, denn cleanPara_sql eliminiert doch alles gefährliche, oder?
 
Zuletzt bearbeitet:
Am besten wendest du eine Kombination aus Validierung, Filterung und Maskierung an.
 
(int) steht für den Datentyp Ganzzahlen und (real) für Fließkommazahlen also kannst du das nicht für die Validierung von Mysql-Statements benutzen :)
 
Zurück