Wie sicher ist es? Eure Meinung

Ja, du zeigst Fehlermeldungen... aber durch das Benutzen von [phpf]die[/phpf] stirbt das Skript nach der Meldung.

Sprich bei Benutzung eines Templatesystems könnte der Fuß der Seite fehlen. Ergibt unschöne Seitenergebnisse und HTML Fehler.

Oder BEIM neucachen eines Dokuments tritt der Fehler auf... Resultat: Der Cache ist erstmal für die Auslaufzeit hinüber...
Also lieber die Fehler abfangen und nicht sterben() lassen.
 
PHP:
/**
		* Der Konstruktor der Klasse
		* <p>Speichert die übergebenen Daten ab, stellt eine Verbindung her und wählt eine Datenbank</p>
		* @param string $dbhost Enthält den Host zu dem eine Verbindung aufgebaut wird
		* @param string $dbuser Enthält den User für die Verbindung
		* @param string $dbpass Enthält das Passwort für die Verbindung
		* @param string $dbdata Enthält die Datenbank die ausgewählt werden soll
		* @uses Db::connect()
		* @uses Db::select_db()
		*/
		function __construct($dbhost, $dbuser, $dbpass, $dbdata)
		{
			$this->dbhost = $dbhost;
			$this->dbuser = $dbuser;
			$this->dbpass = $dbpass;
			$this->dbdata = $dbdata;
			$this->connect();
			$this->select_db();
		}
		/**
		* Der Konstruktor der Klasse
		* <p>Speichert die übergebenen Daten ab, stellt eine Verbindung her und wählt eine Datenbank</p>
		* @param string $dbhost Enthält den Host zu dem eine Verbindung aufgebaut wird
		* @param string $dbuser Enthält den User für die Verbindung
		* @param string $dbpass Enthält das Passwort für die Verbindung
		* @param string $dbdata Enthält die Datenbank die ausgewählt werden soll
		* @uses Db::connect()
		* @uses Db::select_db()
		*/
		function db($dbhost, $dbuser, $dbpass, $dbdata)
		{
			$this->dbhost = $dbhost;
			$this->dbuser = $dbuser;
			$this->dbpass = $dbpass;
			$this->dbdata = $dbdata;
			$this->connect();
			$this->select_db();
		}

So habe ich es jetzt im moment, kann ich die alte funktion drin lassen, damit ich es auch auf PHP4 betreiben kann?

Bei den Exceptions bin ich mir noch nicht sicher wie ich das ganze nun implementiere, da muss ich nochmal schauen
 
Nein, denn Session-Variablen werden serverseitig gespeichert. Auf dem Clienten-PC wird nur die Session_ID gespeichert, mit deren Hilfe der Server weiss, welche Session-Variablen zu welchem Clienten gehören.
Verändern kann also nur der Server (also dein Script) die Sessions.

Wenn in der php.ini "session.use_cookies = 1" steht, versucht der Server, alle Werte an den Client auszulagern. Hat das keinen Erfolg, wird jeder Link auf eine Seite der selben Domain automatisch umgeschrieben und um die SessionID erweitert. Heutzutage ist das aber eher selten, da die meisten User Cookies aktiviert haben.
Man kann die SessionID als Client ändern indem man z.B. Cookies deaktiviert und in der Adressleiste des Browsers selber ein bisschen rumspielt. Erschwert wird das u.A. durch verschlüsselte SessionIDs...

Gruß
Enum
 
Nachtrag:

Wenn man einen vernünftigen Browser besitzt, kann man auch die Daten eines Cookies ändern. Das bedeutet, egal ob Du "use_cookies" verwendest oder nicht:
alles was du an den Client sendest kann er manipulieren. Für sicheren Datenaustausch gibt es andere Techniken, aber im Endeffekt wird es wohl nie gelingen etwas derartiges wirklich sicher zu gestalten.
Mann kann sich aber damit begnügen, den DAUs das Leben so einfach und den ScriptKiddies so schwer wie möglich zu machen... :-)

Gruß
Enum
 
PHP:
<?php
	/**
	* Die Datei kann includiert werden um die Klasse "Db" benutzen zu können
	* @package DbKlasse
	* @version DbClass v0.1
	* @author Tobias Lückel
	* @copyright Copyright (c) 2008, Tobias Lückel
	*/
	/**
	*  Inkludiert die ErrorFileHandler Klasse
	* @version DbClass v0.1
	* @author Tobias Lückel
	* @copyright Copyright (c) 2008, Tobias Lückel
	*/
	require_once('./include/efh.class.php');
	/**
	* Inkludiert den ExceptionHandler
	* @version DbClass v0.1
	* @author Tobias Lückel
	* @copyright Copyright (c) 2008, Tobias Lückel
	*/
	require_once('./include/exceptionhandler.class.php');
	/**
	* Die Klasse "Db" stellt Funktionen bereit, die eine Kommunikation mit einem MySQL Server ermöglichen
	* @version DbClass v0.1
	* @todo
	*	<ol>
	*		<li>Weitere Funktionen hinzufügen</li>
	*		<li>Ausführliches Testen der Funktionen</li>
	*	</ol>
	* @author Tobias Lückel
	* @copyright Copyright (c) 2008, Tobias Lückel
	* @package DbKlasse
	*/
	class Db extends ExceptionHandler
	{
		/**#@+
		* @var string
		* @access private
		*/
		/**
		* Speichert den Host für die Datenbankverbindung
		*/
		private $dbhost;
		/**
		* Speichert den User für die Datenbankverbindung
		*/
		private $dbuser;
		/**
		* Speichert das Passwort für die Verbindung
		*/
		private $dbpass;
		/**
		* Speichert die Datenbank
		*/
		private $dbdata;
		/**#@-*/
		/**
		* Speichert die Verbindung zu einem Datenbankserver
		* @var mixed
		* @access private
		*/
		private $dbconnection;
		/**
		* Gibt an ob eine Verbindung zu einem Datenbankserver besteht
		* @var bool
		* @access private
		*/
		private $connected=false;
		/**
		* Gibt an ob eine Datenbank ausgewählt wurde
		* @var bool
		* @access private
		*/
		private $selected=false;
		/**
		* Gibt an wieviele Datensätze bei der Ausführung des letzten Querys betroffen sind
		* @var int
		* @access private
		*/
		private $num_rows=0;
		/**
		* Der Konstruktor der Klasse
		* <p>Speichert die übergebenen Daten ab, stellt eine Verbindung her und wählt eine Datenbank</p>
		* @param string $dbhost Enthält den Host zu dem eine Verbindung aufgebaut wird
		* @param string $dbuser Enthält den User für die Verbindung
		* @param string $dbpass Enthält das Passwort für die Verbindung
		* @param string $dbdata Enthält die Datenbank die ausgewählt werden soll
		* @uses Db::connect()
		* @uses Db::select_db()
		*/
		function __construct($dbhost, $dbuser, $dbpass, $dbdata)
		{
			$this->dbhost = $dbhost;
			$this->dbuser = $dbuser;
			$this->dbpass = $dbpass;
			$this->dbdata = $dbdata;
			$this->connect();
			$this->select_db();
		}
		/**
		* Der Konstruktor der Klasse
		* <p>Speichert die übergebenen Daten ab, stellt eine Verbindung her und wählt eine Datenbank</p>
		* @param string $dbhost Enthält den Host zu dem eine Verbindung aufgebaut wird
		* @param string $dbuser Enthält den User für die Verbindung
		* @param string $dbpass Enthält das Passwort für die Verbindung
		* @param string $dbdata Enthält die Datenbank die ausgewählt werden soll
		* @uses Db::connect()
		* @uses Db::select_db()
		*/
		function db($dbhost, $dbuser, $dbpass, $dbdata)
		{
			$this->dbhost = $dbhost;
			$this->dbuser = $dbuser;
			$this->dbpass = $dbpass;
			$this->dbdata = $dbdata;
			$this->connect();
			$this->select_db();
		}
		/**
		* Stellt die Verbindung zu einer Datenbank her
		* <p>Speichert die Verbindung in Db::dbconnection</p>
		* <p>Setzt Db::connected auf true wenn die Verbindung besteht</p>
		*/
		private function connect()
		{
			$this->dbconnection = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpass)
				or $this->error(mysql_error(),  mysql_errno());
			$this->connected=true;
		}
		/**
		* Wählt eine Datenbank auf dem Server aus
		* <p>Setzt Db::selected auf tru wenn eine Datenbank ausgewählt wurde</p>
		*/
		private function select_db()
		{
			@mysql_select_db($this->dbdata,$this->dbconnection) 
				or $this->error(mysql_error(),  mysql_errno());
			$this->selected=true;
		}
		/**
		* Sendet ein Query an die Datenbank
		* @param string $query Enthält den zu sendenden Query
		* @param bool $error Gibt an ob ein Error diesen Query schickt, standardmäßig auf false
		* @access private
		*/
		private function query($query)
		{
			@mysql_query($query,$this->dbconnection)
				or parent::throwException(mysql_error(),  mysql_errno());
		}
		/**
		* Sendet ein SELECT Query an die Datenbank
		* <p>Es ist möglich SQL interne Befehle wie DATE_ADD etc. in den $where_values zu übergeben
		* $where und $where_op werden dann automatisch mit Leerstrings befüllt, damit kein Fehler
		* entsteht, wenn das Query zusammengebaut wird</p>
		* @param string $table Die Tabelle an die das Query gesendet werden soll
		* @param array $values Die Inhalte die ausgelesen werden sollen
		* @param array $where (optional) Die Spalten für die WHERE Klausel
		* @param array $where_op (optional) Die Operationen die zwischen Spalten und WHERE Inhalten stehen
		* @param array $where_values (optional) Die Inhalte für die WHERE Klausel
		* @return mixed
		* @uses Db::StringEscape(string)
		* @uses Db::ArrayEscape(array)
		*/
		function select($table,$values,$where="",$where_op="",$where_values="") {
			$table = $this->StringEscape($table);
			$values = $this->ArrayEscape($values);
			$where = $this->ArrayEscape($where);
			$where_op = $this->ArrayEscape($where_op);
			$where_values = $this->ArrayEscape($where_values);
			$query = "SELECT ";
			for($i=0;$i<count($values);$i++)
			{
				if($i!=count($values)-1)
				{
					$query.=$values[$i].", ";
				}
				else
				{
					$query.=$values[$i]." ";
				}
			}
			$query.="FROM ".$table;
			if(!empty($where_values))
			{
				$query.=" WHERE ";
				while(count($where)<count($where_values))
				{
					array_push($where,'');
				}
				while(count($where_op)<count($where))
				{
					array_push($where_op,'');
				}
				for($i=0;$i<count($where);$i++)
				{
					if($i!=count($where)-1)
					{
						$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."' AND ";
					}
					else
					{
						$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."'";
					}
				}
			}
			$query.=";";
			//echo $query."<br />";
			$sql = @mysql_query($query,$this->dbconnection)
				or $this->error(mysql_error(),  mysql_errno());
			$this->num_rows = mysql_num_rows($sql)
								or $this->error(mysql_error(),  mysql_errno());
			return $sql;
		}
		function select_or($table,$values,$where="",$where_op="",$where_values="") {
			$table = $this->StringEscape($table);
			$values = $this->ArrayEscape($values);
			$where = $this->ArrayEscape($where);
			$where_op = $this->ArrayEscape($where_op);
			$where_values = $this->ArrayEscape($where_values);
			$query = "SELECT ";
			for($i=0;$i<count($values);$i++)
			{
				if($i!=count($values)-1)
				{
					$query.=$values[$i].", ";
				}
				else
				{
					$query.=$values[$i]." ";
				}
			}
			$query.="FROM ".$table;
			if(!empty($where_values))
			{
				$query.=" WHERE ";
				while(count($where)<count($where_values))
				{
					array_push($where,'');
				}
				while(count($where_op)<count($where))
				{
					array_push($where_op,'');
				}
				for($i=0;$i<count($where);$i++)
				{
					if($i!=count($where)-1)
					{
						$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."' OR ";
					}
					else
					{
						$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."'";
					}
				}
			}
			$query.=";";
			//echo $query."<br />";
			$sql = @mysql_query($query,$this->dbconnection)
				or $this->error(mysql_error(),  mysql_errno());
			$this->num_rows = mysql_num_rows($sql)
								or $this->error(mysql_error(),  mysql_errno());
			return $sql;
		}
		/**
		* Sendet ein INSERT Query an die Datenbank
		* <p>Es ist wichtig, dass $columns und $values die gleiche Anzahl von Werten enthält, ansonsten wird false zurückgeliefert</p>
		* @param string $table Die Tabelle an die das Query gesendet werden soll
		* @param array $columns Die Spalten in die etwas eingetragen werden soll
		* @param array $values Die Inhalte die ausgelesen werden sollen
		* @return bool
		* @uses Db::StringEscape(string)
		* @uses Db::ArrayEscape(array)
		*/
		function insert($table,$columns,$values) {
			if(count($columns)==count($values))
			{
				$table = $this->StringEscape($table);
				$columns = $this->ArrayEscape($columns);
				$values = $this->ArrayEscape($values);
				$query="INSERT INTO ".$table." (";
				for($i=0;$i<count($columns);$i++)
				{
					if($i!=count($columns)-1)
					{
						$query.=$columns[$i].",";
					}
					else
					{
						$query.=$columns[$i].") VALUES (";
					}
				}
				for($i=0;$i<count($values);$i++)
				{
					if($i!=count($values)-1)
					{
						$query.="'".$values[$i]."',";
					}
					else
					{
						$query.="'".$values[$i]."')";
					}
				}
				$query.=";";
				//echo $query."<br />";
				$sql = @mysql_query($query,$this->dbconnection)
					or $this->error(mysql_error(),  mysql_errno());
				$this->num_rows = mysql_affected_rows($this->dbconnection)
									or $this->error(mysql_error(),  mysql_errno());
				return mysql_insert_id();
			}
			else
			{
				return -1;
			}
		}
		
		function update($table,$columns,$values,$where="",$where_op="",$where_values="") {
			if(count($columns)==count($values))
			{
				$table = $this->StringEscape($table);
				$columns = $this->ArrayEscape($columns);
				$values = $this->ArrayEscape($values);
				$where = $this->ArrayEscape($where);
				$where_op = $this->ArrayEscape($where_op);
				$where_values = $this->ArrayEscape($where_values);
				$query="UPDATE ".$table." SET ";
				for($i=0;$i<count($columns);$i++)
				{
					if($i!=count($columns)-1)
					{
						$query.=$columns[$i]."='".$values[$i]."', ";
					}
					else
					{
						$query.=$columns[$i]."='".$values[$i]."'";
					}
				}
				if(!empty($where_values))
				{
					$query.=" WHERE ";
					while(count($where)<count($where_values))
					{
						array_push($where,'');
					}
					while(count($where_op)<count($where))
					{
						array_push($where_op,'');
					}
					for($i=0;$i<count($where);$i++)
					{
						if($i!=count($where)-1)
						{
							$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."' AND ";
						}
						else
						{
							$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."'";
						}
					}
				}
				$query.=";";
				echo $query."<br />";
				$sql = @mysql_query($query,$this->dbconnection)
					or $this->error(mysql_error(),  mysql_errno());
				$this->num_rows = mysql_affected_rows($this->dbconnection)
									or $this->error(mysql_error(),  mysql_errno());
				return true;
			}
			else
			{
				return false;
			}
		}
		/**
		* Gibt die Anzahl der betroffenen Datensätze des letzten Querys zurück
		* @return int
		*/
		function get_num_rows() {
			return $this->num_rows;
		}
		
		function error($err, $errno)
		{
			if($this->connected==false)
			{
				parent::throwException(mysql_error(),  mysql_errno());
			}
			elseif($this->selected==false)
			{
				parent::throwException(mysql_error(),  mysql_errno());
			}
			else
			{
				$escaped = $this->ArrayEscape(array($err,$errno));
				$query = "INSERT INTO fehler(fehler_meldung,fehler_nummer,fehler_zeit)
						  VALUES('".$escaped[0]."','".$escaped[1]."','".date("Y-m-d H:i:s")."')";
				$this->query($query);
			}
		}
		
		function ArrayEscape($sEscape)
		{
			for($i=0;$i<count($sEscape)-1;$i++)
			{
				$sEscape[$i] = mysql_real_escape_string($sEscape[$i],$this->dbconnection)
								or $this->error(mysql_error(),  mysql_errno());
			}
			return $sEscape;
		}
		
		function StringEscape($sEscape)
		{
			return mysql_real_escape_string($sEscape,$this->dbconnection)
					or $this->error(mysql_error(),  mysql_errno());
		}
	}
?>

Soweit habe ich das nun umgebaut, allerdings stürtzt mein Apache ab, wenn ich das ausführen lasse, allerdings nicht, wenn ein Fehler auftritt, nur wenn alles korrekt ist.

PHP:
class ExceptionHandler extends Exception 
	{
		public function throwException($message=NULL,$code= NULL)
		{
			throw new Exception($message,$code);
		}
		
		public function __toString()
		{
			return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
		}
	}

Mhhh konnte den Fehler noch nicht eingrenzen, habe schon einiges ausprobiert, vielleicht seht ihr irgendwas
 
Tja mhhh nun habe ich irgendwie das Problem, das nichts mehr funktioniert, keine Ahnung warum, aber nun habe ich keine Fehlermeldungen mehr, sondern das Script läuft einfach weiter und sagt es wäre alles ok, aber öfter stürtzt dann auch mein Apache ab, ich denke das kommt dann, wenn viele Fehler in kurzer Zeit erzeugt werden und diese in die Datenbank geschrieben werden soll.
 
Was sag denn die error.log? Wenn Sie gar nix sagt, versuch' doch mal das Skript zu starten und unmittelbar darauf die Verbindung zu trennen...
 
Joar mhhh die Error.log sagt gar nichts, nur das Apache restartet wird, wird es aber nicht sondern bleibt beendet.
Ich denke das größte Problem ist, dass meine DB Klasse zu statisch ist und sich nicht gut genug anpassen lässt, im moment schaue ich mich ein wenig um und schreibe mir dann eine neue Klasse.
 
Zurück