Beiträge von cottton

    Wo steht denn das Bsp/Howto?
    Auch mMn Quark.

    Was der Ersteller wohl bezwecken wollte (~Übersetzung)

    PHP
    session_start(); // starte session -- ganz normal , alles ok
    session_destroy(); // zerstöre alle sessions, denn ich will hier komplett von vorn anfangen. evtl bereits existierende sessions stören mich hier
    $_SESSION = array(); // session ist jetzt ein array -- das ist quatsch, denn session ist normalerweise immer ein array, wenn man es nicht "zwingt" etwas anderes zu sein

    Daraus folgt: wird die Loginseite aufgerufen, ist der Login futsch und man muss sich wieder neu anmelden.

    btw:
    $_POST["n"]
    und
    $_SESSION["n"]
    ect sind nichtsaussagend. Das sollte man vermeiden. Man muss schon irgendwie erkennen, was da in arbeit ist.
    =)

    Type Hinting wäre (für mich) schön, um Parameter zu prüfen.
    Es ist ja schon mal was, dass wie
    function name (array $arr)
    nutzen können.
    Also brauchen wir in der func nicht auf
    if( is_array($arr) )
    prüfen, da PHP ja nen Fatal raus haut. ...

    Die Andere Seite: ich würde ungern wie zB in C die vars behandeln müssen.
    Da ist das "Auto-type" von PHP schon ganz gut.

    jedenfalls - was man bei PHP vermeiden sollte ist:

    PHP
    function name ($para) {
        if (gettype($para) != 'float') {
            // emsg "das ist kein float" -- ist es aber doch ... also eben ein double =)
        }
    }

    Float und Double sind 2 unterschiedliche Typen, wenn auch beide Gleitkommazahlen bezeichnen.
    Man kann in PHP keine wirklich Typen echte Vergleiche nutzen.

    Ich kam darauf, weil ich beim Thema Type Hinting auf eine Klasse im Web gestoßen bin, mit der man das Verhalten simulieren kann.
    So wie in anderen Sprachen zB eine var
    int a = 0;
    definiert werden kann.

    In PHP wurde ja Type Hinting eingeführt -- allerdings sehr dürftig:

    Zitat

    Type Hints können nur vom Typen object und (seit PHP 5.1) array sein.


    Ich hätte mir zB

    PHP
    function name (string $str, double $a, float $f) {}


    gewünscht.

    Die Klasse, die das simuliert, hat funktionert. Dabei wurden Objekte genutzt.
    Mach allerdings keinen Sinn eine Simulation zu nutzen, da es verlangsamt und der Code nicht einfach wiederverwendbar ist.

    "Kann man machen, muss man aber nicht."

    Ich würde empfehlen zB ein Imputfeld name="datum" zu nutzen.
    Via PHP prüfst Du dann:
    - wurde das Formular abgesendet? (submit button gedrückt?)
    - sind alle wichtigen Felder ausgefüllt?
    - wenn ja -> Daten ins Array schieben:

    PHP
    $MeinArray[] = array( 
        'datum' => $_POST['datum'],
        'abc' => $_POST['abc'],
        // ...
    );

    Du kannst es aber auch so nutzen wie es momentan ist.
    Dann musst Du das Array vor der Schleife prüfen und evtl "leere" Ebenen löschen:


    Aber wie Du siehst - es ist verwirrend.

    foreach -- für jedes
    for(...;$i < * ; ...) -- solange $i kleiner als ....

    Du nutzt Schleifen. Und in der Schleife stehen Anweisungen zum speichern in der Datenbank.
    Hat Dein Array zB 5 Ebenen

    Code
    array(
      0 => // ebene 1 
      1 => // ebene 2
      2 => // ebene 3
      3 => // ebene 4
      'xyz' => // ebene 5
    )


    dann hast Du 5 Durchläufe.

    Also immer überprüfen ob die ganzen Eingaben auch sicher sind.


    Besser: immer davon ausgehen, dass Benutzereingaben "schlecht" sein können.
    htmlspecialchars() wird sehr oft bei Ausgaben (zum Browser) benutzt. Und man macht da einfach keinen Unterschied ob gut oder böse.
    Es wird einfach grundsätzlich jede Ausgabe so behandelt, als könnte sie was schlimmer enthalten.
    (es sei denn Du willst zB Javascript Code o.ä. ausgeben)

    Wegen dem $a = '';
    Das ist wegen der Verkettung im foreach()
    Bsp:


    Wenn Du testweise die Zeile mit $a = ''; entfernst, bekommst Du die Notice.

    Zum Thema Sicherheit gibt es (auch in anderen Sprachen) Grundsätze wie zB "Traue nie den Benutzereingaben".

    Das mMn wichtigste:

    Butzereingaben:

    Via PHP bekommst Du über die URL ($_GET) Daten.
    Eine URL "domain.com?key=1" ergibt in PHP:
    Schlüssel $_GET ['key']
    Wert 1

    Ähnlich bei $_POST: ein Formular wird über method="POST" abgesendet
    zB

    HTML
    <input type="text" name="key" value="" /> <!-- angenommen der nutzer trägt 1 in das textfeld ein -->


    in PHP bekommst Du nun
    Schlüssel $_POST ['key']
    Wert 1

    Diesen Daten darfst Du nun nicht trauen.

    Wenn Du zB $_GET['page'] zum einbinden einer Datei nutzt

    PHP
    include $_GET['page'];


    kann der Nutzer alles ihm mögliche "versuchen". Gibt er zB "meine-datei.xy" in die URL ein, dann würde Dein Script versuchen diese Datei einzubinden.

    Eine Lösung des Problems ist eine Whitelist.
    Das kann zB ein Array sein:

    PHP
    $pages = array(
        'home' => 'usw'
        'member' => 'usw'
    );
    // prüfen, ob angeforderte seite erlaubt ist:
    // wir sehen nach, ob im array $pages die ebene mit dem schlüssel $_GET['page'] existiert:
    if( isset($pages[$_GET['page']]) ) 
    {
        // ja, ist erlaubt
    }


    Ausgeben von Nutzereingaben:

    Angenommen Du erwartest über ein Formular via POST einen Benutzernamen ( $_POST['name'] ).
    Weil der Benutzer aber ein Schlechter Mensch ist, versucht er XSS (cross site scripting) -
    er versucht Javascript Code auf Deiner Seite auszugeben.
    Er gibt also keinen Namen ein, sondern Javascript Code:

    JavaScript
    <script>alert('test')</script>


    Somit steckt nun in
    $_POST['name']
    der Wert
    <script>alert('test')</script>

    Wenn Du diesen Wert jetzt unbehandelt auf Deiner Seite ausgibst:

    HTML
    Dein Name ist: <?php $_POST['name']; ?>


    dann steht im Quellcode (der Code den der browser umsetzt)

    Code
    Dein Name ist: <script>alert('test')</script>


    Der Browser zeigt also den Text Dein Name ist: an,
    und führt den Javascript Code alert('test') aus.

    Um das zu verhindern solltest Du die Ausgabe maskieren/umwandeln:
    (Auch wenn Du diese Benutzereingabe gespeichert hast, wieder lädst und ausgibst)

    HTML
    Dein Name ist: <?php htmlspecialchars($_POST['name']); ?>


    (siehe php.net http://php.net/manual/de/function.htmlspecialchars.php )

    Im Browser steht nun:

    Zitat


    Dein Name ist: <script>alert('test')</script>


    Aber im Quellcode:

    Code
    Dein Name ist: &lt;script&gt;alert('test')&lt;/script&gt;


    Wie Du siehst, wurde zB das Zeichen < zu &lt; umgewandelt.
    Der Browser bekommt also keine Javascriptanweisung, sondern formatierte Zeichen die er "einfach nur" anzeigen soll.


    Übrigens siehst Du sowas hier im Forum ständig. Wenn ich hier im Text Javascript einfüge:
    <script>alert('test')</script>
    dann behandelt das das Forum als Benutzereingabe und maskiert die Eingaben auf diese o.ä. Weise.
    Wäre das nicht der Fall, dann würde Dir Dein Browser eine Alertbox mit dem Text "test" anzeigen.

    Es gibt 1000 Wege =)
    hier mal eine:

    beachte die Kommentare

    Moin. Hab mal im script kommentiert:


    Um es zum laufen zu bringen brauchst Du nur

    JavaScript
    var Jetzt = new Date(ServerZeit);


    zu

    JavaScript
    var Jetzt = new Date();


    ändern.

    Ich denke aber Du wolltest anhand einer bestimmten Zeit starten und weiterzählen lassen.
    Das geht dann zB so:
    JS Funktiuon


    html:

    Gerade im Netz drüber gestolpert.
    Wenn $var true ist, wird false daraus. Wenn $var false ist, wird true daraus.

    Gesprochen heißt die Anweisung doch: $var ist nicht $var
    ... also das Gegenteil.

    Das !$var ist ja auch ein Ausdruck -- es ergibt also entweder true oder false.

    Denke ich also richtig, dass das hier das Gleiche ist?

    PHP
    $var = (!$var) ? true: false ;

    Oder steckt hier noch mehr dahinter?

    Das Problem ist, dass Du nicht prüfst, ob 'inhalt' gesetzt ist.

    Wie gesagt - die Schleife gehört IN die IF Anweisung.

    Ich kann mir vorstellen, was da passiert. Du hast eine for-Schleife und sprichst $MeinArray[$i] an.
    Aber die Ebene $i existiert wohl nicht ABER das SQL-Statement wird mit ~unfefined abgeschickt.

    Es sollte:
    Wenn 'abgesendet' und array nicht leer,
    dann für jedes (foreach) in array => SQL-Statement

    Wenn Du unbedingt die for Schleife nutzen möchtest, dann prüfe extra noch ob

    PHP
    isset( $MeinArray[$i] )

    Du hast eine Schleife, in der Du immer wieder prüfst, ob $_POST gesetzt ist und dein array nicht leer ist.

    So macht es mehr Sinn:

    PHP
    if (isset($_POST['abgesendet']) AND isset($MeinArray) AND !empty($MeinArray))
    {
        foreach($MeinArray as $key => $value)
        {
            // ...
        } 
    }


    foreach() ist auch angenehmner. Eine for Schleife ist aber nicht falsch. Wollte nur dass Du die foreach mal siehst, falls Dus noch nicht kennst.

    BTW: such mal bei Gelegenheit nach mysqli, denn mysql (ohne i für improved) gilt als veraltet und unsicher


    EDIT:
    Die IF Abfrage ist ok, auch wenn unnötige Klammern.


    Teste mal genau was in dem Array drin steck.
    Denn ein Array wie zB:

    Code
    array (
        0 => ''
    )


    ist nicht leer

    PHP
    isset($_POST['abgesendet'])

    prüft, ob die Ebene 'abgesendet' in $_POST gesetzt ist (existiert)

    PHP
    empty($MeinArray)

    prüft, ob $MeinArray leer ist

    Achtung - folgenes wird immer als leer gewertet:

    "",
    0, 0.00,
    "0", "0.00",
    der wert FALSE,
    der wert NULL,
    undefinierte variablen


    Prüfen, ob etwas NICHT leer ist:

    PHP
    if(!empty($var))
    // oder
    if(empty($var) === false)

    Das zeichen ! heisst soviel wie NICHT

    PHP
    if (isset($_POST['abgesendet']) AND isset($MeinArray) AND !empty($MeinArray))
    {
         // SQL Query
    }