WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   PHP / MySQL (http://www.wcm.at/forum/showthread.php?t=205361)

Blauer Kuckuck 10.12.2006 12:43

PHP / MySQL
 
Hi,

ich bin dabei, ein Newsscript zu programmieren.

Update.php

PHP-Code:

<?php
  
  
  
include "config.php";
  
  @
mysql_connect (MYSQL_HOSTMYSQL_USERMYSQL_PASS) or die (mysql_error());
  
mysql_select_db(MYSQL_DATABASE) or die (mysql_error());
  
  
$upid $_POST["upID"];
  
$select_inhalt "SELECT Inhalt, Autor, Datum, Titel FROM news WHERE id = ".$upid;
  
  
  
  
  
$result mysql_query($select_inhalt) OR die (mysql_error());
  

    

  If(
mysql_num_rows($result)) {
      while(
$row mysql_fetch_assoc($result)) {
          echo 
"
                <html><head><title>News ändern</title></head><body><form action=\"updater.php\" method=\"POST\">
                <input disabled name=\"upid\" type=\"text\" size=\"5\" value=\""
.$upid."\">

                <input name=\"autor\" type=\"text\" size=\"20\" value=\""
.$row['Autor']."\">

                <input name=\"titel\" type=\"text\" size=\"20\" value=\""
.$row['Titel']."\">

                <textarea name=\"inhalt\" cols=\"40\" rows=\"20\">"
.$row['Inhalt']."</textarea>


                <input type=\"submit\" value=\"OK\">
                </form></body></html>"
;
    }
  } else {
    echo 
"Falsche ID!";
  }
?>

Datei updater.php

PHP-Code:

<?php
  
  
include "config.php";
  
  
  
$autor $_POST["autor"];
  
$inhalt $_POST["inhalt"];
  
$titel $_POST["titel"];
  
$upid $_POST["upid"];
  
  @
mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR die (mysql_error());
  
mysql_select_db(MYSQL_DATABASE) OR die (mysql_error());
  

  
  
  
$update "UPDATE
               `news`
             SET
               `Autor` = '"
.$autor."',
               `Datum` = NOW(),
               `Inhalt` = '"
.$inhalt."',
               `Titel` = '"
.$titel."'
             WHERE
               `ID` = "
.$upid." LIMIT 1";
  
  
$result mysql_query($update);
  
  If (!
$result) {
      die(
mysql_error());
  } else {
      echo 
"Done.";
  }
  
?>

Datei config.php

PHP-Code:

<?php
  define
('MYSQL_HOST''localhost');
  
define('MYSQL_USER''mein richtiger benutzername');
  
define('MYSQL_PASS''mein richtiges passwort');
  
define('MYSQL_DATABASE''news');
?>

Die beiden Dateien sind dafür da, einen bestehenden Newseintrag zu bearbeiten.

Kleiner Hinweis: $upid steht für updateid.

Ich fülle die erste Datei aus, komme zur zweiten:

Zitat:

Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen (diese kann für verschiedene Server-Versionen unterschiedlich sein) bei 'LIMIT 1' in Zeile 9
Was hab ich falsch gemacht?

THX im Voraus,

Kuckuck

pong 10.12.2006 12:55

Zitat:

Was hab ich falsch gemacht?
Zitat:

Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen (diese kann für verschiedene Server-Versionen unterschiedlich sein) bei 'LIMIT 1' in Zeile
verstehst du "in Handbuch nachschlagen" oder "Fehler in SQL-Syntax" nicht?

pong

Philipp 10.12.2006 13:03

Ich würde folgendes ändern:

PHP-Code:

$select_inhalt "SELECT Inhalt, Autor, Datum, Titel FROM news WHERE id = '".intval($upid)."'"

und

PHP-Code:

$update "UPDATE 
               `news` 
             SET 
               `Autor` = '"
.addslashes($autor)."', 
               `Datum` = NOW(), 
               `Inhalt` = '"
.addslashes($inhalt)."', 
               `Titel` = '"
.addslashes($titel)."' 
             WHERE 
               `ID` = '"
.intval($upid)."' LIMIT 1"


Blauer Kuckuck 10.12.2006 13:12

Hi,

du bist ja toll, pong. Ganz lustig. Ich bin aber sicher, dass jeder deuschsprechende meine Fragestellung trotzdem verstehen würde --> siehe Philipp.

@Philipp:

Danke.

Die Fehlermeldung ist zwar weg (Er gibt 'Done.' aus, aber der Eintrag hat sich nicht so geändert, wie ichs angegeben hab.

Kann mir einer weiterhelfen und eine Problemlösung darstellen?

P.S.: Ich hoffe, diese Fragestellung passt auch pong...

Kuckuck

delphirocks 10.12.2006 18:55

Zitat:

$select_inhalt = "SELECT Inhalt, Autor, Datum, Titel FROM news WHERE id = ".$upid;
Eine Anweisung wie diese solltest du vermeiden, da du sonst eine SQL-Injection riskierst. Wenn z.B. jemand für $updid "1; delete from news where 1=1" eingibt, dann löscht er dir eine Datenbanktabelle. Deswegen sollte man bei Abfragen immer Parameter verwenden und nie die Where Klausel per String-Verkettung anfügen.

xpla 10.12.2006 19:05

Ok, und wie soll er jetzt die Abfrage mit Parameter machen?

Blauer Kuckuck 11.12.2006 16:01

Den Thread von

Zitat:

delphirocks
Eine Anweisung wie diese solltest du vermeiden, da du sonst eine SQL-Injection riskierst. Wenn z.B. jemand für $updid "1; delete from news where 1=1" eingibt, dann löscht er dir eine Datenbanktabelle. Deswegen sollte man bei Abfragen immer Parameter verwenden und nie die Where Klausel per String-Verkettung anfügen.
hab ich höchstens zur Hälfte verstanden...

Aber wenn ich die eine Hälfte verstanden hat, rät delphirocks mir aus Sicherheitsgründen von dieser Methode ab.
Vorerst ist das Script eh nur für mich da- Passwortgeschützter Bereich.

Kuckuck

void 11.12.2006 16:51

mich würde jetzt aber auch die "sichere" methode interessieren...

iG0r 11.12.2006 18:58

beim update sql query einfach das NOW() durch ".time()." ersetzen. die backticks sind übringens unnötig.

die $upid variable kannst du, da es sich nur um numerische werte handeln dürfte, mit einer kleinen is_numeric($upid) abfrage "sicherer" machen - und nicht am ende mit ".$upid; anhängen, sondern einfach in den query mit reinschreiben "... $upid";

void 11.12.2006 19:43

sry, bitte noch einmal, habe jetzt überhaupt nichts verstanden, außer dass $upid auf nummerischen inhalt überprüft werden sollte...

delphirocks 11.12.2006 23:05

Sicherer wäre z.B., die neue mysqli Erweiterung zu verwenden.

Also anstatt
PHP-Code:

$select_inhalt "SELECT Inhalt, Autor, Datum, Titel FROM news WHERE id = ".$upid

lieber
PHP-Code:

$query $mysqli->prepare"SELECT Inhalt, Autor, Datum, Titel FROM news WHERE id = ?" );
$query->bind_param'i',  $upid ); // i für integer
$query->execute( ); 

