Mehrere IF-Abfragen inkl. Mysql_query

Was hat das Puffern der Ausgabe deiner Meinung für Nachteile?
Meine Aussage bezog sich auf den speziellen Fall hier, allgemein würde ich Output Buffering per se nicht als schlecht hinstellen.
So ist es vielleicht klarer:
Wenn man die Ausgabe puffert, nur um einen Header setzen zu können, sodass man weiterleiten kann, nachdem man bereits X Bytes (gepufferte) Ausgabe erzeugt hat, zeugt von schlechter Codequalität.

Wozu eine Ausgabe erzeugen, auch wenn sie nie gesendet wird?
Das wäre, als wenn ich bei einem Taschenrechner-Programm zwei Zahlen auf allen möglichen Weisen miteinander verrechne (+, -, /, *) und erst am Ende feststelle, dass der Nutzer nur einen von den Operatoren ausgewählt hatte.

All diese Probleme kommen aber auch daher, dass keine Trennung zwischen Logik und View stattfindet.

Zu den Meta-Tags: Jetzt weiß ich, wie du es gemeint hattest. Sie als Sicherheitsbarriere zu gebrauchen, würde ich aber mir äußerster Vorsicht genießen (d. h. gar nicht)!
Wo wir schon beim Thema Sicherheit sind: Nach einer header()-Weiterleitung am besten immer exit() aufrufen.
 
Ich stimme 100%ig zu. Hier wird die Weiterleitung anscheinend (bin mir ob der Qualität des Codes nicht klar) gebraucht, um die Formular-Daten neu zu laden. Das Trennen von Logik und Ansicht hätte hier enorme Vorteile:

1. Update findet statt, bevor die Daten aus der DB gelesen werden.
2. Wegen 1. werden immer die letzten gespeicherten Daten im Form dargestellt.
3. Eine Weiterleitung wird dadurch komplett obsolet. Keine Lücken, die umgangen werden müssten, kein zusätzlicher Inhalt der übertragen werden muss.
4. Code wäre aufgeräumter und leichter zu warten.

Aber der TO hat ja schon anmerken lassen, dass es bei ihm nicht um Sicherheit, Eleganz und Wartbarkeit geht ;-)
 
Hallo Leute
Vorerst vielen herzlichen dank für die Infos und Tipps.
werde mir den Link von mermshaus durchlesen! :)

Ich bin System Techniker welcher für die Firma eine Kunden-Verwaltungs-Lösung erstellen soll(ohne dabei die Sicherheit des Codes zu berücksichtigen - da diese Web-Seite nur im Intranet verfügbar ist).
Habe 2 Semester lang(vor einem Jahr) PHP / Mysql in der Schule durchgenommen bzw. so hat man es mir damals gezeigt.. (habe das Fach mit der Bestnote abgeschlossen..) Dachte da ist mehr dahinter xD

Bisher habe ich bereits eine "Applikationen" in unser Intranet erfolgreich integriert. (Auswertung von Datenbankeinträge).

Der Rest des Codes, was nach dem FORM-Abschlusstag kommt ist nur der Abschlusstag des BODY und des HTML.. xD

Und ja ich weiss ich bin kein Held im Programmieren..^^

Grüsse
Alessandro
 
ohne dabei die Sicherheit des Codes zu berücksichtigen - da diese Web-Seite nur im Intranet verfügbar ist
Das ist der größte Fehler, den man begehen kann!!

Es geht nicht "nur" um die Sicherheit, sondern auch darum, dass deine Applikation keine einzelnen Anführungszeichen in Texteingaben (die in SQL-Queries eingefügt werden) erlaubt!
 
Zuletzt bearbeitet:
Also, bei dem Oberthema, das häufig einfach als „SQL-Injection“ verkürzt wird, geht es eigentlich nicht nur um die Sicherheit. Das ist nur das Argument, mit dem man die Leute in der Regel zum Aufhorchen bringt.

