Author Topic: 2.8.2 Sicherheitsverletzung bei PHP Code  (Read 3301 times)

Offline Paule08

  • Posts: 36
2.8.2 Sicherheitsverletzung bei PHP Code
« on: January 03, 2012, 01:01:45 PM »
Hallo,
habe gestern meine Homepage auf die neuste Version geupdatet und kann leider eine Seite nicht mehr Editieren.
Habe eine Seite bestehend aus einem Code - Block und einem QYSIWYG Block:

Code:
Code: [Select]
$db_host = "localhost";
$db_user = "termine";
$db_pass = "termine1";
$db_name = "termine";

if (isset( $_POST['eintragen'] ))
{
    // Maskierende Slashes aus POST entfernen
    $_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;
    
    // Inhalte der Felder aus POST holen
    $datum = $_POST['datum'];
    $titel = $_POST['titel'];
    $link = $_POST['link'];
    $art = $_POST['art'];
    $leitung = $_POST['leitung'];
    $add_von = $_POST['add_von'];
    $beschreibung = $_POST['beschreibung'];
    /* ************************************************************************************************ */
    /* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
    /* ************************************************************************************************ */
    
    // Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
    // Verbindung oeffnen und Datenbank ausweahlen
    $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
    if ($conID)
    {
        mysql_select_db( $db_name, $conID );
    }
    
    // Anfrage zusammenstellen der an die DB geschickt werden soll

function date_german2mysql($date) {
    $d    =    explode(".",$date);
    
    return    sprintf("%04d-%02d-%02d", $d[2], $d[1], $d[0]);
}

$dedatum = date_german2mysql($datum);

    $sql = "INSERT INTO `termine`
                (`datum`, `titel`, `mlink`, `art`, `leitung`, `add_von`, `beschreibung`)
            VALUES(
                '" .mysql_real_escape_string( $dedatum ). "',
                '" .mysql_real_escape_string( $titel ). "',
        '" .mysql_real_escape_string( $link ). "',
 '" .mysql_real_escape_string( $art ). "',
 '" .mysql_real_escape_string( $leitung ). "',
 '" .mysql_real_escape_string( $add_von ). "',
      '" .mysql_real_escape_string( $beschreibung ). "'
                )";
    // Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
    mysql_query( $sql );
    
     if (mysql_affected_rows() == 1)
    {
        
      
echo "Der Termin ";
echo $titel;
echo " am ";
echo $datum;
echo " wurde erfolgreich eingetragen.";

// Hier kann weiterer Code stehen der ausgefuehrt werden soll
        // wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken
        // der ueber den neuen Eintrag informiert
    }
    else
    {
        echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
        // Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren
        // wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken
        // damit er sich um den Fehler kuemmern kann, etc pp
    }
        // Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
}

WYSIWYG Block:
Code: [Select]
<form id="formular" name="formular" method="post" action="">
    <table align="center" width="500px" cellspacing="2" cellpadding="3" border="0">
        <tbody>
            <tr>
                <td colspan="2">
                <h1>Termin anlegen</h1>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                <p>Auf dieser Seite k&ouml;nnen sie einen Termin anlegen.</p>
                </td>
            </tr>
            <tr>
                <td align="right" valign="top" nowrap="" class="my">Datum:</td>
                <td class="my"><input type="text" onfocus="this.value = '';" maxlength="100" size="50" value="01.01.2001" name="datum" /></td>
            </tr>
            <tr>
                <td align="right" valign="top" nowrap="" class="my">Titel:</td>
                <td class="my"><input type="text" maxlength="100" size="50" value="" name="titel" /></td>
            </tr>
            <tr>
                <td align="right" valign="top" nowrap="" class="my">Leitung:</td>
                <td class="my"><input type="text" maxlength="100" size="50" value="" name="leitung" /></td>
            </tr>
            <tr>
                <td align="right" valign="top" nowrap="" class="my">Link:</td>
                <td class="my"><input type="text" maxlength="100" size="50" value="" name="link" /></td>
            </tr>
            <tr>
                <td align="right" valign="top" nowrap="" class="my">Art:</td>
                <td class="my"><input type="text" maxlength="100" size="50" value="Dienst" name="art" /></td>
            </tr>
            <tr>
                <td align="right" valign="top" nowrap="" class="my">Name:</td>
                <td class="my"><input type="text" maxlength="100" size="50" value="DE" name="add_von" /></td>
            </tr>
            <tr>
                <td align="right" valign="top" nowrap="" class="my">Mehr Informationen:</td>
                <td class="my"><textarea rows="7" cols="40" name="beschreibung"></textarea></td>
            </tr>
            <!-- CAPTCHA -->
            <tr>
                <td colspan="2">
                <p class="my">&nbsp;</p>
                </td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="Abschicken" id="eintragen" name="eintragen" />             <input type="reset" value="Zur&uuml;cksetzen" name="next" />              <!-- PRINTBUTTON --></td>
            </tr>
        </tbody>
    </table>
