PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sicherheitsfunktion



Perishand
24.04.2010, 19:05
Einen schönen Abend.

Ich habe mir eben gedanken darüber gemacht, wie man Seiten sicherer machen kann.

Meine Idee ist es, alle möglichen Fehler oder halt injections zu erkenne und zu unterbinden.

Meine erste Idee war folgende:

Da man für eine XSS und für eine sqlinjection spezielle Zeichen braucht, wie beispielsweise <> / "" * - usw. habe ich mir gedacht, ich überprüfe alle GET und POST Variablen auf die Richtigkeit. Klar, manchmal will man auch solche Zeichen in diesen Parametern benutzen, jedoch nur selten.

So habe ich mir folgende Funktion ausgedacht, die bei jedem Start einer Seite durchlaufen wird:



<?php
function checkSafety()
{
foreach($_GET as $getParam)
if(!checkForSpecialChars($getParam))
Header("Location: index.php");

foreach($_POST as $postParam)
if(!checkForSpecialChars($postParam))
Header("Location: index.php");
}

function checkForSpecialChars($wordToCheck)
{
$whiteChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ1234567890";
$len = strlen($wordToCheck);

for($i=0;$i<$len;$i++)
{
$isWhite = false;

for($j=0;$j<62;$j++)
{
if($wordToCheck[$i]==$whiteChar[$j])
{
$isWhite = true;
break;
}

}

if(!$isWhite)
return false;
}
}
?>

Falls es so richtig ist und es auch sicher ist, würde ich mich über Feedback freuen.

Falls noch jemand Ideen hätte, bitte mir mitteilen, ich würde gerne ein paar Funktionen zusammen suchen, um möglichst viele Fehler zu vermeiden!

MfG

Snowman.de.117
24.04.2010, 19:54
Ich empfehle dir das Buch "PHP-Sicherheit PHP/MySQL- Webanwendungen sicher programmieren". Dort findest du direkt eine ganze Sammlung von geballten Wissen über die Sicherheit von Webanwendungen. Es geht auch auf eine Vielzahl von bekannten und vorallem neuen XSS Attacken ein.

Habe das vor ein paar Monaten von meinem Prof. empfohlen bekommen, kann es auch nur weiterempfehlen.

fred777
24.04.2010, 20:04
Naja escape_String() und htmlentities() tun es auch (man muss sie eben immer einfügen), wobei du nur GET und POST checkst, nimm lieber gleich alle REQUEST's.
Ich habe auch mal was dazu geschrieben: (allerdings noch nicht ganz fertig, gibt noch das ein oder andere..)


<?php
################################################## #######
# Intrusion Detection System
# --------------------------
#
# Description:
# Include this file into your php files like
#
# require_once(ids.php);
#
#
# It helps to detect and logs some webattacks:
# XSS,CSRF,JS Injection,RCE,SQL Injection
# by using a badlist
#
# You can add your own words to the forbidden array
#
#---------------------------------------------------
# powered by fred777 [fred777.de]
################################################## ######


#~~~~~~~~~~~~~~~~~ Configuration ~~~~~~~~~~~~~~~~~~~~~#

$logging = 1;
$logfile = "attack.txt";
$forbidden = array("from","'","union","select","+","0x","(",")",">","<","/");
$message = "You have an error in your sql syntax";

#~~~~~~~~~~~~~~~~~~~~~~ Vars ~~~~~~~~~~~~~~~~~~~~~~~~#

$ip = $_SERVER['REMOTE_ADDR'];
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$useragent = $_SERVER['HTTP_USER_AGENT'];
$date = date("d.m.Y H:i:s");
$logtext = "Attack : ".$date." - ".$ip." - ".$host." - ".$useragent;

#~~~~~~~~~~~~~~~~~~~~Logging ~~~~~~~~~~~~~~~~~~~~~~~#

function logging($logfile,$text) {
$fp = fopen($logfile,"a");
$size = filesize($logfile);
if($size >= 3000000) {
ftruncate($fp,0); }
fwrite($fp,$text);
fclose($fp);}

#~~~~~~~~~~~~~~~~~~ Hard-core ~~~~~~~~~~~~~~~~~~~~~#

