Top-Themen

Aktuelle Themen (A bis Z)

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 und seine Formular tücken

Mitglied: L0g1t3ch

L0g1t3ch (Level 1) - Jetzt verbinden

18.01.2010 um 17:43 Uhr, 4187 Aufrufe, 9 Kommentare

Ich arbeite schon sehr lange mit PHP und bin ehrlich gesagt jetzt soweit in den nächsten Waffenladen zu gehen
mir eine Pupgun zu holen und den nächst besten idioten abzuknallen. Wobei das wohl meine Büro insassen wären.

Ich habe ein Formular gebaut um daten in eine Datenbank tabelle zuschreiben siehe hier:

01.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
02.
<html xmlns="http://www.w3.org/1999/xhtml"> 
03.
<head> 
04.
 
05.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
06.
<title>Beitrag hinzufügen</title> 
07.
<link href="css.css" rel="stylesheet" type="text/css" /> 
08.
</head> 
09.
 
10.
<body> 
11.
<form action="addbeitrag.php" method="POST"> 
12.
Uberschrift<input type="text" name="uberschrift" /> 
13.
gkurz<input type="text" name="gkurz" /> 
14.
glang<textarea name="glang"></textarea> 
15.
<input type="submit" /> 
16.
</form>  
17.
</body> 
18.
</html>
wie ihr seht verweißt diese Datei auf "addbeitrag.php" also hier der quelltext zu addbeitrag.php

01.
<? include('config.php');  
02.
  
03.
 @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error()); 
04.
    mysql_select_db(MYSQL_DATABASE) OR die(mysql_error()); 
05.
  
06.
 
07.
if ($sql = " 
08.
   INSERT INTO 
09.
      `test` 
10.
11.
      `uberschrift`, 
12.
      `gkurz`, 
13.
      `glang`, 
14.
15.
   VALUES 
16.
17.
      '{$_POST['uberschrift']}', 
18.
      '{$_POST['gkurz']}', 
19.
      '{$_POST['glang']}',       
20.
   )" ) 
21.
    
22.
 
23.
24.
   echo "Die News wurden erfolgreich eingetragen"; 
25.
26.
 
27.
   else 
28.
 
29.
30.
   echo "Fehler beim eintragen der News"; 
31.
32.
 
33.
mysql_query($sql); 
34.
?>
soooweit so gut... leider schreibt der mir aber in die Datenbank Tabelle Test keinerlei daten rein... was er tun sollte...
Die Tabelle besteht aus 4 Feldern

ID
uberschrift
gkurz
glang

kann mir bitte jmd mit rat und tat zur seite stehen xD

Lieben Gruß
Ben
Mitglied: marcoj90
18.01.2010 um 17:56 Uhr
ganz einfach in deiner if bedingung lässt du den query string zusammensetzen aber nicht ausführen
in deiner konstellation ergibt die if bedingung immer true

sinnvoller wäre

wenn du im if alle variablen auf inhalt prüfst, zumindest die die nicht leer sein sollen

z.B.:

if(isset(htmlspecialchars($_POST['blahblupp'])) and htmlspecialchars($_POST['blahblupp']) != "")

und um den query auszuführen den du in $sql stehen hast musst du noch

mysql_query($sql);

ausführen das is eigendlich alles soweit dann sollte es gehen
Bitte warten ..
Mitglied: L0g1t3ch
18.01.2010 um 17:59 Uhr
ich hatte die abfrage ob daten drin stehen vorher rausgenommen da ich das skript ersteinmal so zum laufen kriegen wollte...
die abfrage wird doch auch nicht zu 100% benötigt oder? wenn ich per hand zum test daten reinschreib is doch okay

und den querry führ ich ja in zeile 33 quasi aus oder nicht?

vielen dank für deine prompte antwort
Bitte warten ..
Mitglied: marcoj90
18.01.2010 um 18:08 Uhr
ups sry überlesen man sollte bis zur letzten zeile lesen ^^


