Ist dieses Script sicher?...

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Antworten
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Ist dieses Script sicher?...

Beitrag 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...
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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
Zuletzt geändert von KeineAhnung am Di 25.Sep, 2007 22:56, insgesamt 5-mal geändert.
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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...
Zuletzt geändert von KeineAhnung am Di 25.Sep, 2007 23:31, insgesamt 2-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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.

Code: Alles auswählen

$num_var = intval($num_var);
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).
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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&auml;hlt!";
 }
}
else
{
$datei = htmlspecialchars($_GET["datei1"]);
echo "Um sich die Datei <b>$datei</b> anzuschauen musst du eingeloggt sein.";
require "login.php";
}
?>
Zuletzt geändert von KeineAhnung am Mi 26.Sep, 2007 15:46, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Sicher wäre meine Variante ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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";
}
?>
Zuletzt geändert von KeineAhnung am Mi 26.Sep, 2007 18:21, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ja, so wäre das i. O.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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 ?
Zuletzt geändert von KeineAhnung am Mi 26.Sep, 2007 20:47, insgesamt 1-mal geändert.
Benutzeravatar
cback
Beiträge: 1391
Registriert: Sa 15.Mai, 2004 15:32
Wohnort: Saarland
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von cback am Mi 26.Sep, 2007 22:34, insgesamt 5-mal geändert.
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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...)
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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 ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag von KeineAhnung »

also muss ich mir das mit dem Get includen aus dme kopf machen ? :D
cYbercOsmOnauT
Beiträge: 10
Registriert: Mo 29.Mai, 2006 03:21

Beitrag 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? :mad:
? Supporter bei phpBB.de ?
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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? :mad:[/quote]

ja :D ist das jetzt unknackbar (also mit verzeichniswechsel ^^)

danke schonmal ;)
cYbercOsmOnauT
Beiträge: 10
Registriert: Mo 29.Mai, 2006 03:21

Beitrag 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.
? Supporter bei phpBB.de ?
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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? :mad:[/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" ?
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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 :D
Zuletzt geändert von KeineAhnung am So 14.Okt, 2007 17:23, insgesamt 2-mal geändert.
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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 ?
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Wie ausschliessen?
Was willst Du denn einbinden, bzw. unterdrücken?
Ich kann dem Sinn des Ganzen nicht so recht folgen...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
KeineAhnung
Beiträge: 349
Registriert: Di 29.Mai, 2007 17:35
Wohnort: NRW
Kontaktdaten:

Beitrag 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
Zuletzt geändert von KeineAhnung am Mo 15.Okt, 2007 21:18, insgesamt 4-mal geändert.
Antworten