foreach ($_REQUEST as $var) {
foreach($forbidden as $bad) {
if(@preg_match('/'.$bad.'/i',$var,$value)) {

echo $message;
if ($logging != 0) {
$text = "\n".$logtext." - ".$_SERVER['SCRIPT_NAME']." - ".$var."\n";
logging($logfile,$text);
}
exit;
}
}
}

?>



Der Nachteil bei dir ist, dass die Whitechars sich auch ändern können, Sonderzeichen for Example..

moppelito
24.04.2010, 20:09
@fred777 ... WOW Danke, ist auch für mich nützlich!
@Perishand wie Fred schon sagte alle Requests sind vorteilhafter!

EBFE
24.04.2010, 20:51
Ich weiß, das gibt es bei PHP und MySQL erst seit kurzem *hust* und hat deshalb noch nicht in alle Tutorials geschweige denn Boardsoftware wie WBB/vBulletin geschafft, aber ein Geheimtipp ist:
http://de.wikipedia.org/wiki/Prepared_Statement
siehe auch
http://php.net/manual/de/pdo.prepared-statements.php
http://www.goldmann.de/php-51-abstraktion-und-prepared-statements-mit-pdo_tipp_346.html

Verhilft nicht nur zu mehr Performance, sondern ist auch eine gute Abicherung gegen SQL Injections ;)

Perishand
24.04.2010, 21:02
Ersteinmal vielen dank an alle Poster!

Fred, besoders dir, das mit dem REQUEST hab ich in der Eile, in der ich diese Funktion gerade schreiben musste doch glatt total vergessen!

Ich werde mich weiter informieren und mir mal das Thema anschauen, was EBFE empfehlt, scheint sehr interessant zu sein in dem Datenbank zusammenhang!

Ich werde also weiter versuchen, einen besseren Schutz zu finden. Wer träumt nicht von der absoluten Sicherheit?

In diesem Sinne vielen dank!

Schlumpf2009
24.04.2010, 23:13
das hier ist auch noch einen blick wert auch für alle die nicht so 100% wissen wie wo wann was

SQL-Injection: Gefahr für Ihren Server (http://www.strassenprogrammierer.de/sql-injection-injektion-angriff_tipp_543.html)

Janiboy
24.05.2010, 09:36
@fred777: Das Script funktioniert hervorragend. Du hast ja geschrieben, es sei noch nicht ganz fertig und das Ein oder Andere fehlt nocht.

Was fehlt denn noch genau, wenn ich fragen darf? Nutze das Script schon testweise auf einer Website und es funktioniert top!

Danke dafür!

Macacity
24.05.2010, 11:10
ich kann EBFE nur zustimmen. Ich benutze die Prepared Statements schon seit einiger Zeit und sie sind einfach sicherer, wenn man sich das ansieht (http://de.wikipedia.org/wiki/Prepared_Statement), erkennt man auch relativ schnell den Grund.

echoslider
26.05.2010, 21:12
PHP Sicherheitssoftware CTXtra (http://www.ctxtra.org/)


die hatten mal nen source zum einbau in jede seite als standalone. das macht genau das was du willst. nur bissl einfacher.. die daten kann man dann dirkt in ne htaccess schreiben so das der jenige direkt geblockt wird.


/edit:


<?php
// Cracker Tracker Protection System
// Created by: Christian Knerr - www.cback.de
// phpBB Users: Please use our complete phpBB2 Mod!
// Version: 2.0.0
//
// License: GPL
//
//
// Begin CrackerTracker StandAlone
//

$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)
{
$cremotead = $_SERVER['REMOTE_ADDR'];
$cuseragent = $_SERVER['HTTP_USER_AGENT'];

die( "Attack detected! <br /><br /><b>Dieser Angriff wurde erkannt und blockiert:</b><br />$cremotead - $cuseragent" );
}

//
// End CrackerTracker StandAlone
//

?>

Janiboy
28.05.2010, 20:39
Geile Sache, danke!

Apex
28.05.2010, 20:45
Man könnte die Liste eigentlich unendlich lang erweitern. Irgendeinen Weg findet man immer!


//Edit: Vielleich könnteste solche Sachen wie "shell" und sowas verbieten für die shell32