Eigentlich ist es aber ganz allgemein eine Kontextwechsel-Sache. Wenn Daten in ein anderes Format (SQL-String, HTML, …) eingefügt werden, dann geht das nur dann unter allen Umständen fehlerfrei, wenn die Syntax des Zielformats befolgt wird. Simples Beispiel: Ein kleiner-als-Zeichen "<" muss in einer HTML-Datei als "&lt;" geschrieben werden, weil das Originalzeichen Teil der HTML-Syntax ist und von auslesenden Programmen deshalb gegebenenfalls ungewollt als Beginn eines HTML-Tags interpretiert würde.

Bei SQL ist das ähnlich. Das Standardbeispiel dort ist der gute Mr. O'Brian.

PHP:
$name = "O'Brian";
$query = "SELECT … FROM table WHERE name='" . $name . "'";
// SELECT … FROM table WHERE name='O'Brian'

Die Query ist syntaktisch fehlerhaft, da das DBMS den name-String bereits nach dem "O" für beendet hält. Das nachfolgende "Brian'" kann dann nicht mehr sinnvoll interpretiert werden, und das System löst einen Fehler aus.

Deshalb hat es im Prinzip nur sekundär etwas mit der Sicherheit zu tun, Kontextwechsel passend zu behandeln. Primär ist das notwendig, um eine fehlerfrei arbeitende Software zu schreiben.
 
Es geht nicht "nur" um die Sicherheit, sondern auch darum, dass deine Applikation keine einzelnen Anführungszeichen in Texteingaben (die in SQL-Queries eingefügt werden) erlaubt!
Die Query ist syntaktisch fehlerhaft, da das DBMS den name-String bereits nach dem "O" für beendet hält. Das nachfolgende "Brian'" kann dann nicht mehr sinnvoll interpretiert werden, und das System löst einen Fehler aus.

ok das muss ich berücksichtigen.. werde noch im Eingabefeld eine Beschränkung einbauen.. Vielen Dank!!! :)
 
Etwas aufgeräumt und mit Behandlung der Kontextwechsel könnte der Code von oben etwa so aussehen.

PHP:
<?php

// Kontextwechsel PHP -> HTML
$e = function ($s) { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); };

// Kontextwechsel PHP -> SQL
$sqle = function ($s) { return mysql_real_escape_string($s); };

$temp = (isset($_GET['kdnr'])) ? (int) $_GET['kdnr'] : 0;

