Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Php-Formmailer (ohne Captcha) sicher gegen Header-Injection gestalten

Frage Entwicklung PHP

Mitglied: ovu-p86

ovu-p86 (Level 1) - Jetzt verbinden

11.12.2011, aktualisiert 22:42 Uhr, 9023 Aufrufe, 15 Kommentare

Hallo,

brauche ein Grundgerüst für einen Formmailer ohne Captcha der sicher gegenüber Header-Injektion ist und brauche euren Rat.

Hab mir ein Grüst mit Selfhtml Muster zusammengebaut. Leicht modifiziert.

Mein Hauptziel zunächst ist lediglich keine Spamschleuder zu sein. alles weitere kommt später.

Variation gegenüber dem Original:
- Hab Code und html getrennt
- Hab alle Angaben für den Header (Absendername, Absenderadresse, Betreff und Zieladresse) fest eingegeben. (Ist ok für mich, es wird zunächst keine Antwortmail geschickt)
- Name, eMail etc. werden ausschließlich im Mailtext übermittelt.

- Bei der Übergabe des Mailtext habe ich zusätzlich Leerzeilen am Anfang eingefügt.
-> Grund: Weiß nicht ob das stimmt. Da ja Mailheader und Text durch eine Leerzeile getrennt werden, könnte ein Böser ja im Mailtext ein "Backspace" eingeben und hätte so die Möglichkeit weiteren Code in den Header zu integrieren. (Bin ich paranoid oder ist das möglich?)


Frage: Ist der folgende Code gegen Header-Injektion sicher?



Kontaktformular.htm
01.
  
02.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
03.
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
04.
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"> 
05.
    <head> 
06.
        <title>Einfacher PHP-Formmailer</title> 
07.
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
08.
    </head> 
09.
    <body> 
10.
        <h1>Beispielformular</h1> 
11.
        <form action="mailer.php" method="post"> 
12.
            <!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. --> 
13.
            <dl> 
14.
                <dt>Ihr Name:</dt> 
15.
                <dd><input type="text" name="Name" /></dd> 
16.
                <dt>Ihre E-Mail:</dt> 
17.
                <dd><input type="text" name="E-Mail" /></dd> 
18.
                <dt>Sie können:</dt> 
19.
                <dd><input type="checkbox" name="kannwas[]" value="HTML" />HTML <input type="checkbox" name="kannwas[]" value="PHP" />PHP</dd> 
20.
                <dt>Sie sind:</dt> 
21.
                <dd><input type="radio" name="sexus" value="M" />Mann <input type="radio" name="sexus" value="Frau" />Frau</dd> 
22.
                <dt>Sie mögen:</dt> 
23.
                <dd><select name="Browser"><option value="Opera">Opera</option><option value="Mozilla">Mozilla</option></select></dd> 
24.
                <dt>Nachricht:</dt> 
25.
                <dd><textarea name="Nachricht" rows="3" cols="20"></textarea></dd> 
26.
            </dl> 
27.
            <!-- Ende der Beispielangaben --> 
28.
            <p> 
29.
            <input type="submit" value="Senden" /> 
30.
            <input type="reset" value="Zurücksetzen" /> 
31.
            </p> 
32.
        </form> 
33.
    </body> 
34.
</html>

Mailer.php
01.
  
02.
<?php 
03.
 
04.
/** 
05.
 * Konfiguration  
06.
 *  
07.
 * Das Skript bitte in UTF-8 abspeichern (ohne BOM). 
08.
 */ 
09.
  
10.
// Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden? 
11.
// Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben! 
12.
$urlDankeSeite = 'http://www.domain.de/danke.htm'; 
13.
 
14.
// Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen? 
15.
$trenner = ":\t"; // Doppelpunkt + Tabulator 
16.
 
17.
/** 
18.
 * Ende Konfiguration 
19.
 */ 
20.
 
21.
 
22.
if ($_SERVER['REQUEST_METHOD'] === "POST") { 
23.
 
24.
	$header = array(); 
25.
	// ++++ hier fest eintragen Absendername z.B Kontaktformular  Absenderadresse z.B. Formmailer ++++++ 
26.
	$header[] = "From: ".mb_encode_mimeheader('Kontaktformular', "utf-8", "Q")." <".'Formmailer'.">"
27.
	$header[] = "MIME-Version: 1.0"
28.
	$header[] = "Content-type: text/plain; charset=utf-8"
29.
	$header[] = "Content-transfer-encoding: 8bit"
30.
	 
31.
	 
32.
    $mailtext = ""
33.
 
34.
    foreach ($_POST as $name => $wert) { 
35.
        if (is_array($wert)) { 
36.
		    foreach ($wert as $einzelwert) { 
37.
			    $mailtext .= $name.$trenner.$einzelwert."\n"
38.
39.
        } else
40.
            $mailtext .= $name.$trenner.$wert."\n"
41.
42.
43.
 
44.
	$mailtext = "\n"."\n"."Sender IP".$trenner.$REMOTE_ADDR."\n".$mailtext
45.
 
46.
 
47.
    mail( 
48.
    	// ++++ hier feste Zieladresse eintragen xxx@xxx.xx ++++ 
49.
		'name@domain.de', 
50.
		// ++++ hier festen Betreff eingeben ++++++++++ 
51.
    	mb_encode_mimeheader('Meldung vom Kontaktformular', "utf-8", "Q"),  
52.
		$mailtext
53.
    	implode("\n", $header
54.
    ) or die("Die Mail konnte nicht versendet werden."); 
55.
    header("Location: $urlDankeSeite"); 
56.
    exit
57.
58.
 
59.
header("Content-type: text/html; charset=utf-8");

Ich weiß, ich muß noch was einbauen um selber nicht zugespamt zu werden. Das mache ich wenn das Grundgerüst soweit bzgl. Spamschleuder stimmt.

Über weitere Tips bin ich dankbar!!



Gruß
Uwe
Mitglied: exchange
12.12.2011 um 14:47 Uhr
Hallo Uwe,
ich gehe meistens hin und setze noch ein Textfeld mehr in den Post. Dieses Textfeld kannst Du mit css verstecken und im php Code prüfen ob das ausgefüllt ist. Wenn das ausgefüllt ist, war es definitiv kein Mensch.
Bisher hat das immer wunderbar funktioniert.



Gruß
Heiko
Bitte warten ..
Mitglied: nxclass
12.12.2011 um 14:54 Uhr
sieht gut aus ... finde nur das "Sie können: ... Sie sind: ... Sie mögen:" etwas eigenartig.

Die Umleitung auf die "Danke" Seite ist auch gut - das sollte ein "dauer reload" des Clients verhindern.
Was passiert eigentlich am Ende deines PHP Scriptes wenn $_SERVER['REQUEST_METHOD'] nicht "POST" ist ?

Wichtig ist, dass Du die E-Mail Adresse des Clients nicht einfach in dein E-Mail Header schreibst. Dadurch kann man noch am meisten Blödsinn anrichten.
Bitte warten ..
Mitglied: ovu-p86
12.12.2011 um 16:44 Uhr
Hallo exchange,hallo nxclass,

danke für die Einschätzung und Hinweise.

@nxclass
Hast recht, der Text in der html ist bescheuert. Dient zunächst nur zum Testen und ist so der Vorlage aus Selfhtml Muster übernommen.

"Was passiert eigentlich am Ende deines PHP Scriptes wenn $_SERVER['REQUEST_METHOD'] nicht "POST" ist ?"
Hast recht. Nichts.

Nun gut, mir war zunächst eure Einschätzung bzgl. Header-Injection bzw. Spamschleuder wichtig. Da das offensichtlich ok ist, lohnt es sich weiter an dem Code zu basteln.

Geplant ist jetzt:
1. Umsetzung des Vorschlags von exchange, also verstecktes Feld und Prüfroutine
2. Umsetzung von nxclass Hinweis, also eine Aktion wenn nicht Post.
3. Gültigkeitsprüfung der eMail,
4. Def. von Pflichtfeldern

Bin am Überlegen doch wieder eine Gesmtphp zu machen (Affenformular).
Wichtig ist mir, daß wenn ein Fehler auftritt der Nutzer die vorhandenen Daten nicht wieder neu eingeben muß. Denke das geht am einfachsten mit einem Affenformular.

Fragen:
- erhöht eine Gesamtphp (HTML und php in einem) die Manipulationsgefahr?
- Was schlagt ihr vor, was soll ich machen, wenn "nicht POST"
- habt ich ein simples Beispiel für eine Prüfroutine eines hidden Feldes. Insbesondere wie und an welcher Stelle baue ich das in meinen obigen Code ein? (Wenn ich das wüßte könnte ich das für meine weiteren geplanten Prüfungen adaptieren.)

Mein Problem, hab so gut wie keine Ahnung von php und muß mich mühsam mit try and error durchwursteln, deshalb sind Hinweise extrem hilfreich für mich.

Freue mich über eure Hilfe.



Gruß
Uwe
Bitte warten ..
Mitglied: nxclass
12.12.2011 um 19:23 Uhr
erhöht eine Gesamtphp (HTML und php in einem) die Manipulationsgefahr?
... es erhört die Gefahr einen Fehler zu übersehen und es mach das Script schwer zu warten, wenn eine Änderung gemacht werden soll.

Was schlagt ihr vor, was soll ich machen, wenn "nicht POST"
... wenn nicht POST - dann hat jemand versucht dein PHP E-Mail Script manuell aufzurufen (auf unprofessionelle weise, denn es geht auch mit POST manuell aufzurufen) - Umleitung auf die Startseite

Beispiel für eine Prüfroutine eines hidden Feldes
... finde ich sinnlos, da jeder HTMLQuellcode lesen kann und wer echt böse drauf ist dem hindert das nicht.

Insbesondere wie und an welcher Stelle baue ich das in meinen obigen Code ein?
wenn Du echt alles in eine Datei packen willst, dann mache die ganze Prüf-Logik und E-Mail senderei am Anfang deines Scriptes

Schau mal nach Regulären Ausdrücken, um zB. die E-Mail Adressse zu prüfen, ebenso ist es nie falsch auch die Domain alleine mal abzufragen ob diese existiert.
hab da mal bissel gesucht (man findet massenhaft dazu): http://www.devshed.com/c/a/PHP/Email-Address-Verification-with-PHP/5/
Bitte warten ..
Mitglied: ovu-p86
14.12.2011 um 00:02 Uhr
Hallo nxclass,

erstmal vielen Dank für deine Hinweise.

Melde mich erst jetzt wieder, da ich als "nicht" php-Fachmann viel Zeit brauche das Ganze aufzubauen, hab dadurch aber viel dazugelernt.

Den Script hab ich jetzt weiterentwickelt. Funktioniert auch. Neu ist jetzt:
1. Alles in einer Datei
2. Abfrage nach Pflichtfeldern
3. Prüfung der eMail-Adressen Syntax
4. Affenformular -> Fehlermeldungen + Bestehen bleiben der alten Eingaben

Wie gesagt mein Hauptanliegen ist "nicht als Spamschleuder" mißbraucht zu werden.
(Weiteren Spam-Schutz bezogen auf mich selber baue ich später noch ein, sowie die in deinem Link beschriebenen Mechanismen z.B. "fsockopen ()". Aber zur Zeit bin ich schon mal froh, daß mein beschränktes Ding funktioniert)

Hier nochmal meine Primitiv-Strategien nicht als Spam-Schleuder mißbraucht zu werden:
- Zieladresse fest eingegeben
- alle Header-Angaben (Absendername, Absenderadresse und Betreff) fest eingegeben.
- Name, eMail etc. werden ausschließlich im Mailtext übermittelt, nicht weiter benutzt.
- "action" im HTML-Teil fest eingegeben und nicht über $_SERVER


Würde mich freuen, wenn du mal über den Code guckst.


Fragen:

1. Vermindern meine o.g. Primitiv-Strategien Header-Injection?
2. Siehst du noch Ansatzpunkte für Spam-Schleuder, wenn ja welche?
3. Was kann ich machen, um dem weiter vorzubeugen?
4. Da ja der Header durch Variablen ($Header) erzeugt wird, macht es Sinn die gesamte "mail" (Zeile 52) - außer natürlich dem "$mailtext" fest einzugeben? (Wär ja für mich ok. Kein Komfort-Verlust, da ich ja eh alles irgendwo definiere und die Flexibilität nicht brauche)
5. Ab Zeile 89, wo ich ich ja die Werte im Formular z.T. zurückgebe, ist das besser mit "htmlentities" oder "htmlspecialchars"?

Hier jetzt die neue formular.php
(da wo feste Eingaben gemacht werden ist im Kommentar jeweils )

01.
<?php 
02.
 
03.
 // KONFIGURATION  (Das Skript bitte in UTF-8 abspeichern (ohne BOM).) 
04.
   
05.
// Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden? 
06.
// Eingabe zum funktionieren des Scipts notwendig 
07.
$urlDankeSeite = 'http://www.name.de/danke.htm'
08.
// Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen? 
09.
$trenner = ":\t"; // Doppelpunkt + Tabulator 
10.
// Angabe der Pflichtfelder 
11.
$pflichtfelder = array('Name','Nachricht','email'); 
12.
// Ende Konfiguration 
13.
  
14.
   
15.
if ($_SERVER['REQUEST_METHOD'] === "POST") { 
16.
 
17.
// ----------------------- Fehlerprüfung ---------------------------------------------------------------------------------	 
18.
	$fehler = array(); 
19.
	$fehler = NULL; 
20.
 	 
21.
	// Pflichtfelder ausgefuellt 
22.
	foreach ($pflichtfelder as $feld) { 
23.
	$key = str_replace(" ","",$_POST[$feld]); 
24.
	if(strlen($key) < 1) {$fehler[] = "Pflichtfeld -".$feld."- nicht ausgefüllt."."\n"; }} 
25.
	 
26.
    // Email pruefen 
27.
	$key = str_replace(" ","",$_POST['email']); 
28.
	if(strlen($key) > 1) {	 
29.
				     	  	// Domain min. 2, max. 6 Zeichen lang, ggf. ändern 
30.
    if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$", $_POST['email'])) { 
31.
	$fehler[] = "bitte eMail-Adresse richtig eingeben."."\n";}} 
32.
	 
33.
// ------------------------ wenn kein Fehler -> jetzt senden -------------------------------------------------------------- 
34.
if(strlen($fehler) < 1) { 
35.
	$header = array(); 
36.
	$header = NULL; 
37.
// ++++ hier fest eintragen Absendername z.B Kontaktformular  Absenderadresse z.B. Formmailer +++++++++++++ 
38.
	$header[] = "From: ".mb_encode_mimeheader('Kontaktformular', "utf-8", "Q")." <".'Formmailer'.">"
39.
	$header[] = "MIME-Version: 1.0"
40.
	$header[] = "Content-type: text/plain; charset=utf-8"
41.
	$header[] = "Content-transfer-encoding: 8bit"
42.
	 
43.
    $mailtext = ""
44.
    foreach ($_POST as $name => $wert) { 
45.
        if (is_array($wert)) {foreach ($wert as $einzelwert) {$mailtext .= $name.$trenner.$einzelwert."\n";} 
46.
        } else
47.
            $mailtext .= $name.$trenner.$wert."\n";}  
48.
49.
 
50.
	$mailtext = "\n"."\n"."Gesendet".$trenner.date("D, d.n.Y - H:i:s (T)")."\n"."Sender IP".$trenner.$REMOTE_ADDR."\n".$mailtext
51.
 
52.
    mail( 
53.
// ++++ hier feste Zieladresse eintragen xxx@xxx.xx +++++++++++++++++++++++++++++ 
54.
		'name@name.de'
55.
// ++++ hier festen Betreff eingeben ++++++++++++++++++++++++++++++++++++++++++++ 
56.
    	mb_encode_mimeheader('Meldung vom Kontaktformular', "utf-8", "Q"),  
57.
		$mailtext
58.
    	implode("\n", $header
59.
    ) or die("Die Mail konnte nicht versendet werden."); 
60.
    header("Location: $urlDankeSeite"); 
61.
    exit
62.
}	 
63.
64.
 
65.
header("Content-type: text/html; charset=utf-8"); 
66.
?> 
67.
 
68.
 
69.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
70.
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
71.
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"
72.
    <head> 
73.
        <title>Einfacher PHP-Formmailer</title> 
74.
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
75.
    </head> 
76.
    <body> 
77.
	<h1>Beispielformular</h1> 
78.
<!-- ++++++++++++ hier den Dateinamen der *.php fest eingeben +++++++++++++ -->  
79.
        <form method="POST" action="formular.php">  
80.
            <!-- Hier werden die Fehler-Meldungen ausgegeben. Umlaute etc. werden angepasst --> 
81.
			<?php  
82.
			echo "<ul>"
83.
			foreach ($fehler as $wert){echo "<li>"; echo htmlentities($wert); echo "</li>";} 
84.
			echo "</ul>"
85.
			?> 
86.
           <!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. --> 
87.
            <dl> 
88.
                <dt>Ihr Name:</dt> 
89.
                <dd><input type="text" name="Name" value="<?php echo htmlentities($_POST['Name']); ?>"></dd> 
90.
                <dt>Ihre E-Mail:</dt> 
91.
                <dd><input type="text" name="email" value="<?php echo htmlentities($_POST['email']); ?>"></dd> 
92.
                <dt>Sie können:</dt> 
93.
                <dd><input type="checkbox" name="kannwas[]" value="HTML" />HTML <input type="checkbox" name="kannwas[]" value="PHP" />PHP</dd> 
94.
                <dt>Sie sind:</dt> 
95.
                <dd><input type="radio" name="sexus" value="M" />Mann <input type="radio" name="sexus" value="Frau" />Frau</dd> 
96.
                <dt>Sie mögen:</dt> 
97.
                <dd><select name="Browser"><option value="Opera">Opera</option><option value="Mozilla">Mozilla</option></select></dd> 
98.
                <dt>Nachricht:</dt> 
99.
                <dd><textarea name="Nachricht" rows="3" cols="20"><?php echo htmlentities($_POST['Nachricht')]; ?></textarea></dd> 
100.
            </dl> 
101.
            <!-- Ende der Beispielangaben --> 
102.
            <p> 
103.
            <input type="submit" value="Senden" /> 
104.
            <input type="reset" value="Zurücksetzen" /> 
105.
            </p> 
106.
        </form> 
107.
    </body> 
108.
</html>

Freue mich über Hilfe!
Auch nur teilweise.

Ich werde weiter berichten.


Gruß
Uwe
Bitte warten ..
Mitglied: nxclass
14.12.2011 um 08:25 Uhr
Vermindern meine o.g. Primitiv-Strategien Header-Injection?
... ich glaube da bist sicher.

Siehst du noch Ansatzpunkte für Spam-Schleuder, wenn ja welche?
nein - obwohl man sich ggf noch dem eigentlichen E-Mail Text annehmen sollte - spätestens wenn es darum geht den E-Mail Text wieder anzuzeigen.

macht es Sinn die gesamte "mail" (Zeile 52) ... fest einzugeben?
das ist natürlich Dir überlassen - aber es ist nie falsch seinen Code gut lesbar / nachvollziehbar zu gestalten.

Ab Zeile 89, wo ich ich ja die Werte im Formular z.T. zurückgebe, ist das besser mit "htmlentities" oder "htmlspecialchars"?
s.o. - beides ! , da man in den E-Mail auch so etwas wie:
01.
</textarea> 
02.
<script type="javascrip"> 
03.
/* böses Javascript */ 
04.
</script> 
05.
<textarea>
eingeben kann. Aber da der E-Mail Text nicht permanent auf deiner Seite angezeigt wird (denke ich mal) - wie in einem Blog - sehe ich da auch keine weiteren Probleme.
Bitte warten ..
Mitglied: ovu-p86
02.01.2012 um 23:52 Uhr
Hallo nxclass,

erstmal ein "glücklichmachendes" Neues Jahr.

Danke für die Antworten. Hast mir mit deinen Antworten die Sicherheit gegeben überhaupt weiterzumachen.
Für einen Anfänger bereiten insbesondere die Fragen der "Einschätzung", aufgrund fehlender Erfahrung, Probleme.
Inzwischen bin ich süchtig nach "php".

Hab noch massiv weitergemacht, komme von Hundertsten ins Tausendendste. Hatte vorher 0-Ahnung von php, aber viel dazugelernt. Der Script ist soweit fertig.

Kurzer Hinweis:
War geschockt. Bei meinem Provider 1&1 war noch PHP Ver. 4.4.9 eingestellt mit "register_globals = on". Mein ganzer $_Post-Script wäre ggf. ins Leere gelaufen. Hab jetzt in der .htaccess auf Ver. 5.2.17 umgestellt, "register_globals" sind automatisch "off". (Hab ich auch mit phpinfo() überprüft)

Hab aber nochmal prinzipielle Fragen:


Injection-Gefahr:
So wie ich das verstehe, besteht die Hauptgefahr bei der Rückgabe der Eingaben in das (Affen)-Html-Formular, wo ggf. Schadcode erzeugt werden kann.

Frage 1:
a) - reicht z.B. folgende Maskierung aus?
b) - ist "htmlentities" nicht weiterreichender als "htmlspecialchars"?
c) - ist nicht evtl. auch das Zeichen ' gefählich? Das wird durch die "html....( )" aber nicht maskiert.
d) - schieße ich mir mit "stripslashes" evtl. ein Eigentor?

01.
<dt>* Ihr Name:</dt> 
02.
<dd><input type="text" name="Name" value="<?php echo htmlentities(stripslashes($_POST['Name']), ENT_QUOTES, 'UTF-8'); ?>"></dd>
Frage 2:
Prinzipielle Frage:
Muß innerhalb des vorangehenden Prüflogik "php-Codes" ggf. auch maskiert werden um keine Schadsyntax zu erzeugen.
(Es wird allerdings vorher nie "echo" oder ähnliches benutzt).
Kann in einem vorangehenden "php-Teil" überhaupt Schadsyntax erzeugt werden?

Frage 3:
Ich habe zwar "register_globals" auf "off".
a) - Aber macht folgender Code trotzdem Sinn?
b) - Kommt dann nichts anderes mehr durch?
c) - Sollte ich bei den "methoden" noch was ergänzen?

(Hab mich testweise mal selber mit "GET" angegriffen, funktioniert soweit)
01.
// prüfen ob über andere Methoden versucht wurde etwas zu übermitteln (falls ja, wird es als Fehlermeldung gespeichert) 
02.
// und die Daten werden gelöscht 
03.
 
04.
$methoden = array('GET','COOKIE','SESSION'); 
05.
foreach ($methoden as $methode) { 
06.
	if (isset(${_.$methode})) { 
07.
		foreach (${_.$methode} as $feld => $wert) { 
08.
			$_POST['fremd'] .= "-> ".$methode."-Versuch - zusätzl. Feld: ".$feld." - mit Wert: ".$wert." ";  
09.
			unset(${_.$methode}['$feld']);};};} 
10.
 
11.
// nur wenn gepostet starten   
12.
	if ($_SERVER['REQUEST_METHOD'] === "POST") { ......... 
13.
 
14.
        usw.
Frage 4:
Besteht die Möglichkeit durch "überlange" Eingaben im "Formularfeld" einen Fehler zu erzeugen, der ausgenutzt werden kann?
(Hab ich mal in einem Artikel gelesen. Finde ihn aber nicht mehr)

Sind viele Fragen.
Freue mich natürlich über Hilfe!
Auch nur teilweise oder in Etappen.


Gruß
Uwe
Bitte warten ..
Mitglied: nxclass
04.01.2012 um 11:32 Uhr
Frage 1

c) - ist nicht evtl. auch das Zeichen ' gefählich? Das wird durch die "html....( )" aber nicht maskiert.
d) - schieße ich mir mit "stripslashes" evtl. ein Eigentor?
das könnte insbesondere bei " passieren
01.
addslashes(  htmlentities($_POST['Name']) ) 
02.
// oder auch 
03.
addslashes(  htmlentities( strip_tags($_POST['Name']) ) )
Frage 2
nein - und ja wenn man Befehle wie exec oder die Backticks nutzt ( Shell aufrufe )