hab gerad nochmal genau gekugt hast du mal mit "echo $sql" geschaut ob da auch ein vernünftiger query rauskommt
denn ich glaub ma das die { } da nix zu suchen haben und durch . (Punkt) und " ersetzt werden müssen

vorher:

VALUES
(
'{$_POST['uberschrift']}',
'{$_POST['gkurz']}',
'{$_POST['glang']}',
)" )

nachher:

VALUES
(
' ".$_POST['uberschrift']." ',
' ".$_POST['gkurz']." ',
' ".$_POST['glang']." ',
)" )
Bitte warten ..
Mitglied: dog
18.01.2010 um 18:16 Uhr
Meine Meinung: Du arbeitest noch nicht lange genug mit PHP, denn da ist ein Haufen Quark!

<?

Niemals Short open Tags benutzen!

@

Niemals auf diese Weise Fehler unterdrücken, wenn man nicht genau weis, wie man sie wieder auffangen muss und wie man sie in der Entwicklung trotzdem sichtbar macht!

OR die(mysql_error());

Copy und Paste Klassiker, hat in der Praxis aber nichts verloren.

if ($sql

Über die Sinnlosigkeit dieser Zeile hat sich marco ja schon ausgelassen

'{$_POST['uberschrift']}',

SQL-Injection lässt grüßen!

mysql_query($sql);

Abgesehen von den ganzen Fehlern sollten die Daten trotzdem eingetragen werden, darum gilt wie immer:

01.
error_reporting(E_ALL|E_STRICT); 
02.
ini_set('display_errors','On');
hinzufügen und auf den Fehler warten...

@marco

Die {} sind für Strings die evaluiert werden (doppelte Anführungszeichen) korrekte Steuerzeichen (werden aber sehr selten benutzt):

01.
<?php 
02.
	$data = array('a' => 'Hallo','b' => 'Welt'); 
03.
	 
04.
	var_dump("{$data['a']} Welt"); 
05.
	#=> string(10) "Hallo Welt" 
06.
	var_dump("Hallo ${data['b']}"); 
07.
	#=> string(10) "Hallo Welt" 
08.
?>
Bitte warten ..
Mitglied: marcoj90
18.01.2010 um 18:43 Uhr
ok ok is ja auch n weilchen her das ich mal mit php gearbeitet hab ^^

ich hab nu einfach mal sein scripts neu geschrieben so wie ich es lösen würd vielleicht hilft es ihm ja
keine garantie auf flüchtigkeitsfehler

01.
<?PHP 
02.
  // zum debuggen 
03.
  error_reporting(E_ALL|E_STRICT);  
04.
  ini_set('display_errors','On'); 
05.
   
06.
  include_once('config.php'); 
07.
  mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);  
08.
  mysql_select_db(MYSQL_DATABASE); 
09.
   
10.
  if 
11.
12.
    isset($_POST['uberschrift']) and  
13.
    htmlspecialchars($_POST['uberschrift']) != "" and 
14.
    isset($_POST['gkurz']) and 
15.
    htmlspecialchars($_POST['gkurz']) != "" and 
16.
    isset($_POST['glang']) 
17.
    htmlspecialchars($_POST['glang']) != "" 
18.
19.
20.
    $uberschrift = htmlspecialchars($_POST['uberschrift']); 
21.
    $gkurz = htmlspecialchars($_POST['gkurz']); 
22.
    $glang = htmlspecialchars($_POST['glang']); 
23.
     
24.
    $sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" ".$gkurz." \", \" ".$glang." \", )"
25.
     
26.
    try 
27.
28.
      mysql_query($sql); 
29.
      echo "Die News wurden erfolgreich eingetragen"
30.
31.
    catch (Exception $e)  
32.
33.
      echo "Fehler beim eintragen der News"
34.
35.
36.
  else 
37.
38.
    echo "Es wurden nicht alle erforderlichen Felder ausgefüllt."
39.
40.
   
41.
  mysql_close();  
42.
?>
Bitte warten ..
Mitglied: dog
18.01.2010 um 19:50 Uhr
01.
$glang = htmlspecialchars($_POST['glang']);  
02.
$sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" ".$gkurz." \", \" ".$glang." \", 
Eine nette SQL-Injection hast du so trotzdem drinne.
Mysql Steuerzeichen != HTML Steuerzeichen
Bitte warten ..
Mitglied: RoterFruchtZwerg
18.01.2010 um 20:42 Uhr
Zitat von marcoj90:
ok ok is ja auch n weilchen her das ich mal mit php gearbeitet hab ^^

ich hab nu einfach mal sein scripts neu geschrieben so wie ich es lösen würd vielleicht hilft es ihm ja
keine garantie auf flüchtigkeitsfehler

01.
>   if 
02.
>   ( 
03.
>     isset($_POST['uberschrift']) and  
04.
>     htmlspecialchars($_POST['uberschrift']) != "" and 
05.
>     isset($_POST['gkurz']) and 
06.
>     htmlspecialchars($_POST['gkurz']) != "" and 
07.
>     isset($_POST['glang']) 
08.
>     htmlspecialchars($_POST['glang']) != "" 
09.
>   ) 
10.
>   { 
11.
>     $uberschrift = htmlspecialchars($_POST['uberschrift']); 
12.
>     $gkurz = htmlspecialchars($_POST['gkurz']); 
13.
>     $glang = htmlspecialchars($_POST['glang']); 
14.
>      
15.
>     $sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" 
16.
> ".$gkurz." \", \" ".$glang." \", )"
17.
>      
18.
> 

Da wird einem ja schwindelig... htmlspecialchars ersetzt HTML Steuerzeichen durch ihre HTML Entities. Die Funktion kommt sinnvollerweise bei der Ausgabe eines Strings im Kontext eine HTML Dokumentes zum Einsatz. Das ist hier nicht der Fall, also hat sie hier auch nichts zu suchen.
Erst recht aber hat sie beim Vergleich mit einem Leerstring absolut keinen Sinn. Wie könnte denn ein nicht leerer String aussehen, der sich bei der Ersetzung in HTML Entities in einen Leerstring wandelt?
PHP ist ausserdem so nett und erlaubt den Vergleich mit einer nicht gesetzten Variable mit einem Leerstring (oder False) und gibt dafür True zurück, sofern man nicht einen Vergleich der Variablentypen erzwingt. Das isset() kann man sich also in den meisten Fällen sparen.

Übergebene Strings in SQL Statements gehören entsprechend den Regeln der SQL Datenbank escaped, die richtige Funktion dafür ist mysql_real_escape_string();

01.
if($_POST['uberschrift'] != '' AND $_POST['gkurz'] != '' AND $_POST['glang'] = '') { 
02.
	$sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`) VALUES ( '".mysql_real_escape_string($_POST['uberschrift'])."', '".mysql_real_escape_string($_POST['gkurz'])."', '".mysql_real_escape_string($_POST['glang'])."' )"
03.
	... 
04.
}
Funktioniert haben trotzdem alle hier genannten Lösungen nicht, weil das SQL Query fehlerhaft war. Nach dem letzten übergebenen Wert in VALUES () bzw. nach den Feldnamen war noch ein Komma.

Bedenke bitte, falls du vor hast diese Daten auch irgendwo wieder auszugeben, dass du htmlspecialchars() korrekt einsetzt.

greetz RFZ
Bitte warten ..
Mitglied: dog
18.01.2010 um 21:23 Uhr
Hehe, das Komma war wirklich zu kein um es zu sehen, man hätte es aber ganz schnell gemerkt wenn man wirklich mal error_reporting benutzt hätte

PHP ist ausserdem so nett und erlaubt den Vergleich mit einer nicht gesetzten Variable mit einem Leerstring (oder False) und gibt dafür True zurück, sofern man nicht einen Vergleich der Variablentypen erzwingt. Das isset() kann man sich also in den meisten Fällen sparen.

PHP erlaubt das zwar, aber auch nur mit einer E_NOTICE - weshalb man es nicht machen sollte.
Schlauerweise benutzt man in so einem Fall das empty()-Sprachkonstrukt

01.
<?php if($a) echo "Hallo"; ?> 
02.
# PHP Notice:  Undefined variable: a in ... on line 1 
03.
# PHP Stack trace: 
04.
# PHP   1. {main}() ...:0
Bitte warten ..
Mitglied: L0g1t3ch
19.01.2010 um 10:31 Uhr
´werde eure sachen morgen beherzigen... jedoch arbeite ich schon eine weile mit php aber mit jetzt net so der übercrack xD und ja ich habe copy und paste aus meinen alten scripten gemacht wo noch das handbuch neben mir lag... deswegen sich warscheinlich auch unnötige sachen im script xD


Der Ben
Bitte warten ..
Ähnliche Inhalte
PHP
PHP Problem mit Formular
gelöst Frage von vServerPHP6 Kommentare

Hallo, ich habe ein Formular jedoch ein Problem das später nicht alle Felder weitergegeben werden? und hier hab ich ...

Microsoft

Lizenzwiederverkauf und seine Tücken

Erfahrungsbericht von DerWoWussteMicrosoft9 Kommentare

Eine kleine nette Geschichte zum Thema "verantwortungsvoller Umgang mit fremden Eigentum" Der Weiterverkauf gebrauchter Lizenzen ist ja bekanntlich legal. ...

PHP

PHP include und per form ein formular einfügen

Frage von miichiii9PHP1 Kommentar

Hallo miteinander Ich habe ein kleines Problem Meine Idee ist ein kleines Forum selber zu erstellen mittels PHP und ...

PHP

Textnotiz mit HTML-Form erstellen und Formular prüfen ( PHP )

gelöst Frage von Sven32PHP9 Kommentare

Hallo Leute, ich brauche mal eure Hilfe. Und zwar möchte ich gerne mittels eines HTML Formular eine .txt Datei ...

Neue Wissensbeiträge
Sicherheit
Sicherheitsrisiko: Die Krux mit 7-Zip
Information von kgborn vor 11 StundenSicherheit

Bei vielen Anwendern ist das Tool 7-Zip zum Entpacken von Archivdateien im Einsatz. Die Software ist kostenlos und steht ...

Internet

Datendealing im WWW Tracking Methoden immer brutaler

Information von sabines vor 20 StundenInternet

Interessanter Artikel zum Thema Tracking im WWW und die immer "besseren" Methoden des Trackings. Professor Arvind Narayanan (Princeton-Universität) betreibt ...

Erkennung und -Abwehr

Ups: Einfaches Nullzeichen hebelte den Anti-Malware-Schutzt in Windows 10 aus

Information von kgborn vor 1 TagErkennung und -Abwehr

Windows 10 ist das sicherste Windows aller Zeiten, wie Microsoft betont. Insidern ist aber klar, das es da Lücken, ...

Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 1 TagWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Heiß diskutierte Inhalte
Server
Route-Befehl Unterstützung (unter CMD)
gelöst Frage von FKRR56Server36 Kommentare

Guten Tag , i.M. habe ich Probleme über den CMD-Route-Befehl ein Routing auf einen entfernten Server zuzulassen. Der Server ...

Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1028 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgbornMicrosoft17 Kommentare

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Webbrowser
Welcher Browser ist der Beste?
Frage von justtinWebbrowser15 Kommentare

Hallo Leute Ich habe eine interessante Frage. Mich wurde mal interessieren welcher Browser ist eure meinung nach der beste? ...