if (isset($_GET['writevalues'])) {
    send_sql($globalDbName, "
        UPDATE
                kundentbl
        SET
                debitor         = '" . $sqle($_GET['debitor']) . "',
                firma           = '" . $sqle($_GET['firma']) . "',
                wnr             = '" . $sqle($_GET['wnr']) . "',
                start_date      = '" . $sqle($_GET['start_date']) . "',
                end_date        = '" . $sqle($_GET['end_date']) . "',
                ort             = '" . $sqle($_GET['ort']) . "',
                bm_abr_zeitr    = '" . $sqle($_GET['bm_abr_zeitr']) . "',
                fw              = '" . $sqle($_GET['fw']) . "',
                bm              = '" . $sqle($_GET['bm']) . "',
                mbk             = '" . $sqle($_GET['mbk']) . "',
                wp              = '" . $sqle($_GET['wp']) . "',
                ke              = '" . $sqle($_GET['ke']) . "',
                splitting       = '" . $sqle($_GET['splitting']) . "',
                miete           = '" . $sqle($_GET['miete']) . "',
                webservice      = '" . $sqle($_GET['webservice']) . "',
                schrankfservice = '" . $sqle($_GET['schrankfservice']) . "',
                lp              = '" . $sqle($_GET['lp']) . "'
        WHERE
                debitor = '" . $sqle($temp) . "'
    ");

    header('Location: kundenbearbeiten.php');
    exit;
}

$debitors = array();

if ($temp > 0) {
    $result = send_sql($globalDbName, "
        SELECT  *
        FROM    kundentbl
        WHERE   debitor = '" . $sqle($temp) . "'
    ");

    while ($row = mysql_fetch_array($result)) {
        $debitors[] = $row;
    }
}

?>


<form name="readvalues" method="get" action="kundenbearbeiten.php">
    Die Enter-Taste bewirkt NUR das Auslesen der Werte<br>
    Kundennummer: <input type="text" name="kdnr" maxlength="6" required="required">

    <input type="submit" name="readvalues"  value="Werte Auslesen">
    <input type="submit" name="writevalues" value="Werte in Datenbank schreiben">

    <?php foreach ($debitors as $debitor) : ?>

        Debitor:<br>
        <input type="text" name="debitor" value="<?=$e($debitor['debitor'])?>"><br>

        Firma:<br>
        <input type="text" name="firma" value="<?=$e($debitor['firma'])?>"><br>

        <!-- usw. -->

    <?php endforeach; ?>

</form>

(Das ist natürlich ohne Gewähr. Kann sein, dass mir was zu Bruch gegangen ist.)

Prepared Statements wären meinetwegen besser (mit PDO oder mysqli), aber funktional erfüllt das Escaping den gleichen Zweck.
 
So packst du das Problem genau falsch herum an! Was ist so schwer daran, Prepared Statements zu nutzen?
Ich seh nicht wirklich den Nutzen dieser Prepared Statements.. Ich sende ja nur ein Statement zum einschreiben der Werte.

@mermshaus:
Vielen Dank für deine Mühe :)
Hab nun mein Code angepasst -> Funktioniert auch so ^^

Die Checkboxen werden markiert, wenn in der Datenbank der Wert 1 ist.

Möchte ich nun die Werte in die Datenbank schreiben, so schreibt er mir bei allen Feldern wo Checkboxen sind(Muss Sie alle aktivieren) eine 0 in die Datenbank..
Wenn ich die Checkboxen leer lasse gibt er mir n Fehler in Datenbank..
Sprich wenn ich n hacken in die Checkbox rein tue, schreibt er mir ne 0 in die Datenbank und wenn ich kein hacken setze dann ist der Wert leer und somit kommt der Fehler in der SQL-Injection.

Habt Ihr ne Idee wie ich hinter den Checkboxen (ob hacken oder kein hacken) jeweils den Wert 1 oder 0 mitgeben kann..?

Hier mein code:
PHP:
<?php
$e = function ($s) { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); };
$sqle = function ($s) { return mysql_real_escape_string($s); };
 //Um die Fehlermeldung der Initial-Variable(welche Leer ist) zu unterdrücken setzen wir diese If-Schleife hinten dran.     
if (isset($_GET['kdnr']) AND $_GET['kdnr']){   
      $temp = $_GET['kdnr'];   
}   
echo "</br>";   
//hier werden die Werte in die Datenbank geschreiben
if(isset($_GET['writevalues']) AND $_GET['writevalues']){
                     send_sql($globalDbName,"
       UPDATE
               kundentbl
       SET
               debitor         = '" . $sqle($_GET['debitor']) . "',
               firma           = '" . $sqle($_GET['firma']) . "',
               wnr             = '" . $sqle($_GET['wnr']) . "',
               start_date      = '" . $sqle($_GET['start_date']) . "',
               end_date        = '" . $sqle($_GET['end_date']) . "',
               ort             = '" . $sqle($_GET['ort']) . "',
               bm_abr_zeitr    = '" . $sqle($_GET['bm_abr_zeitr']) . "',
               fw              = '" . $sqle($_GET['fw']) . "',
               bm              = '" . $sqle($_GET['bm']) . "',
               mbk             = '" . $sqle($_GET['mbk']) . "',
               wp              = '" . $sqle($_GET['wp']) . "',
               ke              = '" . $sqle($_GET['ke']) . "',
               splitting       = '" . $sqle($_GET['splitting']) . "',
               miete           = '" . $sqle($_GET['miete']) . "',
               webservice      = '" . $sqle($_GET['webservice']) . "',
               schrankfservice = '" . $sqle($_GET['schrankfservice']) . "',
               lp              = '" . $sqle($_GET['lp']) . "'
       WHERE
               debitor = '" . $sqle($temp) . "'
                                      ");
           
            //    echo "<meta http-equiv=\"refresh\" content=\"0; URL=kundenbearbeiten.php\">";
                        }
$debitors = array();
if ($temp > 0) {
    $result = send_sql($globalDbName, "
       SELECT  *
       FROM    kundentbl
       WHERE   debitor = '" . $sqle($temp) . "'
   ");
    while ($row = mysql_fetch_array($result)) {
        $debitors[] = $row;
    }
}               
?>
       <form name="readvalues" method="get" action="kundenbearbeiten.php">
        Die Enter-Taste bewirkt NUR das Auslesen der Werte<br>
        Kundennummer: <input type="text" name="kdnr" maxlength="6" required="required">
    
        <input type="submit" name="readvalues"  value="Werte Auslesen">
        <input type="submit" name="writevalues" value="Werte in Datenbank schreiben">
    
        <?php foreach ($debitors as $debitor) : ?>
             <br>
            Debitor:<br>
            <input type="text" name="debitor" value="<?=$e($debitor['debitor'])?>"><br>
    
            Firma:<br>
            <input type="text" name="firma" value="<?=$e($debitor['firma'])?>"><br>
    
             Waren Nummer:<br>
            <input type="text" name="wnr" value="<?=$e($debitor['wnr'])?>"><br>
           
            Start Datum:<br>
            <input type="text" name="start_date" value="<?=$e($debitor['start_date'])?>"><br>
           
            End Datum:<br>
            <input type="text" name="end_date" value="<?=$e($debitor['end_date'])?>"><br>
           
            Ort:<br>
            <input type="text" name="ort" value="<?=$e($debitor['ort'])?>"><br>
           
            Bestell NR:<br>
            <input type="text" name="bestellnr" value="<?=$e($debitor['bestellnr'])?>"><br>
           
            Abrecnungszeitraum:<br>
            <input type="text" name="bm_abr_zeitraum" value="<?=$e($debitor['bm_abr_zeitr'])?>"><br>
           
            FW:<br>
            <input type="checkbox" name="fw" "<?php
                if($debitor['fw'] == 1){
                            echo"value='1' checked='checked'";
                }
            else{
                            echo"value='0'";
            }
            ?>"><br>
           
            BM:<br>
            <input type="checkbox" name="bm" "<?php
                if($debitor['bm'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            MBK:<br>
            <input type="checkbox" name="mbk "<?php
                if($debitor['mbk'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            WP:<br>
            <input type="checkbox" name="wp" "<?php
                if($debitor['wp'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            KE:<br>
            <input type="checkbox" name="ke" "<?php
                if($debitor['ke'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            SPLITTING:<br>
            <input type="checkbox" name="splitting" "<?php
                if($debitor['splitting'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            MIETE:<br>
            <input type="checkbox" name="miete" "<?php
                if($debitor['miete'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            WEBSERVICE:<br>
            <input type="checkbox" name="webservice" "<?php
                if($debitor['webservice'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            SCHRANKFSERVICE:<br>
            <input type="checkbox" name="schrankfservice" "<?php
                if($debitor['schrankfservice'] == 1){
                            echo"value='1' checked='checked'";
                }
                else{
                            echo"value='0'";
                }
            ?>"><br>
           
            Kunden Bemerkung:<br>
            <input type="text" name="bm_abr_zeitraum" value="<?=$e($debitor['kd_bem'])?>"><br>
           
            Lieferpreis:<br>
            <input type="text" name="bm_abr_zeitraum" value="<?=$e($debitor['lp'])?>"><br>
            <!-- usw. -->
    
        <?php endforeach; ?>
    
    </form>

Wie man sieht, habe ich beim auslesen der Checkboxen jeweils eine if-schleife hintendran gesetzt, welche die ausgelesene Werte überprüft und jeweils dann in der Checkbox ein Hacken setzt oder nicht und den VALUE bestimmt.


Vielen Dank für die Unterstützung bisher.. :)
 
Ich seh nicht wirklich den Nutzen dieser Prepared Statements.. Ich sende ja nur ein Statement zum einschreiben der Werte.
U. a. keine Interpolation der Werte im SQL-Query-String => Mehr Sicherheit, sofern richtig angewendet

http://stackoverflow.com/questions/...ment-more-secure-than-using-the-common-escape
http://stackoverflow.com/questions/2099425/when-we-use-preparedstatement-instead-of-statement

Andersrum: Wieso solltest du bei der MySQL-Erweiterung bleiben? Sie wird in irgendwann den nächsten Versionen von PHP gänzlich entfernt.
Das ist, als würde ich mein Haus aus einfachem Holz bauen. Beim nächsten Orkan ist es weg.
 
Zurück