</form>

Bei Version 2.81 hatte das so funktioniert, allerdings habe ich nach dem erstellen immer eine Fehlermeldung erhalten:

Fatal error: Call to a member function fetchRow() on a non-object in /var/www/virtual/ffw.heideskat.de/htdocs/modules/wysiwyg/view.php on line 22 , die Daten wurden trotzdem in die MySQL geschrieben.
Kann mir da jemand helfen, woran es liegt ?

Gruß
« Last Edit: January 03, 2012, 01:07:59 PM by Paule08 »

Offline pcwacht

  • Posts: 2923
  • Gender: Male
    • Dutch ICT info
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #1 on: January 03, 2012, 02:09:02 PM »
Ist kein sicherheitsverletzu ng aber ein fehler

Quote
Fatal error: Call to a member function fetchRow() on a non-object in /var/www/virtual/ffw.heideskat.de/htdocs/modules/wysiwyg/view.php on line 22

In deine code setzen sie ein neues DB link, deswegen verliert WB seines link

Mach am ende deine code etwa wie:
$database = new->database();
um die link mit WB wieder zu setzen.

Oh und dieses fehler soll auch mit wb281 schon da sein.

John
http://www.ictwacht.nl = Dutch ICT info
http://www.pcwacht.nl = My first
both still work in progress, since years.....

Offline Paule08

  • Posts: 36
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #2 on: January 03, 2012, 03:39:05 PM »
Hallo,
danke für die Antwort.

Wie könnte ich den Code denn ändern, wenn ich die gleiche Datenbank nutzen würde, in der sich auch WebsiteBaker befindet ?
Kann ich die Config.php einfach via Include einbinden ?

Habe mich bei dem eigendlichen Fehler falsch ausgedrückt,
ihn aber auch schon selber behoben, lag an falschen Schreib/Leserechten von den geupdatetetn Dateien ;)


Offline pcwacht

  • Posts: 2923
  • Gender: Male
    • Dutch ICT info
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #3 on: January 03, 2012, 04:02:17 PM »
Ein manier:
Mach am ende deine code etwa wie:
Code: [Select]
$database = new->database();als letzte regel

Oder schaue einige modulen an wie dort mit wb->database communciert wurden.
Und dieser soll auch hilfen:
http://www.websitebaker2.org/de/hilfe/entwicklerhandbuch/beispielmodul-hello-world.php

Spass,
John
http://www.ictwacht.nl = Dutch ICT info
http://www.pcwacht.nl = My first
both still work in progress, since years.....

Offline Paule08

  • Posts: 36
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #4 on: January 03, 2012, 04:08:41 PM »
Hallo,
bekomme dann leider einen Fehler:
Parse error: syntax error, unexpected T_OBJECT_OPERATOR, expecting T_STRING or T_VARIABLE or '$' in /var/www/virtual/meineurl.de/htdocs/modules/code/view.php(30) : eval()'d code on line 78

Danke für den Link, werde mich da mal etwas einlesen,
habe leider noch nicht soviel Ahnung von PHP/MySQL.


Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 3025
  • Gender: Female
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #5 on: January 03, 2012, 04:09:38 PM »
a.: nein, die config.php lässt sich nicht einfach includieren.

