Beiträge von cottton

    Ich wüsste ja zu gern, was Du da genau vor hast. Der Benutzer soll PHP-Code eingeben können und der soll dann ausgeführt werden? Von so etwas habe ich noch nie gehört und ich frage mich, ob es keine Alternative ohne solche sicherheitskritischen Aktivitäten gibt.

    Stef when das so ist, dann rate ich definitiv zu Template engines.

    Denn damit kannst Du loops ect umsetzen, ohne PHP.

    Mit str_replace bist Du da sehr limitiert.

    Bei meinem Projekt können die User über eine Schnittstelle den HTML- & PHP-Code ihres Formulars auslesen und dann über ihr Script ausführen/nutzen. Im HTML-Code steht noch PHP-Code der entweder die Erfolgs- oder Fehlermeldung ausgibt.

    Templates.

    Wenn ich das richtig verstanden haben, dann solltest Du dem User templates zur Verfügung stellen.


    Bsp: twig

    https://github.com/twigphp/Twig


    Docu: https://twig.symfony.com/doc/3.x/


    ---


    Deine User bekommen dann das template geladen, das sie verändern können.

    Und Du kannst im script die templates laden und parsen und ausgeben lassen.

    Und HTML ohne php ist auch besser für die Augen =)

    Gegenfrage: warum musst Du die alle Löschen?

    Werden die nicht mehr gebraucht? (könnte man in den /tmp/ ordner packen)

    Temporär erstellt, um die Bilder z.B. an den Browser zu senden? (könnte man per <img> tag mit base64 string machen)

    ...

    Ich frage, weil ich automatisiertes Dateien und Ordner löschen nicht mag.

    Muss nicht, aber könnte viel schief gehen =)

    Like: oops, wo ist den mein ganzes Projekt hin?


    Statt preg_replace würde ich nur den filename von dem eingehenden String holen.


    Wenn jemand also "../../path/to/my_file.txt" gibt,

    dann alles nach dem letzen "/".


    Bsp.:

    PHP
    1. $file = '../../path/to/my_file.txt';
    2. $filename = pathinfo($file,PATHINFO_BASENAME); // my_file.txt

    Bestimmte Zeichen verbieten ist Mist. Dann musst Du ständig hinderher sein, mit updates ... und das will keiner.

    Mit dem Filename kann nichts passieren (nichts, was ich kenne. Kann mich irren.), und Du brauchst nichts zu warten.


    EDIT: Sicherheitsproblem:

    alle vars mit htmlspecialchars() ausgeben. (EDIT: um z.B. XSS zu unterbinden. Alle Daten sind als Böse anzusehen. Auch die aus Deiner db.)

    Also

    PHP
    1. <a href="includes/downloadFile.php?file=<?php echo $ausgabeDatei ?>" type="submit" class="btn btn-info btn-fill pull-right btn-sm">Download</a>

    zu

    PHP
    1. <a href="includes/downloadFile.php?file=<?php echo htmlspecialchars($ausgabeDatei) ?>" type="submit" class="btn btn-info btn-fill pull-right btn-sm">Download</a>

    Der bessere Weg ist es eine Möglichkeit für den Sysadmin zu haben das Passwort zurückzusetzen

    • Das System erstellt ein neues Passwort und sendet es direkt dem Nutzer zu, sodass der Admin es nie sieht
    • Der Admin kann ein neues Passwort eintragen und muss es dem Nutzer manuell übermitteln

    Danach kann der Nutzer sich anmelden und sein Passwort wieder auf sein Wunschpasswort ändern

    Find ich nicht so prikelnd.

    New pw per email?

    New pw per admin?

    Nope. New pw by user - yes.

    GET, wenn Du etwas abfragst, ohne zu verändern

    POST, wenn etwas verändert wird.

    Gibt noch PATCH und PUT ... aber einfach mal im Netz suchen, wenn es interessiert.


    Sensible Daten immer POST (login, ...).

    Suchanfragen GET (z.B. www.[...].de/movie/{id} order www.[...].de/movie?genre=scifi&name_like=abcdef)

    Warum willst Du denn die SESSION nutzen?


    Zum "merken" der letzten Abfrage?

    Das kann eine URL auch. Also Statt SESSION, eine GET Variable wie z.B.: "?suchbegriff=abc".


    Und Du nutzt ja schon eine GET var. Also warum die SESSION :)


    BTW: dann wird es auch einfacher.

    Ich würde auch empfehlen, die Eingaben (GET, POST ...) in Variablen zu packen.

    Niemand (also ich jedenfall nicht) liest gerne IFs mit GET ect.

    Am Bsp:


    Wenn jetzt ein 2ter Button reinkommen kann,

    dann checkst Du den genauso.

    Muss halt nur entscheiden, wer prio hat, falls beide (warum auch immer) reinkommen.


    Oder, wenn Du keine Suche reinbekommst, dann kannst Du natürlich auch by default alle ausgeben.

    PHP
    1. if ($suchbegriff !== null) {
    2. // Search by the given string.
    3. } else {
    4. // Search all.
    5. }

    Bin mir nicht sicher, ob ich die Frage richtig verstehe.

    Ein Webservice ist doch ein Service, der übers Netz erreichbar ist. Also eine API (z.B.).

    Und wenn ich Aufgabe X erledigen muss, und eine API das kann, dann nutz ich sie.


    Meinst Du evtl. micro services?

    Ich brauche das Array jedoch mit fortlaufenden Keys ohne eine Lücke.

    Das geht mit array_values().

    Meine Frage dazu ist: Gibt es eine Funktion mit der ich alle Array Keys um 1 hochzählen kann?

    Mit array_values() bekommst Du alle values.
    Mit range erstellst Du ein Array mit values von 1 bis {soviele, wie es values gibt}.

    Mit array_combine() kombinierst Du die keys mit den values.

    JTW ist sehr schönes Thema.

    Aber man muss es verstehen.


    Erstmal Link, zu dem Repo, welches ich empfehlen würde (und was auch wirklich "simple" ist =))

    https://github.com/firebase/php-jwt/


    Und Website https://jwt.io/, bei der Ich damals angefangen habe (Click auf "Learn more about JWT").


    In kurz und einfach (versucht) :

    - Json Web Token (JWT) werden vom Server z.B. nach erfolgreichem Login erstellt.

    - JWT sind (vom LoginServer) signiert (wenn man die Payload ändert, dann passt die Signatur nicht mehr).

    - der Server alleine kann die JWT signieren (mit private key).

    - jeder, der den JWT nun bekommt, kann sicher sein, dass die Daten darin nicht verändert wurden (weil signiert).

    - Die Signatur wird per public key geprüft.

    - Ein JWT sollte eine Verfallszeit haben.

    - Der Empfänger eines JWT muss diesen validieren (Signatur, noch valide, schon valide (ja, geht auch), ect).

    - Wer den JWT hat, hat die Berechtigung, bis dieser Abläuft.


    Wichtig: ein JWT sollte niemals sensible Daten beinhalten.

    Man liest ab und zu von verschlüsselten Daten im JWT, aber das ist mMn Mist. Da gehört nichts sensibles rein.


    Wo nutze ich JWT: Mirco Services z.B.

    Ein Auth login server, und viele unabhängige Services.

    Der User meldet sich an (Login Website mit call auf Auth Server) und bekommt einen JWT.

    Mit dem Token kann er nun zu jedem Micro Service. Und die wissen, dass er User das darf, was da drin steht (roles, groups, ...).


    ---

    Spannendes Thema, eigtl. gar nicht so schwierig, aber leider zu viel, um es hier alles runter zu schreiben.

    Daher hier einfach mal paar Links zu Kommentaren, die ich schon mal geschrieben habe (warum auch noch mal schreiben :D )


    JWT Client Bsp (und Erklärung, warum man die Daten darin nicht wiederverwenden sollte)

    https://github.com/firebase/ph…83#issuecomment-447845729


    Client-Server Bsp (und mehr).

    https://github.com/firebase/ph…19#issuecomment-525464922


    Mehrere JWT pro Benutzer?
    https://github.com/firebase/ph…31#issuecomment-433397553



    Viel Spass (das Thema macht auch Spass =) )

    Naja, ich würde in dem Fall auch nur das Array mit Gross- und Kleinbuchstaben füllen.

    Die Zeile $plainTextArray = str_split(strtolower($plainText));musst Du dann natürlich ändern, damit nicht alles auf Kleinbuchstaben gezwungen wird.

    Also strtolowerweg.


    Jetzt fehlen Dir ja dann auch noch andere Zeichen, Wie z.B. der Punkt, Komma, ... .

    Musst Du dann eben noch in das $alphabet array packen.


    BTW, was ich schon eher hätte erwähnen können: range()

    https://www.php.net/manual/de/function.range.php

    Siehe comment: https://www.php.net/manual/de/function.range.php#114493

    Code
    1. echo implode("",range("q","9 "));
    2. // prints qponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654

    Sieht interessant aus. Evtl kannst Du damit ein array mit Sonderzeichen erstellen.

    Ich empfehle sowas immer ohne HTML zu schreiben.

    Schreib Funktionen, oder Objekte, aber keine Loops mit HTML :)


    $alphabetkannst Du schon mal generieren.

    So in etwa (ungetested)

    PHP
    1. $alphabet = [];
    2. // Note: start with $i = 1 for 1-26 array offsets.
    3. for ($i = 1, $char = 'a'; $i <= 26; $i++) {
    4. $alphabet[$i] = $char;
    5. // Note: PHP gets the next char in alphabet on ++.
    6. $char++;
    7. }

    Und schon diese kleine Sache packst Du einfach schon mal weg in eine Funktion (z.B: generateAlphabetArray()).


    Als nächstes willst Du ja en- und de-coden.

    Also wird es sicher eine soUndSoEncode und soUndSoDecode Funktion geben.


    Diese beiden werden dann sicherlich gemeinsamen Code nutzen (können).

    Also packst Du diesen Code, wenn auch nur kleine Loops ect, in eine Funktion,

    die beide dann nutzen können.


    Oft schreib ich mir erstmal runter, wie ich das Ganze dann eigentlich aufrufen will,

    ohne zu wissen, was mich erwaret.

    In etwa (als Objekt (OOP)):

    Code
    1. // clear text example input
    2. $text = 'foo bar baz';
    3. // encode
    4. $caesar = new Caesar();
    5. $encryptedText = $caesar->encrypt($text); 
    6. // decode
    7. $clearText = $caesar->decrypt($encryptedText);

    So wüsste ich schon mal, was ich für (public) Funktionen haben wöllte.

    Dir selbst oder jemand, der es später nutzen würde, ist es dann relativ egal, was da drin passiert.

    Hauptsache der Call ist "angenehm".


    Wenn Du das dann als Webseite anzeigen willst, dann ist der Einbau ja recht einfach.

    Es ist aber schön getrennt - Funktion (Caesar) und Controller (Input|output (HTML, ....)).

    createFromFormat brauchst Du nicht, wenn es das datetime format aus der db ist.

    2021-05-01 12:00:00 = Y-m-d H:i:s

    und damit kommt PHP \DateTime klar.


    BTW; ich würde keine deutschen (var, function, db.column, ...) namen vergeben. Engl. is the way to go.
    Was, wenn Du mal hilfe auf z.B. stackoverflow oder anderen engl. sprachigen Seiten suchst? Dann versteht keiner den Code.

    Bissl spät, aber ...

    Jain.
    Muss bissl ausholen:

    Ich hab hier im Forum bei NULL angefangen.

    So um die 3 Jahre selbstständig PHP, MySQL, HTML, CSS, JS gelernt und ein eigenes Projekt gestartet (furchtbarer Code, aber viel dabei gelernt).

    Bei einer Firma angefragt, und bekam als Antwort: "Naja, OOP muss schon sein".

    Also ~1 Jahr OOP (objektorientierte Programmierung) gelernt.

    Neues, privates Projekt angefangen, um aktiv OOP einzusetzen.

    Wollte dann nen Zettel haben, um was vorzeigen zu können. Hab das bei ILS gemacht.


    Zum Fernstudium:
    Es wird wurde (vor 5-6 Jahren) Grundwissen vermittelt, dabei aber alter Code verwendet. Also z.B. mysql_functions statt mysqli_ oder PDO.

    BTW: nutzt PDO. Ich sag es immer wieder - es ist einfacher :)

    Die Tests waren langweilig - ich hab bei den Testbögen neben die Fragen geschrieben, dass hier und da SQL-Injections möglich wären usw.

    Das war so mein "Spass" bei der Sache - Fehler finden :x

    Naja, jedenfalls hatte ich dann einen Zettel, der aussagte, dass ich einen Onlinekurs abgeschlossen hatte.

    Ich hab dann weiter selbständig gelernt. War ja mein "Hobby", hat ja Spass gemacht.


    Ende vom Lied:

    Hilft der Zettel bei der Job suche? Kann sein. Aber am Ende zählt, was Du auf Fragen im Gespräch antworten kannst. Eigene online Projekte helfen natürlich auch.

    Ist es das Geld wert? Nein. Hab es vom Amt bezahlt bekommen. Aber selbst hätte ich es nicht bezahlt, für das, was man dafür bekommt.


    wie hoch ist der Lerneffekt vorausgesetzt


    Ich bekam Einführung von ganz am Anfang.
    Als xampp auf Windows installieren, "Hello World" im Browser ansehen, usw.

    Also kannst Du theoretisch ohne Vorwissen da rein gehen.

    Aber das Grundwissen - also was ist PHP, xamp, SQL, ... und wie spielt das alles zusammen - das kann und sollte man sich im Netz zusammen suchen.

    Z.B. hier: https://www.php-kurs.com/ (die PHP website dieses Forums)


    ---

    Um meine Geschichte zum Ende zu bringen:

    Ich wollte einen Job. Ich hab sogar ein locales Bewerbungstraining über das Amt mitgemacht.

    Die fragten mich, was ich hier (beim Training) will. Aber ich meinte nur, ich mach jetzt alles mit, was kommt.

    Am Ende des Tranings sollten wir uns 3 mögliche Praktikumsplätze suchen. Also Telefon in die Hand und los.

    Hatte 2, brauchte noch eines. Bei der dritten dachte ich "da kommste niemals rein, bei dem, was die schon gemacht haben".

    Und ZACK - Rückruf, Einladung zum Gespräch, Praktikum. Später dann direkt Festeinstellung.


    Und jetzt sitz ich hier, immernoch bei der gleichen Firma mit dem besten Chef der Welt :D

    und schreibe im Forum, in dem ich bei NULL angefangen hab, wäred der Arbeitszeit :x (welche aber dynamisch geregelt ist)


    Was will ich damit sagen: nimm alles mit, wenn es Dich nichts kostet, oder Geld keine Rolle spielt.

    Es braucht manchmal nur einen kleinen Zufall.

    Hätte ich dieses blöde Bewerbungstraining nicht gemacht, dann hätte ich diese Nummer nie angerufen.


    ---

    BTW: im Job lernst Du sowieso erst Dinge, die Dir keiner vorher beibringen kann|will.

    Schon alleine die eingesetzten Tools in der Softwareumgebung (dev) ändern sich über die Jahre, und von Firma zu Firma.

    Aber das ist kein Problem, sondern Entwicklung.

    Neues Projekt, oder Problem? Suche im Netz nach Lösung, Testen, Syntax ect lernen, Einsetzen.

    Als Entwickler lernst Du Dir selbst zu helfen. Vor dem Job noch immer im Job.


    Viel Glück.

    Kann nicht genau folgen.

    Zitat

    00:00 – 00:30 123

    Soll das angeben, wie viele User zu der Zeit angemeldet waren?

    Also 123 User in der halben Stunde?

    ---

    Du kannst GROUP BY nutzen. Zwar nicht mit halben Stunden (evtl mit nem "Trick"),

    aber ganz einfach über das Format:

    SQL
    1. GROUP BY DATE_FORMAT(`created_at`, '%Y-%m-%d %H')


    Example:

    SQL
    1. -- SET @date_format := '%Y-%m-%d'; -- Get grouped counts by hour.
    2. SET @date_format := '%Y-%m-%d %H'; -- Get grouped counts by hour.
    3. -- SET @date_format := '%Y-%m-%d %H:%i'; -- Get grouped counts by min.
    4. SELECT
    5. -- select the datetime by format
    6. DATE_FORMAT(`created_at`, @date_format) AS `created_at`,
    7. -- count the amount for that formatted datetime group
    8. COUNT(`user_id`) AS `count`
    9. FROM `user_login_log`
    10. GROUP BY DATE_FORMAT(`created_at`, @date_format);


    Test: http://sqlfiddle.com/#!9/aac84a/4