Kackfohgel: OOP: Behandlung von Benutzereingaben für Konstruktor

Beitrag lesen

Moin!

Ich übe gerade OOP in PHP anhand kleinerer Beispiele. Dabei konnte ich mir die Frage wann und wie ich Benutzereingaben behandle nicht selbst beantworten.

Vlt. zunächst einmal ein Beispiel*:

<?php  
	// Variable für Name anlegen  
	$name = "";  
	  
	// Prüfen, ob ein Name eingetragen wurde, dann  
	if(isset($_POST["name"]) && !empty($_POST["name"]))  {  
		$name = htmlspecialchars($_POST["name"]);  
	}  
?>  
  
  
<!doctype html>  
<html>  
<head>  
	<meta charset="utf-8">  
	<title>Beispiel</title>  
</head>  
<body>  
	<form action="self_beispiel.php" method="post" name="upload" enctype="multipart/form-data">  
		<p>Name:  
			<input type="text" size="50" name="name" id="name" value="<?php echo $name; ?>">  
		</p>  
		<p><input type="submit" value="Senden"></p>  
	</form>  
  
	<?php  
		if(!empty($name)) {  
			$benutzer = new Benutzer($name);  
			echo $benutzer->gruesseBenutzer();  
		}  
	?>	  
	  
</body>  
</html>  
  
<?php  
	// Klassendefinition  
	class Benutzer {  
		  
		// Eigenschaften  
		private $name;  
				  
		// Konstruktor  
		public function __construct($name) {  
			$this->name = $name;  
		}  
				  
		// Setter/Getter  
		// ...  
						  
		// Methoden  
		public function gruesseBenutzer() {  
			return "<p>Hallo " . $this->name . "!</p>";  
		}		  
	}  
?>

Hier habe ich direkt bei der Übernahme der Postvariablen mit htmlspecialchars() eine "ausgabefähige" Variante von 'name' in $name abgespeichert, da ich so im weiteren Programm den Namen mit einem einfachen echo $name einbinden kann ohne jedes mal eine htmlspecialchars-Behandlung vorzunehmen. Dies erschien mir erst als der bessere Weg, da ich weniger redundanten Code erzeuge. Nun bin ich mir aber aus zwei Gründen nicht mehr so sicher:

  1. Die pauschale Bearbeitung ist vlt. zu kurz gedacht.Wenn ich den Namen bspw. später auch für eine SQL-Abfrage verwenden will, müsste ich diesen ja anders behandeln (mysql_real_escape_string()). Dies spricht dafür, dass ich die Variable immer erst dort behandele, wo eine Behandlung erforderlich ist.

  2. Bei größeren Programmen als das hiesige Beispiel könnte übersehen/vergessen werden, dass 'name' schon behandelt wurde und zu einer doppelten Behandlung führen.

Deshalb wollte ich das htmlspecialchars() beim speichern der Postvariablen weglassen und erst bei der Ausgabe hinzufügen.

Ich bin mir aber nicht sicher, ob ich dem Konstruktor die Variable Name so unbearbeitet übergeben darf oder dadurch eine Sicherheitslücke öffne. Meine Unsicherheit besteht natürlich auch schon bei der vorherigen Behandlung mit htmlspecialchars(), aber dadurch wurde sie mir deutlich.

Ich habe selbst mal probiert eine Zeichenkette (per Formular als Name) ") echo "Achtung!!!" zu übergeben. Hat zwar nicht geklappt, aber ich bin auch kein Hacker und weiß nicht, auf was für Ideen die so kommen, will aber trotzdem ein möglichst sicheres Script.

Also:
Darf/sollte ich eine Postvariable unbearbeitetet an den Konstruktor übergeben? Wenn "nein" wie sollte sie behandelt werden (falls keine pauschale Aussage möglich ist, auf das Beispiel bezogen)?

Freundliche Grüße
Kackfohgel

*Bitte berücksichtigt, dass ich ein einfaches Beispiel basteln wollte und deshalb ein wenig hin- und her springe zwischen Objektorientierung und Prozessorientierung.