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

Ajax seitiger PHP Code genug geschützt?

stenz

Mitglied
Hallo,
ich habe ein Formular welches per jQuery post eine Anfrage schickt. Der PHP Code schaut zuerst per isset nach ob überhaupt die gewünschten Variablen gesendet wurden, falls nicht wird man weitergeleitet auf die Startseite. Schützt die If Abfrage schon eigentlich vor ungewünschtem direkten Zugriff auf die Datei per Adressleite im Browserfenster?
Naja, danach werden alle POST Daten escaped und jeweils überprüft, ob bestimmte Werte eingeben worden sind.

Würde gerne wissen, ob mein Code direkten Zugriff auf die PHP Datei und auch SQL Injection und alles drumherum schützt.

PHP:
<?php   
 if(isset($_POST['contact_name']) and isset($_POST['contact_email']) and isset($_POST['contact_subject']) and isset($_POST['contact_message'])){        
$name = mysql_escape_string($_POST['contact_name']);        
$email = mysql_escape_string($_POST['contact_email']);        
$subject = mysql_escape_string($_POST['contact_subject']);        
$message = mysql_escape_string($_POST['contact_message']);        
$i = 0;            

echo "<?xml version=\"1.0\"?>\n";        
echo "<response>\n";        
echo "\t<mail>\n";                

/* Überprüfen ob richtige Werte übergeben worden sind */       
 if(is_string($name) and (preg_match('/^[a-zA-Z0-9 ÄÁÅĂÂĀĄĆČÇĈĎĐÉĚÊËÉĒĖĘĞĜĢĤÍÏĪÎIJĮĴĶĻĽŁĹÑŅŇŃÕÔÓÖŌŐŔŘȘŞŠŜŚȚŤŪÚŰÜŬŮÛŲÝŸŽŹŻØƏÆÞðþáäåāąâăčćĉçđďéëêēėęěĝģğĥíïīijÍÎİIîľļĵįķńñņňřŕóöôõōőšŝşśșțťłúüûŭūűůýÿžźżøæðųə]+$/', $name) == true) and (strlen($name) <= 50) and ($name != 'type your name'))
{        
}else{
            echo "\t\t<name>1</name>\n";
            $i = 1;        
}                

/* Überprüfen ob richtige Werte übergeben worden sind */        
if(is_string($email) and (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $email) == true) and (strlen($email) <= 50) and ($email != 'type your email address'))
{
 }else{
            echo "\t\t<email>1</email>\n";            
$i = 1;        
}                

/* Überprüfen ob richtige Werte übergeben worden sind */        
if(is_string($subject) and (strlen($subject) <= 150) and ($subject != 'type subject'))
{        
}else{
            echo "\t\t<subject>1</subject>\n";      
$i = 1;        
}                

/* Überprüfen ob richtige Werte übergeben worden sind */       
 if(is_string($message) and (strlen($message) <= 500) and ($message != 'type your message on us'))
{        
}else{ 
           echo "\t\t<message>1</message>\n";
            $i = 1;        
}            

if($i == 1){
            echo "\t\t<status>fail</status>\n";
            echo "\t</mail>\n";
            echo "</response>";
        }else{
            include 'db_login.php';
            $sql = "INSERT INTO `d013f578`.`mail` (`id`, `name`, `email`, `subject`, `message`) VALUES (NULL, '".$name."', '".$email."', '".$subject."', '".$message."');";
            $query = mysql_query($sql) or die;

          echo "\t\t<status>ok</status>\n";
            echo "\t</mail>\n";
            echo "</response>";
        }                
}else{
 
       header('startseite');        exit;    
}
?>
 
Ich denke das alleine reicht nicht. POST - Felder kann man leicht manipulieren bzw. per Tools erzeugen.
Ich wuerde mit Sessions arbeiten und bei jedem Ajax-Call zuerst checken, ob die Session gueltig ist.

Ausserdem kannst du um Emails zu validieren etc. auch auf die PHP Filter Funktionen zurueckgreifen. Ist meiner Meinung nach besser
als so ein Frickel Regex...

PHP: filter_var - Manual
 
Ich denke das alleine reicht nicht. POST - Felder kann man leicht manipulieren bzw. per Tools erzeugen.
Ich wuerde mit Sessions arbeiten und bei jedem Ajax-Call zuerst checken, ob die Session gueltig ist.


Diesen Ansatz verstehe ich ehrlich gesagt nicht. Post Daten kann man auch bei einem "Nicht-Ajax-Request" manipulieren. d.H. es reicht aus die Daten so zu behandeln als würdest du keinen Ajax Request absetzen. Natürlich musst du deine Responses im Fehlerfall und für die Ausgabe anpassen etc. aber eine Session?

Um den Zugriff über normale Requests zu verhindern kannst du mit
($_SERVER['HTTP_X_REQUESTED_WITH']) arbeiten.

als so ein Frickel Regex...

Damit hat Anusha vollkommen recht. Suche eine andere Lösung anstatt diesem RegEx gefrickel. Wenn du das trotzdem wirklich drin haben möchtest lager die Validierungsfunktionalitäten in eigene Funktionen aus oder schreibe eine Validator Klasse.

~spaceCookie
 
Diesen Ansatz verstehe ich ehrlich gesagt nicht. Post Daten kann man auch bei einem "Nicht-Ajax-Request" manipulieren. d.H. es reicht aus die Daten so zu behandeln als würdest du keinen Ajax Request absetzen. Natürlich musst du deine Responses im Fehlerfall und für die Ausgabe anpassen etc. aber eine Session? Um den Zugriff über normale Requests zu verhindern kannst du mit [/COLOR]($_SERVER['HTTP_X_REQUESTED_WITH']) arbeiten.
Naja, es ging mir hier um den "unerwuenschten direkten Zugriff", also das es nicht moeglich ist das Skript mit Daten zu fuettern oder aufzurufen, ohne sein Formular abgeschickt zu haben. Iich bin mal davon ausgegangen das meinte der TE) Ich wollte damit sagen, dass es moeglich ist direkt auf das Skript zuzugreifen, ohne dass man wirklich auf seiner Seite eine Aktion ausgefuehrt hat, die einen legitimen Ajax-Request zur Folge hat. Ich kann mir x-beliebige Seiten erstellen, die sowas machen. Muss nur dafuer sorgen dass die $_POST Felder vorhanden sind. Wenn ich aber beim Laden des Formulars nen Token erstelle und diesen dann im "Ajax Skript" per Session pruefe, dann kann ich doch sicher sein, dass sein Formular auch wirklich geladen wurde. Aber wenns wirklich nur um den Zugriff per Adressleiste geht.... dann wirds wohl stimmen :)
 
Zurück
Oben