b.: lege Deine Tabelle in die WB-Datenbank und nutze für SELECT/UPDATE/INSERT - Statements die Methoden des standard DB-Objektes von WebsiteBaker. (am Begin des Code2-Abschnittes einfach per global $database; importieren und dann nutzen: $database->query($sql) etc.)

c.: Soll die eigene Tabelle weiterhin in einer extra DB verbleiben, so ist am Ende des Code-Abschnittes folgende Zeile notwendig:
mysql_ping($_GLOBALS['database']->db_handle);
um auf den originalen WB-Datenbankhandle zurückzuschalten.
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf Hirn vom Himmel !

Offline Paule08

  • Posts: 36
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #6 on: January 03, 2012, 04:29:18 PM »
Entschuldigt mich für mein Unwissen,
habe den Code an verschiedenen Stellen im Code getestet und erhalte dann eine Meldung nach dem "Absenden":
Code: [Select]
Warning: mysql_ping() expects parameter 1 to be resource, null given in /var/www/virtual/meineurlat.de/htdocs/modules/code/view.php(30) : eval()'d code on line 64

Fatal error: Call to a member function fetchRow() on a non-object in /var/www/virtual/meineurl.de/htdocs/modules/wysiwyg/view.php on line 22

Am liebsten wäre es mir ja, wenn ich die gleiche Datenbank nutzen könnte wie wb,
aber nur diese zu nutzen:
global $database;  $database->query($sql)
klappt auch nicht, vermute weil ich auf das "etc." nicht komme ;)
( Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'vu2017'@'localhost' (using password: NO) in /var/www/virtual/meineurl.de/htdocs/modules/code/view.php(30) : eval()'d code on line 23
Die Datenbank konnte nicht erreicht werden! )

Weiß auch nicht wo er die Daten dann hernimmt.


Offline badknight

  • WebsiteBaker Org e.V.
  • **
  • Posts: 819
  • Gender: Male
    • pinzweb
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #7 on: January 03, 2012, 04:41:15 PM »
Am liebsten wäre es mir ja, wenn ich die gleiche Datenbank nutzen könnte wie wb,
aber nur diese zu nutzen:
global $database;  $database->query($sql)
klappt auch nicht, vermute weil ich auf das "etc." nicht komme ;)


hier ein Beispielcode:

Code: [Select]
global $database;

$sql = "SELECT `FELD` FROM  ".TABLE_PREFIX."TABELLE WHERE 1=1";
$query = $database->query($sql);

if($query ->numRows() > 0)  {
// Eintrag vorhanden
    while( false != ($row = $query_users->fetchRow()) ) {
// Insert user info into users array
echo $row["FELD"];
}
} else {
// Kein eintrag vorhanden
}

beachte bitte, das der code nur als Anhalt dient und keine richten bezeichnungen beinhaltet
Ich würde gern die Welt verändern, doch Gott gibt mir den Quellcode nicht...

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 3025
  • Gender: Female
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #8 on: January 03, 2012, 05:33:02 PM »
Sorry, ich hatte oben einen Tipfehler drin..  :-(

sollte heisen:

mysql_ping($GLOBALS['database']->db_handle);
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf Hirn vom Himmel !

Offline Paule08

  • Posts: 36
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #9 on: January 03, 2012, 06:30:20 PM »
@DarkViper ,
funktioniert leider nicht, kommt die gleiche Meldung wie zu Beginn.

Das mit der WB Datenbank bekomme ich nicht hin, gibt es da irgendwo eine Art Tutorial, wie man über WB in die Datenbank schreibt / ließt ?


Code: [Select]
global $database;

$sql = "SELECT `username` FROM  ".TABLE_PREFIX."users";
$query = $database->query($sql);

if($query ->numRows() > 0)  {
// Eintrag vorhanden
    while( false != ($row = $query_users->fetchRow()) ) {
// Insert user info into users array
echo $row["username"];
}
} else {
// Kein eintrag vorhanden
}
Beispiel:
Aus dem Beispiel von oben, sollte mir doch die Usernamen darstellen oder ?
Bei mir kommt nur der Fehler.


Gruß & Danke für die Hilfe

Edit:
Seltsam, wenn ich manuell die gleichen Daten wie von WB eingebe kommt der Fehler nicht ;)
« Last Edit: January 03, 2012, 06:51:34 PM by Paule08 »

Offline badknight

  • WebsiteBaker Org e.V.
  • **
  • Posts: 819
  • Gender: Male
    • pinzweb
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #10 on: January 03, 2012, 06:45:15 PM »
wie gesagt, es ist nur ein Beispiel code der schnell geschrieben / kopiert wurde.. gerade gesehen, das ich da den Fehler habe:

Code: [Select]
$row = $query_users->fetchRow()
ändern in
Code: [Select]
$row = $query->fetchRow()
das beste Tutorial ist:

http://www.websitebaker2.org/de/hilfe/entwicklerhandbuch/beispielmodul-hello-world.php
Ich würde gern die Welt verändern, doch Gott gibt mir den Quellcode nicht...

Offline Paule08

  • Posts: 36
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #11 on: January 03, 2012, 08:27:19 PM »
Jap, habe nun alles soweit hinbekommen, zumindest treten keine Fehler mehr auf etc.
Nun hab ich eine "Code" Seite erstellt, wo die Termine ausgegeben werden.
Funktioniert auch alles und wollte das nun ins Template einbinden.

Code: [Select]
<div id="naechste_termine">
<?php
                                $get_content 
$database->query("SELECT content FROM ".TABLE_PREFIX."mod_code WHERE section_id = '137'");
                                
$fetch_content $get_content->fetchRow();
                                
$content = ($fetch_content['content']);
                                
$wb->preprocess($content);
                                echo 
$content ;  ?>

</div>

Allerdings erhalte ich dann nur den Code der Seite, der nicht ausgeführt werden.
Wie ändere  ich das ?
Dann wäre ich Glücklich ;)

Gruß

jacobi22

  • Guest
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #12 on: January 03, 2012, 10:45:30 PM »
du verwendest HTML und PHP-Code

schreib das mal so:

Code: [Select]
<?php
echo "<div id=\"naechste_termine\">";

                                
$get_content $database->query("SELECT content FROM ".TABLE_PREFIX."mod_code WHERE section_id = '137'");
                                
$fetch_content $get_content->fetchRow();
                                
$content = ($fetch_content['content']);
                                
$wb->preprocess($content);
                                echo 
$content ;  
echo 
"</div>";
?>

Offline Paule08

  • Posts: 36
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #13 on: January 04, 2012, 03:38:13 PM »
Hallo,
daran liegt es leider nicht.
Im Original - Template sieht der Code so aus:

Code: [Select]
<div id="untertermine">
                               <?php
                                $get_content 
$database->query("SELECT content FROM ".TABLE_PREFIX."mod_wysiwyg WHERE section_id = '140'");
                                
$fetch_content $get_content->fetchRow();
                                
$content = ($fetch_content['content']);
                                
$wb->preprocess($content);
                                echo 
$content ;  ?>

                        </div>

D.h. mit WYSIWYG - Inhalten funktioniert das schon einwandfrei, aber nun habe ich einen Code - Block, der aber nun als "Text" ausgegeben wird.

Gruß

jacobi22

  • Guest
Re: 2.8.2 Sicherheitsverletzung bei PHP Code
« Reply #14 on: January 04, 2012, 06:21:41 PM »
diese Mischung aus HTML und PHP-Code erzeugt bei mir Fehler beim Speichern des Codes wegen dem <.
darum die Umwandlung in PHP. Damit wird mir dann der DIV-Block angezeigt, da ich deine MySQL-Tabelle nicht habe, fehlt mir dann natürlich der Inhalt.
Es wundert mich, das du diesen Eingabefehler nicht bekommst. Hast du mal das Code2 Modul probiert? Ich habe auf meinem Testsystem beide Module gleichzeitig installiert und in beiden Modulen gleichzeitig und auch einzeln getestet. und es funktioniert in beiden Modulen mit meiner Schreibweise.
Das Code-Modul kürzt <?php und ?>, dies steht im Normalfall ja auch zu Beginn und am Ende, bei dir aber nicht, darum wird dein PHP-Code nachher als Text ausgegeben.

 

postern-length