Wie sicher ist es? Eure Meinung

Dark Ranger

Erfahrenes Mitglied
Hi

Also ich arbeite mit Smarty(Templatesystem) und meine Links sind dann irgendwie so /index.php?site=home

und im PHP Code mache ich folgendes:
PHP:
<?php
    blablubb configs, sql connection usw.

    $site = $_GET['site']; //Übernehmen der Variable aus dem Link
    if($_SESSION['irgendwas']==0)    //Schauen ob der User eingeloggt ist
    {
        if(!isset($site))
        {
            Irgendein Template was aufgerufen wird wenn keine site übergeben wurde
        }
        else
        {
            switch($site)
            {
                case 'login':
                    Login Template
                    include('./includes/makelogin.include.php');    //Einfügen der Dateien die den PHP Code für das Login beinhalten
                case 'overview':
                    Übersichts Template
            }
        }
    }
    else
    {
        //Hier sieht es eigentlich genauso aus wie beim if, nur das der User angemeldet sein muss
    }

Was meint ihr wie sicher das ganze ist? Braucht ihr noch irgendwelche Infos?
 
Zuletzt bearbeitet:
PHP:
 $site = $_GET['site']; //Übernehmen der Variable aus dem Link
    if($_SESSION['irgendwas']==0)    //Schauen ob der User eingeloggt ist
    {
        if(!isset($site))
        {
            Irgendein Template was aufgerufen wird wenn keine site übergeben wurde
        }
        else
        {
            switch($site)
Ich persoenlich finde es ueberfluessig $_GET['site'] in $site zu laden. Vor allem wirst Du auf diese Weise dafuer sorgen dass wenn kein Parameter site uebergeben wurde eine Notice geworfen wird. Diese wird zwar bei den Default-Settings nicht angezeigt, sollte aber dennoch vermieden werden.
Zudem belegt diese Kopie dann doch nur unnoetig Speicher, auch wenn es nicht viel ist.

Entsprechend wuerde ich schlichtweg folgenden Weg vorschlagen:
PHP:
if (empty($_GET['site']))
{
 //...
}
else
{
 switch($_GET['site'])
 {
  //...
 }
}
Zusaetzlich wuerde ich auch eine Default-Aktion bei switch nutzen, falls der uebergebene Wert keinem der von Dir definierten Werte entspricht.
 
OK danke schonmal! Dann werde ich mal meinen Code dahingehend umbauen, ist ja nicht ganz so schwer!

Das mit dem default verwende ich auch, habe ich nur vergessen!

UNd was hälst du von der Methode mit dem eingeloggt sein? Kann man $_SESSION Variablen verändern von aussen?
 
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.

Dein Script ansosnten ist eigentlich sicher.
 
War mir da nicht mehr ganz so sicher! ^^

Und wenn ich an einem Datensatz in der Datenbank etwas durch den User verändert haben will, dann speichere ich die ID des zu bearbeitenden Datensatzes am besten in einer SESSION Variable und nicht versteckt in einem Formular oder?

Hatte da nämlih mal den Fall, da hatte ich eine Liste von Datensätzen und dann konnte man auf den Editier Button drücken und schon wurde dieser Datensatz per Javascript dann editierbar gemacht und man konnte das Formular abschicken. Hatte die ID des zu ändernden Datensatzes halt versteckt im Formualr stehen, damit ich auch den richtigen Datensatz ändere! Wie könnte ich dann sowas sicher lösen?
Von wegen Javascript: Das ganze lief intern in einer Firma und da ist Javascript immer aktiv und man kann es als User nicht abstellen.
 
Habe dazu auch eine Frage.
Wie kann ich sicherstellen das jemand keinen "Schadcode"
bsp. "http://seite.de/index.php?ac=status<script...."
bei mir einfügen kann mein Aufruf schaut wie folgt aus.
PHP:
include("header.php");

if($_GET['ac'] != "")
    {
    $filename = "includes/".$_GET['ac'].".php";
    if(file_exists($filename)){
        include($filename);
    }
    else
    {
        echo "Datei nicht gefunden";
        break;
    }
}
else
{
    $filename = 'includes/status.php';
    include($filename);
}

include("fotter.php");

mfg Spikaner
 
Mhhh <script> kannst du ja über Regular Expression rausfiltern, aber für allen möglichen Schadcode ist das bestimmt nicht so einfach!

Bin da auch noch dran das ganze ein wenig sicher zu machen.

Allerdings weiß ich es noch nicht genau wie ich es mache wenn ich mehrere Datensätze habe die User bearbeiten können sollen.

Also:
  • Datensatz 1
  • Datensatz 2
  • Datensatz 3

Die einzelnen Datensätze habe ich sonst immer in ein eigenes Formular gepackt und die ID versteckt mit übergeben, damit ich auch den richtigen Datensatz bearbeite, aber diese versteckte ID könnte man ja nun manipulieren und das wäre nicht so gut.

Weiß da vielleicht einer einen Rat?
 
Habe mal ein wenig meine Datenbank Befehle in einer Klasse zusammen geschrieben:
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');
	/**
	* 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 
	{
		/**#@+
		* @var string
		* @access private
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		/**
		* 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
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		private $dbconnection;
		/**
		* Gibt an ob eine Verbindung zu einem Datenbankserver besteht
		* @var bool
		* @access private
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		private $connected=false;
		/**
		* Gibt an ob eine Datenbank ausgewählt wurde
		* @var string
		* @access private
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		private $selected=false;
		/**
		* 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()
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		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>
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		private function connect()
		{
			$this->dbconnection = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpass) 
				or die($this->error(mysql_error,  mysql_errno, "Konnte keine Verbindung herstellen"));
			$this->connected=true;
		}
		/**
		* Wählt eine Datenbank auf dem Server aus
		* <p>Setzt Db::selected auf tru wenn eine Datenbank ausgewählt wurde</p>
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		private function select_db()
		{
			@mysql_select_db($this->dbdata,$this->dbconnection) 
				or die($this->error(mysql_error($this->dbconnection), 
									mysql_errno($this->dbconnection)));
			$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
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		private function query($query,$error=false)
		{
			if($error==false)
			{
				@mysql_query($query,$this->dbconnection)
					or die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
			}
			else
			{
				@mysql_query($query,$this->dbconnection)
					or die($query);
			}
		}
		/**
		* 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)
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		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 die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
			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 die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
			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)
		* @author Tobias Lückel
		* @copyright Copyright (c) 2008, Tobias Lückel
		*/
		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 die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
				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($i0;$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.=";";
				$sql = @mysql_query($query,$this->dbconnection)
					or die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
				return true;
			}
			else
			{
				return false;
			}
		}
		
		function num_rows($table,$values,$where="",$where_op="",$where_values="") {
			$sql = $this->select($table,$values,$where,$where_op,$where_values);
			$count = mysql_num_rows($sql);
			return $count;
		}
		
		function num_rows_or($table,$values,$where="",$where_op="",$where_values="") {
			$sql = $this->select_or($table,$values,$where,$where_op,$where_values);
			$count = mysql_num_rows($sql);
			return $count;
		}
		
		function error($err, $errno, $comment="")
		{
			if($this->connected==false)
			{
				$this->errorausgabe($errno, $comment);
			}
			elseif($this->selected==false)
			{
				$this->errorausgabe($errno, $comment);
			}
			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,true);
				$this->errorausgabe($errno, $comment);
			}
		}
		
		private function errorausgabe($errno, $comment="")
		{
			global $smarty;
			$smarty->assign('titel','FutureWars - Delta Version');
			$smarty->assign('logotitel','FutureWars');
			$efh = new ErrorFileHandler();
			$code = $efh->getErrorCode($errno);
			if($comment=="")
			{
				switch($errno)
				{
					case $errno<1000:
						$fehlermeldung = "Die Error Nummer ist kleiner als 1000 n&auml;mlich: ".$errno."<br />
										  Bitte wenden Sie sich an den Administrator.<br />
										  Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
						break;
					case 1049:
						$fehlermeldung = "Es besteht ein allgemeines Problem mit der Datenbank. <br />
										  Bitte wenden Sie sich an den Administrator.<br />
										  Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
						break;
					case $errno>1000:
						$fehlermeldung = "Die Error Nummer ist gr&ouml;sser als 1000 n&auml;mlich: ".$errno."<br />
										  Bitte wenden Sie sich an den Administrator.<br />
										  Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
						break;
				}
			}
			else
			{
				$fehlermeldung = $comment."<br />
								 Bitte wenden sie sich an den Administrator.<br />
								 Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
			}
			$smarty->assign('fehlermeldung',$fehlermeldung);
			$smarty->display('fehler.tpl');
		}
		
		function ArrayEscape($sEscape)
		{
			for($i=0;$i<count($sEscape)-1;$i++)
			{
				$sEscape[$i] = mysql_real_escape_string($sEscape[$i],$this->dbconnection);
			}
			return $sEscape;
		}
		
		function StringEscape($sEscape)
		{
			return mysql_real_escape_string($sEscape,$this->dbconnection);
		}
	}
