Seite 1 von 1
Ist dieses Script sicher?...
Verfasst: Di 25.Sep, 2007 21:18
von KeineAhnung
Hi,
ich wollte ein Script nehmen um einen bestimmten Text z.B. per passwort zu schützen, dazu habe ich dieses Script gefunden: .:
Link:. so, nur jetzt würde ich gerne wissen ob dieses script sicher ist und das nicht aufeinmal eine lücke ist wodurch alle zugriff auf diese datei haben...
Verfasst: Di 25.Sep, 2007 21:43
von oxpus
Du solltest die Kennwörter nicht im Klartext speichern, sondern mit md5(); wandeln und das übernommene Passwort ebenfalls mit md5(); wandeln, bevor beide verglichen werden.
Ansonsten gibt es an dem Script nichts auszusetzen.
Verfasst: Di 25.Sep, 2007 21:51
von KeineAhnung
achso, danke für den tipp, habe mich nur gewundert woher das 2te script (das ausgabe) weiß das das wirklich ein valider user ist
mhmm, ich bin da jetzt nicht so ein prof, was muss ich an dem script ändern damit das mit md5 verschlüsselt und dann verglichen wird ?
mein versuch war:
if($pruef[0] == $_POST['md5(user)'] && $pruef[1] == $_POST['md5(pass)'])
aber das gingn nicht, habe natülich passwort in md5 verwandelt gehabt
EDIT2: so ich habe es hinbekommen, und war so:
if($pruef[0] == md5($_POST['user']) && $pruef[1] == md5($_POST['pass']))
EDIT3. Könnte ich damit auch Dateien (Bilder, etc.) per passwort schlüsseln ?
EDIT4: ja, geht indem ich die dateien in ein verzeichnis mit deny, allow tue und in der geschützten php datei include
Verfasst: Di 25.Sep, 2007 23:11
von KeineAhnung
ja cih weis dopplepost, aber oben habe ich ja geschrieben ich habe alles geschafft und jetzt doch irgendwie nicht:
ich möchste mit diesem Script Dateien includieren (also das nur authorisierte user zugriff haben):
Code: Alles auswählen
<?php
session_start();
if($_SESSION['user'] != "")
{
header("Content-Type: application/x-msdownload");
// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
?>
<?php
$muh = $_GET["Vorname"];
htmlspecialchars($muh);
include("gesichert/$muh");
?>
<?php
// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
}
else
{
echo "Kein Zugriff!";
}
?>
so und jetzt möchte ich wissen ob das script sicher ist, denn man includiert ja über die variable, ob man dann ncith bösen code includieren kann...
Verfasst: Mi 26.Sep, 2007 09:12
von oxpus
Wenn Du in der Bedingung eine Konstante definierst, die nur dann gesetzt ist, wenn die Anmeldung erfolgreich war, also z. B.
Code: Alles auswählen
header("Content-Type: application/x-msdownload");
define('LOGGED_IN', true);
dann kannst Du in der includierten Datei dieses mit abfragen:
Code: Alles auswählen
if(defined('LOGGED_IN'))
{
weiter im script
}
else
{
Fehlermeldung
}
Dann kann keiner das includierte File aufrufen, ohne sich angemeldet zu haben.
Was allerdings includiert wird, kann man nicht prüfen/steuern, wenn die Datei nicht im eigenen Zugriff steht und nur von Dir geändert werden kann.
Für diesen Fall muss man die üblichen Prüfungen für alle SQL-Abfragen machen, also z. B.
für nummerische Werte (Variablenname natürlich anpassen) oder
Code: Alles auswählen
$str_var = htmlspecialchars(str_replace("\'", "''", $str_var));
für Strings (Auch hier den Variablennamen wieder anpassen).
Verfasst: Mi 26.Sep, 2007 15:36
von KeineAhnung
ich mahcs doch lieber auf die sichere art
Code: Alles auswählen
<?php
session_start();
if($_SESSION['user'] != "")
{
if($_GET['datei1'] != "")
{
header("Content-Type: image/gif");
include ("gesichert/load.gif");
}
else
{
echo "Keine Datei gewählt!";
}
}
else
{
$datei = htmlspecialchars($_GET["datei1"]);
echo "Um sich die Datei <b>$datei</b> anzuschauen musst du eingeloggt sein.";
require "login.php";
}
?>
Verfasst: Mi 26.Sep, 2007 17:06
von oxpus
Sicher wäre meine Variante

Verfasst: Mi 26.Sep, 2007 18:06
von KeineAhnung
nur die habe ich nicht ganz verstanden

könntest du das was ich gepostet habe denn so anpassen wie du gemeint hast ?
EDIT:wäre das denn so trotz GET sicher ?
Code: Alles auswählen
<?php
session_start();
if($_SESSION['user'] != "")
{
header("Content-Type: image/gif");
$str_var = htmlspecialchars(str_replace("\'", "''", $_GET['datei']));
include ("gesichert/$str_var");
}
else
{
$datei = htmlspecialchars($_GET["datei1"]);
echo "Um sich die Datei <b>$datei</b> anzuschauen musst du eingeloggt sein.";
require "login.php";
}
?>
Verfasst: Mi 26.Sep, 2007 19:34
von oxpus
Ja, so wäre das i. O.
Verfasst: Mi 26.Sep, 2007 20:40
von KeineAhnung
naja ich konnt jetzt zwar die .htaccess auch includieren und zum download anbeiten, aber stört mich nicht wenn die sehen das da steht order deny,allow deny from all allow from 127.0.0.1
oder kann das schlimme folgen mit sich tragen ?
Verfasst: Mi 26.Sep, 2007 22:21
von cback
Dein Script oben. Wenn Du register_globals auf Deinem Server auf ON hast, kann man theoretisch die Session Variable USER überschreiben. Du hast hier ja bei der Session keinen erneuten Passwortcheck mehr. Deine einzige Prüfung ist nämlich ob die Variable leer ist oder nicht. Bei Globals ON könntest Du unter Umständen diese Var setten und wärst damit autentifiziert.
Umgehen kannste das wenn Du vor session_start(); noch
$_SESSION = array();
oder unset($_SESSION);
machst.
Sicher is sicher.
Alternativ das Passwort (verschlüsselt!) auch in die Session Var ablegen und bei jeder Seitenegenerierung nochmal prüfen ob das PW in Ordnung ist. Nur isses halt dumm, dass es dann auch in ner Session auftaucht, aber geht noch.
Bei Globals OFF hast Du natürlich absolut keine Probleme, da kommt keiner mehr von außen an die Session Vars ran.
Noch was gravierendes:
Dein Datei Include ist unsicher. Du sicherst nicht gegen Verzeichnisjumps ab (../). So kann man einfach mit ../ von geheim wieder nen Ordner zurück und includen was man möchte. Du sendest zwar den GIF Header, aber solche Dinge kann man mit entsprechenden Tools auch ignorieren oder umschreiben und so unter Umständen andere Dinge includen.
EDIT:
Beim else müsstest auch $_GET['datei'] schreiben statt $_GET['datei1'], sonst ist die Ausgabe natürlich leer in dem Fall.
Verfasst: Mi 26.Sep, 2007 22:40
von KeineAhnung
vielen vielen vielen danl für dne post, ja also register_globals ist bei mir off, habe aber trotzdem deinen tipp eingebaut, wie du ja sagtest sicher ist sicher
wie könnte ich denn das includen sicher das mann das nur von dem verzeichnis aus kann (und am besten die .htaccess nicht mit...)
Verfasst: Mi 26.Sep, 2007 22:42
von oxpus
Wenn man bereits Scripte downloaden kann, kann man enthaltene Sicherheitslücken noch einfacher ausnutzen.
Also sicher ist dann nur der sichere Hack Deines Servers

Verfasst: Mi 26.Sep, 2007 22:46
von KeineAhnung
also muss ich mir das mit dem Get includen aus dme kopf machen ?

Verfasst: Mi 26.Sep, 2007 22:46
von cYbercOsmOnauT
Code: Alles auswählen
<?php
// Sicherheit gegen register_globals Attacken
$_SESSION = array();
// Sicherheit gegen Directory Traversal und ASCIIZ Attacken
$datei = htmlspecialchars(preg_replace('#(\/|\.\.|"|\'|\x00)#i', '',$_GET['datei']));
$datei = str_replace('%00', '', $datei);
session_start();
if($_SESSION['user'] != "")
{
header("Content-Type: image/gif");
include ("gesichert/$datei");
}
else
{
echo "Um sich die Datei <b>$datei</b> anzuschauen musst du eingeloggt sein.";
require "login.php";
}
?>
Noch Fragen?

Verfasst: Mi 26.Sep, 2007 22:54
von KeineAhnung
[quote="cYbercOsmOnauT";p="77149"]
Code: Alles auswählen
<?php
// Sicherheit gegen register_globals Attacken
$_SESSION = array();
// Sicherheit gegen Directory Traversal und ASCIIZ Attacken
$datei = htmlspecialchars(preg_replace('#(\/|\.\.|"|\'|\x00)#i', '',$_GET['datei']));
$datei = str_replace('%00', '', $datei);
session_start();
if($_SESSION['user'] != "")
{
header("Content-Type: image/gif");
include ("gesichert/$datei");
}
else
{
echo "Um sich die Datei <b>$datei</b> anzuschauen musst du eingeloggt sein.";
require "login.php";
}
?>
Noch Fragen?

[/quote]
ja

ist das jetzt unknackbar (also mit verzeichniswechsel ^^)
danke schonmal

