• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] PHP Sicherheit und Performance

Status
Für weitere Antworten geschlossen.
C

chillmaster

Guest
Bitte Schliesen und als Wichtig makieren.


Also, was ich euch zeigen will, ist wie man auf performance und auf sicherheit in seinen Scripts achtet.


Sicherheit:


Da ich oft sehe, das Websiten sicherheitslücken haben, wollte ich hier einfach mal alle Aufklären zum Thema Sichereit und Performce.


Bsp: Jeder will auf seiner Homepage eine URL like: index.php?action=side


Dieses wird von den meisten so benutzt:


PHP:
<?PHP
$action = $_GET['action'];
if (file_exists($action))
{
include($action);
}
else
{
include('default.html');
}
?>


Jedoch kann man so, jede beliebe Datei aufrufen und sogar bösen Code einschleußen z.b bild.jpg Oder Injections


Eine bessere und schnellere methode wäre hingegen ein einfaches switch.


PHP:
<?PHP
$php = '.php';
$action = $_GET['action'];
switch ($action)
{
case 'index' :
include($action.$php);
break;
}
?>


Dieses hat den Vorteil das die url nur den wert index enthalten darf und somit nichts gefährdet wird. Man sollte auch darauf achten das man die datei endung als variable deklariert, da man sonst mit einer einfachen Textfunktion diese ändern könnte.


Nun kommen wir zu den MySQL queries:



Auch hier gilt es, dass man strengstens auf die Sicherheit achten sollte, um sich vor möglichen Angriffen zu schützen.


PHP:
<?PHP
$sql = "INSERT INTO deinetabelle (deinfeld) VALUES ('".$_POST['deinfeld']."')";
$result = mysql_query($sql);
?>


damit könnte man einen bösen Code in die Datenbank einschleußen.
Um das zu verhindern, sollte man den befehl addslashes(); benutzen, und/oder strip_tags();.


Erklärung: addslashes(); fügt \ hinzu womit der ganze string escapet wird, sodass kein böser Code mehr eingeführt werden kann.
strip_tags(); löscht kommplett, HTML, JavaScript, und PHP aus einem String. Ausnahmen kann man hier angeben in form von:


PHP:
strip_tags($_POST['lla'],'b,u,i');


somit wären die html tags b u und i erlaubt.


Also ein sicheres INERT in die Datenbank würde so aussehen:


PHP:
<?PHP
$sql = "INSERT INTO deinetabelle (deinfeld) VALUES ('".addslashes($_POST['deinfeld'])."')";
$result = mysql_query($sql);
?>


oder


PHP:
<?PHP
$sql = "INSERT INTO deinetabelle (deinfeld) VALUES ('".strip_tags($_POST['deinfeld'])."')";
$result = mysql_query($sql);
?>




Auch bei der Ausgabe sollte man auf Sicherheit achten, hierzu wäre der befehl: htmlspecialchars();


geignet..


Wenn z.b. die Ausgabe in einer Tabelle erfolgt, will man ja das die Ausgabe in der Tabelle ist..


Was wäre nun wenn einer </td></tr></table> mit in die Datenbank einträgt? Nun wäre das Komplette Layout kaputt.


Um das zu verhinden, kann man folgenden Code Benutzen:


PHP:
<?PHP
$sql = "SELECT name FROM deinetabelle";
$result = mysql_query($sql);
$fetch = mysql_fetch_assoc($result);
echo htmlspecialchars($fetch['name']);
?>




Allgemeine Angriffe:


Um einen Allgemeinen Angriff zusätzlich vermeiden zu können, könnte man die Url also das was oben in der Adressleiste steht, zusätzlich auf bösen code untersuchen, dazu hab ich mal einen code rausgesucht, der das möglich macht:


PHP:
<?PHP
$cracktrack = $_SERVER['QUERY_STRING'];
$wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(', 'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20', 'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=', 'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(', 'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm', 'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(', 'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(', 'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall', 'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20', 'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite',
'%20like', 'like%20', '$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20', 'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow', 'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id', '/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python', 'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', '/usr/X11R6/bin/xterm', 'lsof%20', '/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml', 'file\://', 'window.open', '<SCRIPT>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe', 'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd', 'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history', 'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20', 'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con', '<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from', 'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php','<?', '?>', 'sql=');
$checkworm = str_replace($wormprotector, '*', $cracktrack);
if ($cracktrack != $checkworm && $crackpost != $checkworm)
{
$cremotead = $_SERVER['REMOTE_ADDR'];
$cuseragent = $_SERVER['HTTP_USER_AGENT'];
 
die( "Attack detected! <br /><br /><b>Dieser Angriff wurde erkannt und blockiert - This attack was recognized and blocked:</b><br />Your Ip-Adress was automatically banned - Ihre Ip-Adresse wurde automatisch gebannt:<br /><br />".$cremotead." - ".$cuseragent);
}
?>




einfach als tracker.php speichern, und in jede php datei ziemlich am Anfang includen.


Ihr könnt ihn testen, indem ihr folgendes macht: deinedatei.php?side=sql=


und schon wird die simulierte attacke erkannt.


Passwörter:


Nun, das ist wohl das wichtigste für alle Programmierer.


Wie kann man ein Passwort verschlüsseln? Nun da gibt es möglich mehrere varianten:


md5();
sha1();
crypt();
crc32();


Am meisten wird jedoch md5(); verwendet.


wie könnte man nun ein passwort verschlüsseln, und gegen Hackangriffe sichern? Nun auch hier hat mehrer möglichkeit.


Z.b. mit md5
PHP:
<?PHP
echo md5('password');
?>


bei allen andern einfach das md5 ersetzen.


Nun wei´ß ich aber das man immer ein passwort der länge 5 mit bruteforce hacken kann, deshalb habe ich mir was einfaches aber geniales überlegt.


man hängt an das passwort einen zusatz hin, das wenn es gecrackt wird, der hacker nur das falsche passwort bekommt.


ein beispiel:


PHP:
<?PHP
$anhang = 'f026s4xsd5da6d46';
echo md5('password'.$anhang);
?>




nun wie kann man das wieder prüfen? das ist auch ganz einfach:


PHP:
<?PHP
$anhang = 'f026s4xsd5da6d46';
$pw = md5('password'.$anhang);
if ($pw == md5('password'.$anhang))
{
// richtig
}
else
{
// falsch
}
?>


manche machen es dem Hacker noch schwerer indem sie einfach alle verschlüsselungen durchgehen, was ich eigentlich sehr effektiv ist, aber jedoch ein wenig umständlich im gegensatz der vorgehensweise mit dem vorigen script:


PHP:
<?PHP
$anhang = 'f026s4xsd5da6d46';
$pw = md5(sha1(crypt('password'.$anhang)));
if ($pw == md5(sha1(crypt('password'.$anhanf))))
{
// richtig
}
else
{
// falsch
}
?>

262 zeichen waren zuviel also nächster post dann

Bitte nicht antworten ist noch nicht fertig
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
?site=news per Switch ist keine elegante Lösung. Überleg mal du hast ca 100 Seiten oder sowas(ist oft schnell beinanda) Weist du, wieviel überflüssige Zeilen code du damit fabrizierst.
addslashes auf MySQL Code ist auch nich die feine Englische. wofür gibt es denn mysql_real_escape_string? Ich denke, MySQL wird selber am besten wissen, was eine Injection sein kann und was nicht.
PHP:
<?PHP
$sql = "INSERT INTO deinetabelle (deinfeld) VALUES ('".strip_tags($_POST['deinfeld'])."')";
$result = mysql_query($sql);
?>
Was bringt dir das? Damit kann ich wieder Injections starten. Aber keine ohne HTML :lol:
Die Idee mit deinen Allgemeinen Angriffen find ich lustig. Was ist, wenn du jetz einzelne Formulareingaben per GET übergibst und z.b. Messenger abfrags ?aim=true&icq=false dann bekommste einen "HACKERANGRIFF" weil &icq in der Liste steht... Oder wenn sich jemand so nennt, bzw etwas davo in seiner Emaiaddy hat o.ä.
deshalb habe ich mir was einfaches aber geniales überlegt.
Ich würd sagen, du bist nicht der 1. der was an ein PW anhängt, um es besser zu schützen.
BTW: Ich hab mir auch gerade was geniales überlegt: Wie wärs, wenn man das PW auf länge überprüft und nur PWs mit mindestens 6 Zeichen annimmt. Hmmm, genial :) Das schlag ich jetz mal in allen Foren vor. Vielleicht bringts jmd etwas.
Überarbeite das alles nochmal, oder lass es ganz bleiben. Was nützen einem Anfänger schon Infos, wenn sie unvollständig oder falsch sind?
So far. Greetz
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben