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

Sonderzeichen umwandeln HTML injection verhindern

Frage Entwicklung HTML

Mitglied: Sapzero

Sapzero (Level 1) - Jetzt verbinden

28.09.2009 um 09:43 Uhr, 8884 Aufrufe, 9 Kommentare

Hi,
ich will meine Seite sicher vor Angriffen machen, da soll man ja für gewöhnlich htmlspecialchars() verwenden.
Jedoch weis ich nicht genau was ich alles beachten muss bei der Versendung eines Formulars und dann bei dem einfügen in eine Datenbank.

Beispiel:
01.
$nachricht=htmlspecialchars($_POST('nachricht'));
1. Sollte ich das Abspeichern in eine andere Variablen hier $nachricht verhinden und direkt dann z.B. in die Datenbank eintragen oder ist der Gebrauch der $nachricht Variable nicht ganz so tragisch?

2. Würde der Code ausreichen um die Seite sicher zu machen?
3. Muss ich noch etwas beim Einfügen in die Datenbank beachten und auch bei der Ausgabe?
4. Sollte ich auch auch andere Funktionen wie stripslasches(), trim(), usw. benutzen? Wenn ja welche?

Würd mich freuen wenn jemand behilflich sein könnte und mir sagen würde was ich alles bei so etwas beachten sollte.

Gruß

Sapzero
Mitglied: Arano
28.09.2009 um 11:48 Uhr
Hallo Sapzero

du solltest dir auf jeden Fall einmal die folgenden beiden Seiten zum Thema SQL-Injection durchlesen:
Im diesem Sinne wird dann auch diese Seite noch einmal interessant:

Zu beachten gilt immer:
Alle Benutzereingaben sind böse !
Und dabei sollte man auch nicht zwischen Besuchern und Administratoren unterscheiden.

Was du auch noch machen kannst ist das Prüfen der Eingaben mit regulären Ausdrücken und den Variablenfunktionen, z.B.:is_numeric().
So kann man anhand dieser Auswertung dem Benutzer zur erneuten Eingabe auffordern, oder es einfach ignorieren so das die bösen Eingaben gar nicht erst in einem SQL-Query genutzt werden.
{code:0 } Edit: Oha, das liest sich aber blöde...


~Arano
Bitte warten ..
Mitglied: Sapzero
28.09.2009 um 13:29 Uhr
Hallo Arano,
danke für deinen Beitrag. Ich habe mir die Seiten durchgelesen.
Bei deinem Beispiel blicke ich leider nicht durch, weil es zu Kompliziert für mich ist.
Ich hatte auf eine einfachere Lösung gehofft.

Worauf ich aber bei deinen Seiten gestoßen bin ist das hier:
01.
Ein Beispiel für MySQL: anstatt 
02.
 
03.
$abfrage = "SELECT spalte1 
04.
            FROM tabelle 
05.
            WHERE spalte2 = '".$_POST['spalte2Wert']."'"; 
06.
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!"); 
07.
 
08.
sollte Folgendes verwendet werden: 
09.
 
10.
$abfrage = "SELECT spalte1 
11.
            FROM tabelle 
12.
            WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'"; 
13.
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
Dies war auch eigentlich meine Frage, ob es ausreicht die funktion "mysql_real_escape_string" bei einer Datenbankabfrage und bei html die funktion "htmlspecialchars" vor die Variable zu setzen und somit die Benutzereingaben zu entschärfen.

Hier nochmals mein Beispiel:
01.
$nachricht=htmlspecialchars($_POST('nachricht'));
Und nochmals Danke für deine schnelle Antwort

Gruß

Sapzero
Bitte warten ..
Mitglied: Arano
28.09.2009 um 14:27 Uhr
Mahlzeit

ob es ausreicht die funktion "mysql_real_escape_string" bei einer Datenbankabfrage und bei html die funktion "htmlspecialchars" vor die Variable zu setzen
Naja öhm... so direkt kann ich das leider auch nicht beantworten, auf jeden Fall wird es dadurch sicherer !

Zu kompliziert hm... ich kann es ja einmal versuch zu erklären, belasse es dabei erst mal auf die Eingabe eines Namens:
Vorweg eine alternative Syntax für ein If/else
01.
<?php 
02.
if( BEDINGUNG ){ 
03.
    $var='wert'
04.
05.
else
06.
    $var=NULL; 
07.
08.
// ist das selbe wie: 
09.
$var = BEDINGUNG ? 'wert1' : NULL; 
10.
?>
Das macht es jetzt vielleicht noch verständlicher.

01.
$name = isset($_POST['name']) && trim($_POST['name'])!='' ? trim($_POST['name']) : NULL;
Wenn das Formularfeld "name" übertragen wurde und dessen "getrimmter" Inhalt nicht leer ist, schreibe den getrimmten Inhalt in die Variable - andernfalls schreibe NULL in die Variable.
01.
if(is_null($name) ||  !preg_match('/^([a-zA-Z]{3,20})$/',$name)) $error[] = 'Name;'
Wenn der Inhalt der Variable $name gleich NULL entspricht oder nicht auf den regulärem Ausdruck passt, füge den Formularfeldtitel dem $error-Array hinzu.
Zu dem regulärem Ausdruck (RegEx = regular expression): Bei dem Namen habe ich in diesem Fall bestimmt, das dieser nur aus kleinen und großen Buchstaben bestehen darf (a-z und A-Z) und eine Länge von mindestens 3 bzw. längstes 20 Zeichen haben darf.
Wird nun ein - oder ' oder ein sonstiges Zeichen in das Feld eingetragen um z.B. eine SQL-Injection zu starten, so führt das zu einem Fehler und das Skript abgebrochen - die Injection verhindert.
01.
if(empty($error)) 
02.
03.
    // keine Fehleingaben / SQL-Injection, speichere... 
04.
05.
else 
06.
07.
    // Fehleingaben / SQL-Imjection, abbruch ! 
08.
}
Wenn das $error-Array leer ist, haben die Eingaben meine oberen Test bestanden und sind vermutlich (hoffentlich) keine SQL-Injectionen, schließlich kann man ja nicht an jede Möglichkeit denken und 100% Sicherheit gibt es ja nicht.
Sollte das $error-Array doch nicht leer sein breche ich die Weiterverarbeitung ab, so habe ich mindestens "ungewollte" Fehleingaben verhindert und stoppe leichte versuche der Injectionen.

Um die Sicherheit noch weiter zu erhöhen, wird dann beim eintragen in die Datenbank wieder die Funktion mysql_real_escape_string() verwendet.

Schwieriger wird dann schon bei solchen Eingabefeldern wie Textareas. Denn hier kann ich wie bei dem Namen nicht einfach bestimmen das nur a-zA-Z erlaubt sind, hier mache ja auch andere Zeichen Sinn: ?!"-'.,;:äü$%Éé und so weiter und sofort. Hier sollte dann auf jeden Fall die Escape-Funktion benutzt werden.
Aber auch die Verwendung von PHP-Manual: htmlspecialchars(ENT_QUOTES) ist sicher ratsam, wenn PHP-Manual htmlentities(ENT_QUOTES) (de2.php.net) nicht vielleicht sogar zu bevorzugen wäre, weil diese alle Sonderzeichen umwandelt.


~Arano
Bitte warten ..
Mitglied: Supermax
28.09.2009 um 18:54 Uhr
SQL Injection und sonstige EIngabefilterungen sind grundsätzlich mal zwei verschiedene Paar Schuhe...

Bei der SQL Injection geht es darum zu verhindern, daß durch eine Benutzereingabe ungewollte Befehle an den SQL-Server abgesetzt werden, indem z.B. durch ein ' in der Benutzereingabe ein String vorzeitig beendet und der Rest der Eingabe als neuer SQL-Befehl interpretiert wird.

Hier leistet mysql_real_escape_string() gute Dienste, da reservierte Zeichen in (my)SQL durch die entsprechenden Escape-Sequenzen ersetzt werden. Darüber hinaus sollte man, wie bereits hier erwähnt, alle Eingaben auf Korrektheit überprüfen und ggfs. unerwünschte Zeichen oder Zeichenketten ausfiltern, etwa auch CR und LF-Zeichen, wenn die Eingabe an sich nur einzeilige Angaben zuläßt. Es gibt genügend Tricks, um auch in einem an sich einzeiligen Formularfeld Zeilenvorschübe zu verstecken, was u.a. bei Mail-Formularen zu Problemen führen kann, wenn eine eingegebene Adresse ungefiltert an die mail() - Funktion übergeben wird.

htmlspecialchars() sollte vor allem bei der Ausgabe eingesetzt werden, um zu verhindern, daß vom Benutzer eingegebene HTML-Tags (vor allem <script> aber auch z.B. <iframe> im Kontext der eigenen Webseite erscheinen). Zusätzlich zu htmlspecialchars() sollte hier aber auch strip_tags() verwendet werden, um alle oder bestimmte HTML-Tags aus der Usereingabe zu filtern.
Bitte warten ..
Mitglied: Sapzero
28.09.2009 um 23:57 Uhr
OK danke jetzt habe ich ein wenig verstanden was der Code bezwegt :D
Auch eine andere Frage hast du mir auch schon beantwortet undzwar was ich benutzen soll htmlspecialchars oder htmlentities.
Bitte warten ..
Mitglied: Sapzero
29.09.2009 um 00:17 Uhr
hi,
wo du gerade das Mailformular anspricht ich habe mir da eins zusammen gebastelt und würde mich freuen wenn du drüber schauen würdest.
Könntest du mir sagen wo ich alles was raus Fitern muss und vllt auch den Fehler finden, weil es irgendwie nicht funktioniert und ich weis net wieso.

01.
<?php session_start(); ?> 
02.
<?php  
03.
  // Datenbankverbindung 
04.
  //---------------------------------------------------				   
05.
  //MIT DEM MySQL SERVER VERBINDEN 
06.
   
07.
	$mysqluser = "...";		 
08.
	$mysqlpasswd = "...";			 
09.
	$mysqlhost = "localhost"; 
10.
	$db_name = "...";	 
11.
 
12.
	$connID = @mysql_connect($mysqlhost, $mysqluser, $mysqlpasswd) or die("Verbindungsversuch fehlgeschlagen"); 
13.
         mysql_query("USE $db_name"); 
14.
            
15.
?> 
16.
<?php 
17.
$empfaenger = 'test@....de'; 
18.
$hidden		= $_POST['hidden']; 
19.
$name   	= $_POST['name']; 
20.
$email      = $_POST['email']; 
21.
$betreff    = $_POST['betreff']; 
22.
$nachricht 	= $_POST['nachricht']; 
23.
 
24.
if(isset($_POST['abschicken'])) 
25.
26.
	if($_SESSION["hidden_alt"] != $_POST["hidden"]) 
27.
28.
		$_SESSION["hidden_alt"] = $_POST["hidden"]; 
29.
		if(strlen($_POST['name'])>=2) 
30.
		{	 
31.
				if(strlen($_POST['betreff'])>=4) 
32.
33.
					if(strlen($_POST['nachricht'])>=10) 
34.
35.
                                             mail($empfaenger, $betreff, $nachricht, "From: $name <$email>") 
36.
                                             or die("Die Mail konnte nicht versendet werden.<br>"); 
37.
                                             header("Location: kontakt.php"); 
38.
                                             exit;	 
39.
40.
					else 
41.
42.
					$fehler_nachricht = "<font color=red>Sie haben keine Nachricht verfasst.</font><br>"; 
43.
					}	 
44.
45.
				else 
46.
47.
				$fehler_betreff = "<font color=red>Geben sie den Betreff Ihrer Nachricht ein.</font><br>"; 
48.
49.
		else 
50.
51.
		$fehler_name = "<font color=red>Geben sie ihren Namen ein.</font><br>"; 
52.
		}	 
53.
54.
55.
?> 
56.
 
57.
<form name="kontakt" method="post" action="kontakt.php" /> 
58.
<b>Name &nbsp;</b> 
59.
<input type="text" name="name" /> 
60.
<b>E-mail &nbsp;</b> 
61.
<input type="text" name="email" /> 
62.
<b>Betreff &nbsp;</b> 
63.
<input type="text" name="betreff" /> 
64.
<b>Nachricht &nbsp;</b> 
65.
<textarea class="textfeldkontakt" name="nachricht" cols="10" rows="5"></textarea> 
66.
<input type="submit" name="abschicken" value="Abschicken" />&nbsp; 
67.
<input type="reset" name="zuruecksetzen" value="Zur&uuml;cksetzen" /> 
68.
<input name="hidden" type="hidden" value="<?= uniqid(""); ?>"> 
69.
</form>
Bitte warten ..
Mitglied: Sapzero
02.10.2009 um 04:11 Uhr
Hi,
was ich noch fragen wollte ist es auch möglich statt htmlspecialchars einfach die Eingaben mit preg_replace zu ersetzen.
Hier ein Beispiel:
01.
$such = array("\","/","<",">",....);    //alle zeichen die in die Eingabe net hingehören 
02.
$ersetzung = ""; 
03.
preg_replace($such, $ersetzung, $eingabe);
Oder mit strpos durchsuchen und entscheiden ob es weiterverarbeitet wird oder net
01.
if(strpos($eingabe, "\") || strpos($eingabe, "/") || und so weiter) 
02.
03.
  nicht weiterverarbeiten... 
04.
05.
else 
06.
07.
  weiterverarbeiten... 
08.
}
Also ob man gleich nach den Zeichen suchen soll und sie ersetzen soll statt sie umzuwandeln.
Bitte warten ..
Mitglied: Arano
02.10.2009 um 14:14 Uhr
was ich noch fragen wollte ist es auch möglich statt htmlspecialchars einfach die Eingaben mit preg_replace zu ersetzen.
Möglich ist es - klar !
Aber für solche einfachen ersetzungen sollte dann lieber auf "str_replace" zurückgegriffen werden.

Und bevor du nun nach jedem Zeichen einzeln in dem Text suchst (strpos), dann ersetze sie doch lieber mit "str_replace" durch nichts: str_replace(array, '', $text);


~Arano
Bitte warten ..
Mitglied: Sapzero
02.10.2009 um 17:47 Uhr
OK mach ich und danke für deine Hilfe
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (13)

Frage von liquidbase zum Thema Windows Update ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Windows 10
gelöst Herunterfahren RDP Windows 10 verhindern (4)

Frage von micha055 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

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

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...