Verfasst: Mi 26.Sep, 2007 23:11
von cYbercOsmOnauT
Das i nach der # kann weg. Das schreib ich standardmäßig immer in meine RegEx's, aber hier in diesem Fall ist es nicht nötig. Verzeichniswechsel werden abgefangen.
Verfasst: Mi 26.Sep, 2007 23:14
von KeineAhnung
[quote="cYbercOsmOnauT";p="77152"]Das i nach der # kann weg. Das schreib ich standardmäßig immer in meine RegEx's, aber hier in diesem Fall ist es nicht nötig. Verzeichniswechsel werden abgefangen.[/quote]
habs grade getestet, wirklich, sehr cool, vielen sank
Verfasst: Sa 13.Okt, 2007 20:32
von KeineAhnung
[quote="cYbercOsmOnauT";p="77149"]
Code: Alles auswählen
<?php
// Sicherheit gegen register_globals Attacken
$_SESSION = array();
// Sicherheit gegen Directory Traversal und ASCIIZ Attacken
$datei = htmlspecialchars(preg_replace('#(\/|\.\.|"|\'|\x00)#i', '',$_GET['datei']));
$datei = str_replace('%00', '', $datei);
session_start();
if($_SESSION['user'] != "")
{
header("Content-Type: image/gif");
include ("gesichert/$datei");
}
else
{
echo "Um sich die Datei <b>$datei</b> anzuschauen musst du eingeloggt sein.";
require "login.php";
}
?>
Noch Fragen?

[/quote]
noch mal eine frage zu diesem script, wie schaffe ich es wenn die zu includierende datei nicht existiert das anstatt
Code: Alles auswählen
Warning: include(gesichert/beispiel) [function.include]: failed to open stream: No such file or directory in XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX on line 17
Warning: include() [function.include]: Failed opening 'gesichert/beispiel' for inclusion (include_path='.;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') in XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX on line 17
"
einfach nru kommt "Datei existiert nicht" ?
Verfasst: So 14.Okt, 2007 13:51
von oxpus
Man kann das prüfen, also in dem Falle wäre ein
Code: Alles auswählen
if(@file_exists($phpbb_root_path.'gesichert/beispiel'))
{
// normal weiter im Script;
}
else
{
message_die(GENERAL_MESSAGE, 'Datei existiert nicht');
}
Jedoch wäre auch ein require(); hier noch am besten geeignet, da die Datei ja verwendet werden muss.
Zwar ist hier auch die Fehlermeldung eine PHP-eigene und nur mir weiteren Tricks änderbar (analog der phpBB3-Mimik), aber es würde dann auf jeden Fall auch die weitere Verarbeitung komplett anhalten, was hier ja dann auch geschehen sollte.
Verfasst: So 14.Okt, 2007 17:07
von KeineAhnung
[quote="oxpus";p="77485"]Man kann das prüfen, also in dem Falle wäre ein
Code: Alles auswählen
if(@file_exists($phpbb_root_path.'gesichert/beispiel'))
{
// normal weiter im Script;
}
else
{
message_die(GENERAL_MESSAGE, 'Datei existiert nicht');
}
Jedoch wäre auch ein require(); hier noch am besten geeignet, da die Datei ja verwendet werden muss.
Zwar ist hier auch die Fehlermeldung eine PHP-eigene und nur mir weiteren Tricks änderbar (analog der phpBB3-Mimik), aber es würde dann auf jeden Fall auch die weitere Verarbeitung komplett anhalten, was hier ja dann auch geschehen sollte.[/quote]
das mit require ist mir als anfänger zu schwer aber das da oben geht, super, danke, und die bücher die du mir mal in dem anderen thread empfohlen hast (php + mysql und das andere) werde ich mir auf jedne fall holen
und wie schaffe ich es jetzt noch das wenn die datei z.b bla.zip heißt das der automatisch dne mime typ weiß, also das der die datei endung rausfindet und ich dann in die datei eintrage bei welcher datei endung der was machen soll...
EDIT: schon erledigt, war garnciht so schwer

Verfasst: Mo 15.Okt, 2007 15:25
von KeineAhnung
gibt es auch eine möglichkeit das der mir den inhalt des ordners ausließt und dann ausgibt wenn keine bzw. eine fehlerhafte datei gewählt wird, also das wenn ich dann auf eine datei klicken würde der die über download.php?datei=....... auswählen würde ?
Verfasst: Mo 15.Okt, 2007 15:30
von oxpus
Wie ausschliessen?
Was willst Du denn einbinden, bzw. unterdrücken?
Ich kann dem Sinn des Ganzen nicht so recht folgen...
Verfasst: Mo 15.Okt, 2007 15:39
von KeineAhnung
einfach nur wie ich schaffe das der das verzeichnis ausliest, alle dateien halt iwie ausgibt als link, und den dateinamen jeder datei z.B. in $name speichert so das ich dann einstellen kann das wenn man auf die datei klcikt dasm an auf dload.php?download=$name kommt
EDIT3: alle probleme sleber gelöst
EDIT2: (der neuste edit:D) ok nun habe ich folgendes problem, die dateinamen werden in der variabel "$files[0]" [1] etc, also einzeln gespeichert, und dieanzahl in $count, wie schaffe ich das der nur die $files[0]- z.B[12] öffnet wenn $count 12 ist ?
EDIT: habe schon mit google was nützliches gefunden
http://www.phpforum.de/forum/showthread.php?t=160977