Ist zwar lästig, dafür ist man auf der sicheren Seite. Es gibt auch noch ein paar andere Möglichkeiten, um SQL-Injections zu vermeiden, aber Parameter zu verwenden ist (bei anderen Sprachen zumindest) denke ich die gängigste Methode.

Artikel

Nettes Youtube Video eines Live-"hacks":

SQL-Injection

void 11.12.2006 23:27

aaaaaaaalles klar =)

void 11.12.2006 23:32

Zitat:

Original geschrieben von delphirocks
Nettes Youtube Video eines Live-"hacks":

SQL-Injection

hmmm, aber um JS zu deaktivieren brauche ich nicht mehr den quellcode editieren *lol*

Blauer Kuckuck 12.12.2006 11:42

Hi,

vielen Dank erstmal für eure Vorschläge

ich hab alles ausprobiert-

Der Quelltext sieht momentan so aus:

PHP-Code:

<?php
  
  
include "config.php";
  
  
  
$autor $_POST["autor"];
  
$inhalt $_POST["inhalt"];
  
$titel $_POST["titel"];
  
$upid $_POST["upid"];
  
  @
mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR die (mysql_error());
  
mysql_select_db(MYSQL_DATABASE) OR die (mysql_error());
  

  
  
  
$result mysql_query("
              UPDATE
                news
              SET
                Autor = 'addslashes($autor).',
                Datum = NOW(),
                Inhalt = '.addslashes($titel).',
                Titel = '.addslashes($titel).'
              WHERE
                ID = '.intval($upid).' LIMIT 1"
);
  
  
                  
  If (!
$result) {
      die(
mysql_error());
  } else {
      echo 
"Done.";
  }
  
?>

Beim Aufruf der Datei (Ich versuche, einen Newseintrag zu ändern), kommt keine Fehlermeldung mehr, sondern die selbst einprogrammierte Meldung "Done."

Leider ist der Eintrag nicht verändert worden.

Kann jemand den Fehler entdecken?

thx im Voraus,

Kuckuck

Blauer Kuckuck 12.12.2006 11:42

Hi,

vielen Dank erstmal für eure Vorschläge

ich hab alles ausprobiert-

Der Quelltext sieht momentan so aus:

PHP-Code:

<?php
  
  
include "config.php";
  
  
  
$autor $_POST["autor"];
  
$inhalt $_POST["inhalt"];
  
$titel $_POST["titel"];
  
$upid $_POST["upid"];
  
  @
mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR die (mysql_error());
  
mysql_select_db(MYSQL_DATABASE) OR die (mysql_error());
  

  
  
  
$result mysql_query("
              UPDATE
                news
              SET
                Autor = 'addslashes($autor).',
                Datum = NOW(),
                Inhalt = '.addslashes($titel).',
                Titel = '.addslashes($titel).'
              WHERE
                ID = '.intval($upid).' LIMIT 1"
);
  
  
                  
  If (!
$result) {
      die(
mysql_error());
  } else {
      echo 
"Done.";
  }
  
?>

Beim Aufruf der Datei (Ich versuche, einen Newseintrag zu ändern), kommt keine Fehlermeldung mehr, sondern die selbst einprogrammierte Meldung "Done."

Leider ist der Eintrag nicht verändert worden.

Kann jemand den Fehler entdecken?

thx im Voraus,

Kuckuck

Philipp 12.12.2006 11:47

So wird das nicht funktionieren:

PHP-Code:

$result mysql_query(
              UPDATE 
                news 
              SET 
                Autor = 'addslashes($autor).', 
                Datum = NOW(), 
                Inhalt = '.addslashes($titel).', 
                Titel = '.addslashes($titel).' 
              WHERE 
                ID = '.intval($upid).' LIMIT 1"
); 

Das ganze sollte eher so aussehen:

PHP-Code:

$result mysql_query(
              UPDATE 
                news 
              SET 
                Autor = '"
.addslashes($autor)."', 
                Datum = NOW(), 
                Inhalt = '"
.addslashes($inhalt)."', 
                Titel = '"
.addslashes($titel)."' 
              WHERE 
                ID = '"
.intval($upid)."' LIMIT 1"); 


Blauer Kuckuck 12.12.2006 11:56

Hi,

@Philipp:

Danke für deine Mühe...

Also,

mit meinem Code hats doch funktioniert.


Zitat:

Datei update.php
PHP-Code:

          echo "
                <html><head><title>News ändern</title></head><body><form action=\"updater.php\" method=\"POST\">
                <input disabled name=\"upid\" type=\"text\" size=\"5\" value=\""
.$upid."\">

                <input name=\"autor\" type=\"text\" size=\"20\" value=\""
.$row['Autor']."\">

                <input name=\"titel\" type=\"text\" size=\"20\" value=\""
.$row['Titel']."\">

                <textarea name=\"inhalt\" cols=\"40\" rows=\"20\">"
.$row['Inhalt']."</textarea>


                <input type=\"submit\" value=\"OK\">
                </form></body></html>"



Da habe ich das disabled weggelassen. Anscheinend wurde das nicht mit dem restlichen Formular zu "updater.php" weggeschickt.

Rausbekommen hab ichs, indem ich ganz oben error_reporting auf E_ALL gestellt habe, und prompt kam die Ausgabe "Undefinied Index" ...

THX trotzdem...

Kuckuck


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag