l0g1t3ch
Goto Top

PHP und seine Formular tücken

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:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Beitrag hinzufügen</title>
<link href="css.css" rel="stylesheet" type="text/css" />  
</head>

<body>
<form action="addbeitrag.php" method="POST">  
Uberschrift<input type="text" name="uberschrift" />  
gkurz<input type="text" name="gkurz" />  
glang<textarea name="glang"></textarea>  
<input type="submit" />  
</form> 
</body>
</html>

wie ihr seht verweißt diese Datei auf "addbeitrag.php" also hier der quelltext zu addbeitrag.php

<? include('config.php');   
 
 @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());
    mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());
 

if ($sql = "  
   INSERT INTO
      `test`
   (
      `uberschrift`,
      `gkurz`,
      `glang`,
   )
   VALUES
   (
      '{$_POST['uberschrift']}',  
      '{$_POST['gkurz']}',  
      '{$_POST['glang']}',        
   )" )  
   

	{
   echo "Die News wurden erfolgreich eingetragen";  
 	}

   else

   {
   echo "Fehler beim eintragen der News";  
   }

mysql_query($sql);
?>

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

Content-Key: 133747

Url: https://administrator.de/contentid/133747

Printed on: April 18, 2024 at 23:04 o'clock

Member: marcoj90
marcoj90 Jan 18, 2010 at 16:56:37 (UTC)
Goto Top
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
Member: L0g1t3ch
L0g1t3ch Jan 18, 2010 at 16:59:56 (UTC)
Goto Top
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
Member: marcoj90
marcoj90 Jan 18, 2010 at 17:08:36 (UTC)
Goto Top
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']." ',
)" )
Member: dog
dog Jan 18, 2010 at 17:16:56 (UTC)
Goto Top
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 face-smile

'{$_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:

error_reporting(E_ALL|E_STRICT);
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):

<?php
	$data = array('a' => 'Hallo','b' => 'Welt');  
	
	var_dump("{$data['a']} Welt");  
	#=> string(10) "Hallo Welt" 
	var_dump("Hallo ${data['b']}");  
	#=> string(10) "Hallo Welt" 
?>
Member: marcoj90
marcoj90 Jan 18, 2010 at 17:43:47 (UTC)
Goto Top
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 face-wink

<?PHP
  // zum debuggen
  error_reporting(E_ALL|E_STRICT); 
  ini_set('display_errors','On');  
  
  include_once('config.php');  
  mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS); 
  mysql_select_db(MYSQL_DATABASE);
  
  if
  (
    isset($_POST['uberschrift']) and   
    htmlspecialchars($_POST['uberschrift']) != "" and  
    isset($_POST['gkurz']) and  
    htmlspecialchars($_POST['gkurz']) != "" and  
    isset($_POST['glang'])  
    htmlspecialchars($_POST['glang']) != ""  
  )
  {
    $uberschrift = htmlspecialchars($_POST['uberschrift']);  
    $gkurz = htmlspecialchars($_POST['gkurz']);  
    $glang = htmlspecialchars($_POST['glang']);  
    
    $sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" ".$gkurz." \", \" ".$glang." \", )";  
    
    try
    {
      mysql_query($sql);
      echo "Die News wurden erfolgreich eingetragen";  
    }
    catch (Exception $e) 
    {
      echo "Fehler beim eintragen der News";  
    }
  }
  else
  {
    echo "Es wurden nicht alle erforderlichen Felder ausgefüllt.";  
  }
  
  mysql_close(); 
?>
Member: dog
dog Jan 18, 2010 at 18:50:35 (UTC)
Goto Top
$glang = htmlspecialchars($_POST['glang']);   
$sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" ".$gkurz." \", \" ".$glang." \",   

Eine nette SQL-Injection hast du so trotzdem drinne.
Mysql Steuerzeichen != HTML Steuerzeichen
Member: RoterFruchtZwerg
RoterFruchtZwerg Jan 18, 2010 at 19:42:12 (UTC)
Goto Top
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 face-wink

>   if
>   (
>     isset($_POST['uberschrift']) and   
>     htmlspecialchars($_POST['uberschrift']) != "" and  
>     isset($_POST['gkurz']) and  
>     htmlspecialchars($_POST['gkurz']) != "" and  
>     isset($_POST['glang'])  
>     htmlspecialchars($_POST['glang']) != ""  
>   )
>   {
>     $uberschrift = htmlspecialchars($_POST['uberschrift']);  
>     $gkurz = htmlspecialchars($_POST['gkurz']);  
>     $glang = htmlspecialchars($_POST['glang']);  
>     
>     $sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \"  
> ".$gkurz." \", \" ".$glang." \", )";  
>     
> 

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();

if($_POST['uberschrift'] != '' AND $_POST['gkurz'] != '' AND $_POST['glang'] = '') {  
	$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'])."' )";  
	...
}

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
Member: dog
dog Jan 18, 2010 at 20:23:45 (UTC)
Goto Top
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 face-smile

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

<?php if($a) echo "Hallo"; ?>  
# PHP Notice:  Undefined variable: a in ... on line 1
# PHP Stack trace:
# PHP   1. {main}() ...:0
Member: L0g1t3ch
L0g1t3ch Jan 19, 2010 at 09:31:41 (UTC)
Goto Top
´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