Frage 3
die super-globalen $_POST, $_GET ... sind je nach Umgebung immer gesetzt, auch wenn diese leer sind.
Wenn Du alles was über $_GET kommt loggen willst, wird das hässlich - denke doch mal nach was passiert wenn Google deine Webseite indizieren will.

Grundsätzlich gilt: "Daten welche vom Client gesendet werden darf man nicht vertrauen" .. das gilt auch für die $_SERVER Variable, zB mit dem Referer oder Agent

Frage 4
das sind dann richtige Bugs im Server und/oder der Script Sprache - und ja es gibt so paar Tricks mit speziellen Steuerzeichen.
Bitte warten ..
Mitglied: ovu-p86
05.01.2012 um 00:33 Uhr
Hallo nxclass,

danke für die Antworten.

Antwort zu Frage 1:

"striptags" wäre wahrscheinlich das Sicherste. Trau ich mich aber nicht ran, weil ich Bedenken habe, daß die vom Nutzer übermittelte Nachricht ggf. zu sehr zerstört wird. "addslashes" ist für mich auch nicht ideal, da der Nutzer ggf. irritiert ist, wenn das Affen-Formular im Fehlerfalle an den Nutzer zurückgeworfen wird und er auf einmal die \ sieht.

Wäre es eine Lösung das ' durch ein " zu ersetzen (irritiert nicht so, außerdem benutzt das ' eh nur ein "Böser". (Durch das vorangehende "htmlentities" ergibt sich dann im HTML "&quot;" und für den Nutzer erscheint ein " )

Lösungsvorschlag:
01.
<dd><input type="text" name="Name" value="<?php echo htmlentities(stripslashes($_POST['Name']=str_replace("'", "\"", $_POST['Name'])), ENT_QUOTES | ENT_XHTML, 'UTF-8'); ?>"></dd>
1a - Ist das ok?
1b - Muß ich nochmehr rausfiltern, was "htmlentities" nicht rausfiltert, aber gefährlich werden könnte?
1c - Warum wird das ' -Zeichen eigentlich nicht autom. durch php berücksichtigt, wenn es gefährlich werden kann. Wäre doch mal eine Anregung.


Antwort zu Frage 2:

Bin froh, daß ich innerhalb des "php_codes" nicht auch noch maskieren muß. Befehle wie "exec", "Backticks" nutze ich nicht. (das ist genau so eine Frage die mich verunsichert hat und mich lange verfolgt hätte)

Antwort zu Frage 3:

Ehrlich gesagt habe ich das noch nicht richtig verstanden.
3. - Meinst du, daß ich zu viel Meldungen bekomme, oder daß es fatal wäre alle "$_GET" zu löschen?
Habe das jetzt so modifiziert, daß nicht mehr prinzipiell alles, sondern nur das, was einen bei mir vorhandenen Feldnamen hat, ge"unset"et wird.

(Das array "$alle_felder" (beinhaltet alle bei mir vorhandenen Feldnamen) habe ich sowieso)
01.
if (in_array($feld, $alle_felder)) {unset(${_.$methode}['$feld'];}

Antwort zu Frage 4:

Kann mich nur noch grob erinnern. Irgendwie war das was mit ^ Eingabe im Formular, Dadurch wurde die Zeichenkette unendlich oft wiederholt. Weiß aber nicht mehr ob das zu einem Fehler im "PHP"- oder im "HTML"-Code geführt hat.
4 - Wäre es sinnvoll im "php-Code" am Anfang die Länge von allen "$_POST" prinzipiell auf ein normales Maß zu kürzen. Oder ist es dann schon zu spät?

Tut mir Leid, das ich dich wieder nerve.
(Problem ist ja, daß wenn ein Beitrag älter als 1 Tag ist, andere nicht mehr aktuell reingucken und antworten. Aber ich denke für die, in der Zukunft "Google'nden", werden deine Antworten (neben vor allem mir natürlich) auch hilfreich sein)
Danke.


Gruß
Uwe
Bitte warten ..
Mitglied: nxclass
05.01.2012 um 09:45 Uhr
4.
allg. brauchst Du dir keine sorgen machen über den Inhalt dieser Variablen, sollte jemand versuchen dir 10 GByte an POST Daten zu senden, dann wird er wohl entweder schon dein Server beim Empfang der Daten lahmlegen (was nicht passieren dürfte) oder er bekommt einen Timeout Fehler vom Server und dein Script wird gar nicht erst ausgeführt.

3.
s. 4. - solange Du nicht auf den Wert in GET zugreifen musst, kann da drin stehen was will, dass braucht dich nicht zu kümmern

2.
... kann ich Dir keine Antwort geben (Frage fehlt)

1.
Die ' werden wohl nicht ersetzt, weil diese im HTML Code kein Problem sind, wenn man sich an den Standard hält. Die " werden natürlich ersetzt, weil diese sonnst deine HTML-Attribute (name="wert") stören würden.
schau mal nach: 'magic_quotes_gpc'
in den meisten fällen reicht:
01.
nl2br( htmlentities( ) ); // für HTML Inline Code 
02.
htmlentities( ); // für HTML Attribut Inhalt
Bitte warten ..
Mitglied: ovu-p86
06.01.2012 um 00:52 Uhr
Hallo nxclass,

wieder mal, danke für die Antworten.
2 Fragen noch, dann setze ich den "Haken".

Frage 1:
Deine Antwort auf vorangehende Frage 4:
Aber würde ich meinen Provider und mich, nicht zumindest präventiv, schützen, wenn ich im am Anfang des "php-Prüf-Code" die Länge von allen "$_POST" prinzipiell auf ein normales Maß kürze (z.B. 1000). Oder ist es dann schon zu spät?

Frage 2:
Ich würde gerne auch in der "mail-Funktion" selbst-definierte Variablen nutzen. Vorteil wäre, daß ich den Script universeller gestalten kann, und nur am Anfang alles einmal definieren muß und mich um den Rest (wenn es geprüft funktioniert) nicht mehr kümmern muß.

Bisher hab ich die wichtigen "To" und den "Betreff" aus Angst fest verdrahtet (ist aber unbequem).
Also:
01.
mail('name@name.de', mb_encode_mimeheader('z.B Meldung vom Kontaktformular', "utf-8", "Q"), $mailtextform, implode("\n", $header)
(Eigentlich erübrigt sich die Frage, da ich bei "$header" auch vorher "selbst definiere".)
Zur Sicherheit nochmal die "prinzipielle" Frage:

2a. - Erhöht es die Gefahr, wenn ich statt "Festverdrahtung" "intern definierte Variablen" nutze?
Also z.B. so:
01.
$an = "name@name.de"; $betreff = "Meldung vom Kontaktformular"
02.
mail($an, mb_encode_mimeheader($betreff, "utf-8", "Q"), $mailtextform, implode("\n", $header)
2b. - Kann da jemand in die "selbst definierten" Variablen von außen eingreifen?
(das Ganze ist ein "Affenformular", ich entnehme nichts einer Datenbank)


Gruß
Uwe
Bitte warten ..
Mitglied: nxclass
06.01.2012 um 08:32 Uhr
Frage 1
Wenn die Daten in $_WASAUCHIMMER gespeichert sind, wurden diese natürlich bereits vom Server empfangen und liegen im Speicher. Nur wenn Du Probleme hast mit deinem Speicher Verbauch wäre das sinnvoll.

Frage 2
2a
Das ist völlig Egal - spätestens beim mail Funktionsaufruf werden die Parameter zu einer Variablen. Es ist durchaus sinnvoll, zB könnte man solche Festen Zeichenketten auch auslagern in ini Dateien oder sogar in po oder mo Dateien zur Übersetzung.

2b
Nein - das wäre schlimm, wenn man nicht mal seinen eigenen Variablen trauen könnte. Einzige Möglichkeit ist, wenn durch die Session Variablen gesetzt/gespeichert werden, aber diese können auch nur schwer vom Client manipuliert werden.
Bitte warten ..
Mitglied: ovu-p86
09.01.2012 um 03:22 Uhr
Hallo nxclass,

danke für die Antworten und deine "Ausdauer" für die vielen, wahrscheinlich die für einen Kenner "selbstverständlichen" Fragen.
Danke vor allem dafür, daß du immer "konkret" auf meine "dummen" Fragen geantwortet hast.

Ist hier, (obwohl immer noch das qualitativ beste Forum) nicht selbstverständlich. Es gibt genug "Antwort-Typen" die lediglich "Kommentare", aber keine "konkreten Antworten" geben. (machen die das um im "Ranking" hochzusteigen?).

Warum melde ich mich erst so spät :
Mein nächstes "PHP-Projekt" ist, zu prüfen, ob die empfangene Anfrage vom meinem eigenem Formular stammt. Zu dieser Prüfung finde ich im "Internet" keine eindeutigen Antworten. (Hab aber bisher selber keine eindeutige Lösungsmöglichkeit gefunden, deshalb)

Also Danke nochmal für deine weiterhelfenden, konkreten Antworten.
So, und jetzt setze ich bei dem Beitrag einen "Haken".


Danke

Gruß
Uwe
Bitte warten ..
Mitglied: nxclass
09.01.2012 um 08:52 Uhr
Also Danke nochmal für deine weiterhelfenden, konkreten Antworten.
immer gerne

machen die das um im "Ranking" hochzusteigen?
na macht doch jeder - und damit das nicht so aussieht als ob ich mit diesem Kommentar auch NUR einen Punkt erhalten will ...

ob die empfangene Anfrage vom meinem eigenem Formular stammt
... gebe ich dir mal einen Link mit: http://php.net/manual/de/reserved.variables.server.php ... und den Hinweis: HTTP_REFERER (Wichtig: Beschreibung lesen - erst recht den letzten Satz)
Bitte warten ..
Mitglied: ovu-p86
09.01.2012 um 11:02 Uhr
Hallo nxclass,

jeder?, du bist definitiv nicht "jeder". Dazu hast du immer zu konkret geantwortet.

Na ja, es ist wohl nicht so einfach festzustellen, ob die Eingaben vom eigenen Formular stammen.
Bekanntermaßen kann man dem "HTTP_REFERER" nicht trauen (Das wär ja wunderbar, die Lösung).

Deshalb suche ich ja auch nach einer validen Lösung. Das Internet strotzt vor vermeintlichen. Antworten. Aber die bisher Gesehenen sind immer "relativ". Keine ist bisher eindeutig bzw. (auf den ersten Blick) nicht manipulierbar.

Ich guck bzw. versuchs weiter.
Nochmal ein Danke für die Antworten.


Gruß
Uwe
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (15)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...