Hallöchen, ich bin der Wucke und beschäftige mich seit nunmehr 3 Tagen mit PHP.
Ich hab dementsprechend wenig Ahnung. Ich bin ein Fan von Funktionen, kann mich aber mit objekorientierter Pogrammierung nicht so sehr anfreunden. Mir ist Prozedurale Programmierung wesentlich sympathischer.
So nun zur Frage:
Ich arbeite an einem Schulprojekt, in einem Team (welches das gute alte Motto 'Toll Ein Anderer Machts' bevolgt), als PHP-Zuständiger. Für bei dem Schulprojekt geht es um eine MySQL Datenbank, die unseren Vertretungsplan beherbergen soll. Natürlich gibt es einen öffentlichen Teil, aber ebene auch einen vertraulichen Teil um neue Stundenausfälle einzupflegen. Diesen Teil soll ich umsetzen.
Ich hab jetzt gut 20h damit verbracht ein Sicherheitsskript auszutüfteln, von dem ich meine das es Sicher ist, und wollte mir dazu mal ein wenig Kritik anhören. Besonders interessieren tuen mich natürlich Sicherheitslücken, aber wenn ihr da Code findet der eurer Meinung nach keinen Sinn ergibt, dann bitte auch rückmelden :)
Zum Einsatz des Skripts: Auf jeder der vertraulichen Seiten gibts am Anfang einen
<?php ?> Tag, der das Sicherheitsskript aufruft, also:
Code:
<?php
require_once 'auth.php';
auth_user();
Das eigentliche Skript sieht wie folgt aus:
Code:
<?php
################################
###Konstanten für MySQL#########
define("SQL_IP", '127.0.0.1');
define("SQL_DB", 'test');
define("SQL_USR", 'root');
define("SQL_PWD", '');
################################
##################################
###Session erzeugen###############
ini_set('session.use_trans_id',1);
session_start();
if (!isset($_SESSION['ipadr']))
{
$_SESSION['ipadr'] = $_SERVER['REMOTE_ADDR'];
}
else if ($_SESSION['ipadr'] != $_SERVER['REMOTE_ADDR'])
{
kill_session();
}
##################################
###############################
###Funktionen##################
function bind_user_to_session()
{
$_SESSION['username'] = $_POST["user"];
$_SESSION['password'] = $_POST["pwd_md5"];
}
function kill_session()
{
session_unset();
if (isset($_COOKIE[session_name()]))
{
setcookie(session_name(), "", time()-86400);
}
session_destroy();
}
function check_session()
{
if (isset($_SESSION['username']) AND isset($_SESSION['password']))
{
if ($_SESSION['username']!=null AND $_SESSION['password']!=null)
{
return true;
}
}
else
{
return false;
}
}
function check_if_post()
{
if (isset($_POST["user"]) AND isset($_POST["pwd_md5"]))
{
if($_POST["user"]!=null AND $_POST["pwd_md5"]!=null)
{
return true;
}
}
else
{
return false;
}
}
function check_auth($user,$pwd)
{
$db = @new mysqli( $SQL_IP, $SQL_USR, $SQL_PWD, $SQL_DB );
$password_query="SELECT Password FROM User WHERE User=\"".$user."\";";
if($user==null OR $pwd==null)
{
return false;
}
else if ($user=="admin" AND $pwd=="c51ce410c124a10e0db5e4b97fc2af39")
{
return true;
}
else if(mysqli_connect_errno() == 0)
{
if($pwd==$db->query($password_query))
{
return true;
}
$db->close();
}
else
{
return false;
}
}
function kick_user_to_login()
{
kill_session();
header('Location: login.php?retry');
exit();
}
function auth_user()
{
if(check_if_post())
{
bind_user_to_session();
}
if (!check_auth($_SESSION['username'],$_SESSION['password']))
{
kick_user_to_login();
}
}
###############################
?>
Gruß, Wucke
EDIT: Bei mir auf den heimischen PCs läuft des einwandfrei, bei meinem Freehoster 'kilu.de' krieg ich jedoch Fehler wegen der Header. Ich glaube, das könnte daran liegen, das der Freehoster Werbelayer über die eigentliche Seite legt, so dass der Header schon abgeschickt wird??? Die Fehler beim Header treten auf, wenn sich ausloggen will. Dafür muss man sich einloggen, ergo:
Username: admin
Passwort: 13
Link zum Hoster:
http://www.kilu.de/
Link zu der Seite bei dem Hoster:
http://glh.betrunken.org/login
EDIT 2: Das Problem Header sollte mit einer kleinen Funktion gefixt werden, bei Freehoster kommt es dennoch zu Fehlermeldungen (bezüglich der Session?)
Code:
function redirect_to($url)
{
if (!headers_sent())
{
header('Location: '.$url);
exit;
}
else
{
echo '<script type="text/javascript">';
echo 'window.location.href="'.$url.'";';
echo '</script>';
echo '<noscript>';
echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
echo '</noscript>'; exit;
}
}