?>

Aufrufen tue ich das ganze folgendermaßen:
PHP:
$db = new Db('localhost','....benutzer......','........pass......','.....datenbank......');
$db->update("usertabelle",
						array(status,time,status2),
						array(1,date("Y-m-d H:i:s"),1),
						array('ID'),
						array($this->id));

Was meint ihr dazu? Ziemlich umständlich das ganze? Unsicher? Vorschläge?
 
Deine phpDoc ist etwas durcheinander und teilweise falsch.

@author Tobias Lückel
@copyright Copyright (c) 2008, Tobias Lückel

Warum steht das an jeder Methode dran?
Und warum hört sie am Ende einfach auf`?

Warum benutzt du nicht [phpf]__construct[/phpf]?

Statt den ganzen [phpf]die[/phpf]s würde ich lieber ein ExceptionHandling sehen... Dann wird auch nicht der Seitenaufbau gestört, sondern man kann schöne Fehlermeldungen produzieren.
 
Joar mit meinem PHPDoc bin ich noch nicht ganz fertig ^^ Das @author usw. is einfach durch Copy&Paste entstanden!

Ich erzeuge ja auch Fehlermeldungen, der User bekommt halt ein Fehlertemplate zu sehen und wenn ich will, sogra mit Fehlernummer die ich nachher wieder zuweisen kann mit exater Fehlermedlung, aber werde mir mal ExceptionHandling anschauen.

Und das __construct() werde ich mir auch mal anschauen und mich dort einlesen.

Wenn es noch weitere Vorschläge gibt, dann immer her damit
 
Zurück