kostenloser Webspace werbefrei: lima-city


Suche auf lima-city

  • in: Tabellenreihen per Klick ein-/ausblenden Javascript

    geschrieben von fuerderer

    Ich habe jetzt auf jsfiddle etwas versucht:
    https://jsfiddle.net/jzkeL5p9/13/

    Wenn man zuerst auf "Damen" drückt und dann auf "Model", wird die Zeile mit Model (Damen) eingeblendet und die Zeile mit Model (Herren) ausgeblendet. Drückt man zuerst auf "Herren" und dann auf "Model", verhält es sich umgekehrt.

    War das so gemeint?
  • in: Tabellenreihen per Klick ein-/ausblenden Javascript

    geschrieben von fuerderer

    Was genau ist das Problem? Wenn du für jeden Button eine Liste an id's bereitstellst, sollte alles funktionieren. Oder hast du Zeilen, die von mehr als einem Button betroffen sind?

    wadolowski schrieb:
    Gibt es einen Befehl/Code der die Zeilen vor dem ausführen neuer Befehle erst einmal in den Urzustand versetzt???
    Wenn zu Beginn z.B. alle Zeilen sichtbar waren, dann ist es kein Problem per Skript auch wieder alle sichtbar zu machen.

    Wenn du uns Beispielcode zeigst oder hochlädst und verlinkst was du versucht hast, können wir besser helfen.
  • in: Funktionen der Seite in externer SVG-Datei nutzen

    geschrieben von fuerderer

    Der Javascript-Code der SVG Grafik ist hier tatsächlich auf ein separates window-Objekt beschränkt, das wusste ich zuvor noch nicht.

    Ich hab jetzt eine mögliche Lösung erarbeitet.

    function.min.js:
    function example() {
    alert('Es hat geklappt');
    }
    document.addEventListener("DOMContentLoaded", function() {
      // Erstelle von außen explizit ein parent-Attribut, um danach von innen nach außen zugreifen zu können.
      document.getElementById("map").contentWindow.parent = window;
    });


    Skriptcode in der map.svg:
    document.addEventListener("DOMContentLoaded", function() {
      // Zugriff über das vorher erstelle parent-Attribut nach außen
      parent.example();
    });
    Das Konstrukt mit
    document.addEventListener
    kann hier entfallen, wenn du die Funktion example nicht sofort, sondern z.B. bei einem Klick ausführen möchtest.

    Allerdings habe ich es nur in Firefox 62.0 getestet. Du solltest einmal durchprobieren, ob auch andere Browser diese Lösung unterstützen.
  • in: Funktionen der Seite in externer SVG-Datei nutzen

    geschrieben von fuerderer

    Ich hoffe, ich habe die Beschreibung richtig verstanden. So auf Anhieb kann ich aber nur spekulieren.
    Vielleicht liegt es an der Ausführungsreihenfolge, vielleicht blockiert der Browser etwas aus Sicherheitsgründen. Das müsste man dann herausfinden.

    Könntest du einen Link zur Seite senden, wo man sich das Problem anschauen kann?
  • in: PHP E-Mail - Bei GMail steht "über Lima-Mail.de"

    geschrieben von fuerderer

    Dieser Hinweis entsteht denke ich nicht durch eine falsche Programmierung, sondern der Mailserver von Lima-City wird einfach bestimmte Header in die Mail einfügen die GMail dann entsprechend darstellt.

    Wenn du das unbedingt entfernen möchtest, gibt es eine Alternative:
    Du kannst dir eine beliebige Mailadresse z.B. bei GMail erstellen. Dann nutzt du PHPMailer oder eine andere Bibliothek um die Mail über SMTP zu versenden.
    Der Vorgang ist somit der gleiche, als würdest du die Mail über einen Mailclient wie Thunderbird senden und Google dürfte keinen Hinweis zu Lima-City mehr anzeigen.
  • in: Textdateien bei LimaCity

    geschrieben von fuerderer

    Was meinst du mit Textdateitools?

    Ist das eine fertige Software oder ein Framework bzw. eine Bibliothek? Dann bräuchte ich einen Link, denn über Google hab ich das nicht gefunden.

    Meinst du damit die PHP-Befehle zum Verarbeiten von Textdateien, also fopen, fwrite, fgets usw.? Dann solltest du Beispielcode liefern, denn prinzipiell funktionieren diese auf Lima-City.
  • in: Fehler bei if-elif-else in Python

    geschrieben von fuerderer

    horstexplorer schrieb:
    - Zeile 9 fehlt ein + hinter zwischen var und String.
    - Den Input immer in lowercase umwandeln, dann lässt sich damit leichter arbeiten egal wie die Schreibweise ist.
    So weit stimme ich horstexplorer zu.
    Die Korrektur der Bedingung stimmt aber leider nicht. Das Beispiel hätte zur Folge, dass immer nur das erste Wort verglichen wird und die anderen werden ignoriert.

    Nochmal auf Anfang, ich nehme die Abfrage von mehralsnurradio:
    if pi == 'Schlecht' or 'Nicht gut' or 'Nicht so gut':
    Das funktioniert so nicht, weil die Syntax von Python nicht wie die deutsche oder englische Grammatik funktioniert. Das "or" kann nur logische Ausdrücke verknüpfen und ein String wie 'Nicht gut' für sich alleine ist kein logischer Ausdruck.

    Richtig wäre es so:
    if pi == 'Schlecht' or pi == 'Nicht gut' or pi == 'Nicht so gut':


    Es gibt noch eine andere Möglichkeit, die ist etwas kürzer und gefällt dir vielleicht besser:
    if pi in ('Schlecht', 'Nicht gut', 'Nicht so gut'):
    Hier erstelle ich aus den drei Begriffen eine Liste und frage anschließend, ob die Benutzereingabe in der Liste enthalten ist.
  • in: Endungen nur von .php entfernen .htacess

    geschrieben von fuerderer

    Wenn ich den Code richtig verstehe, entfernt dieser keine Endungen sondern sorgt dafür, dass PHP-Dateien über URLs ohne Endung überhaupt aufgerufen werden können.

    Das was dir dann die Umleitung macht z.B. von /test.php auf /test müsste anders aussehen.

    Hast du noch andere Anweisungen bezüglich dieser Umleitung in der .htaccess?

    Und was passiert wenn du im Browser ein privates Fenster öffnest? Beobachtest du dann noch den selben Fehler?
  • in: Welche Sprachen bei Lima City?

    geschrieben von fuerderer

    HTML, CSS und Javascript sind ja clientseitige Sprachen. Da der Server hierbei nur die Dateien ausliefern muss, gibt es (abgesehen von Dateitypbeschränkungen) keine Einschränkungen seitens des Webservers.
    Was du mit SSI meinst ist mir nicht klar.

    Serverseitig bietet Lima-City nur PHP als Programmiersprache an. Man könnte noch SQL erwähnen, das ist als Abfragesprache ja auch eine Sprache.
  • in: Angemeldet bleiben

    geschrieben von fuerderer

    Wenn ich jetzt auf deiner Seite angemeldet bin und den Browser schließe und neu öffne, bin ich wieder abgemeldet. Das funktioniert also schonmal.

    Was noch nicht geht, ist die Funktion "Angemeldet bleiben".
    Dazu solltest du die folgenden Zeilen noch einmal überarbeiten:
    setcookie("bleiben", "no", time()-4000);
    setcookie("bleiben", "yes", time()+4000);
    Wenn du einem Cookie einen neuen Wert geben möchtest, ist es nicht notwendig, diesen vorher zu löschen. Die obere der beiden Zeilen kannst du dir also sparen. Setze einfach den neuen Wert mit neuem Ablaufdatum und die Sache ist gut.

    Der gleiche Fall ist dann nochmal drei Zeilen weiter unten, da solltest du auch die Zeile zum Löschen des Cookies entfernen.
  • in: Angemeldet bleiben

    geschrieben von fuerderer

    Hallo mehralsnurradio,

    das Problem müsste in der myaccount.php an dieser Stelle liegen:
    if ($_SESSION["login"] == "no") { 
    header("Location: /konto"); 
    }
    Wenn ein neuer Benutzer die Seite betritt, dann hat seine Session-Variable noch keinen Inhalt. Das bedeutet, dass das Feld "login" auch nicht "no" enthalten kann. Die Bedingung ist nicht erfüllt und du bekommst keine Weiterleitung.
    Besser wäre sowas:
    if (!isset($_SESSION["login"]) || $_SESSION["login"] != "yes") { 
    header("Location: /konto");
    exit;
    }


    Ich hoffe, dass du dieses Skript wirklich vorerst nicht produktiv einsetzt, denn dazu müsstest du noch einiges zum Thema Absicherung dazulernen.
  • in: Sehr grosse Dateien mit phpMyAdmin importieren

    geschrieben von fuerderer

    Gut, ich hab den Fall einmal an einem einfachen Beispiel nachgestellt.

    Folgende CSV-Datei ist gegeben:
    1,Max,Mustermann
    2,Karl,Otto
    3,Friedrich,Schmidt
    Falls du in deiner Datei als erste Zeile Überschriften hast, solltest du diese entfernen oder in PHP extra behandeln.

    Nun habe ich folgende SQL-Tabelle erstellt:
    CREATE TABLE `personen` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `vorname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
      `nachname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


    Und jetzt kommt der PHP-Code, der die Daten hier einträgt:
    <?php
    // SQL Zugangsdaten
    $db = new PDO("mysql:host=localhost;dbname=db12345", "db-user", "db-password");
    
    // CSV Dateiname
    $csv_file = fopen("./data.csv", "r");
    
    function bulk_insert($db, $dataset) {
      $values = implode(",", $dataset);
      // Spaltennamen anpassen
      $query = "INSERT INTO personen (id, vorname, nachname) VALUES $values;";
      $db->query($query);
    }
    
    $lnr = 1;
    $dataset = [];
    
    // Anzahl der Spalten anpassen
    $expectedcolumns = 3;
    
    while (($line = fgetcsv($csv_file)) !== false) {
      if (count($line) == $expectedcolumns) {
        $fields = [];
        foreach ($line as $field) {
          $fields[] = $db->quote($field);
        }
        $dataset[] = "(" . implode(",", $fields) . ")";
        if (count($dataset) >= 100) {
          bulk_insert($db, $dataset);
          $dataset = [];
        }
      } else {
        echo "Error on line $lnr: Expected $expectedcolumns columns but found " . count($line) . "\n";
      }
      $lnr++;
    }
    if (count($dataset) > 0) {
      bulk_insert($db, $dataset);
    }
    
    fclose($csv_file);
    Die wichtigen Stellen im Skript, an denen du noch etwas anpassen musst, habe ich kommentiert.

    Ich hoffe, ich konnte damit weiter helfen.
  • in: Sehr grosse Dateien mit phpMyAdmin importieren

    geschrieben von fuerderer

    Zu 2.:
    Ich hatte mir überlegt, lokal z.B. einen Apache mit PHPMyAdmin aufzusetzen. Du kannst dann das Upload-Limit in Apache und PHP (wo es vermutlich Probleme macht) selbst definieren und darüber die großen Dateien direkt in die externe DB bei Lima-City einspielen. Ich bin mir jedoch nicht sicher, wie es dabei mit der Performance aussieht, weil die Datenbankverbindung über eine große Strecke mit womöglich hohen Latenzen aufgebaut ist.

    Zu 3.:
    Du könntest per FTP die CSV-Datei auf den Webserver laden und ein PHP-Skript schreiben, das die CSV-Datei zeilenweise liest, parst (also die einzelnen Datenfelder extrahiert) und dann blockweise, z.B. immer 100 Datensätze gemeinsam in die DB einspielt.
    Zum Parsen der CSV-Datei gibt es wohl in PHP bereits Funktionen, jedoch habe ich damit keine Erfahrung.
    https://secure.php.net/manual/de/function.fgetcsv.php
    Und das Einfügen in die Datenbank geht mit MySqli oder PDO.
    Die genaue Implementierung hängt dann von dem Aufbau der Tabellen und der CSV-Dateien ab.
  • in: Sehr grosse Dateien mit phpMyAdmin importieren

    geschrieben von fuerderer

    Ich schmeiß mal verschiedene Ideen in den Raum:

    1. Die Dateien auftrennen in kleinere Teile.
    2. Das Upload-Limit erhöhen, z.B. mit einer lokalen PHPMyAdmin Instanz und damit direkt auf die Lima-City DB zugreifen.
    3. Ein eigenes (PHP-)Skript schreiben, das die Daten aus der CSV-Datei liest und in die Datenbank übernimmt.

    Nur, um eine Vorstellung zu bekommen: Wie groß sind denn nun die CSV-Dateien? Also gemeint ist die Dateigröße und/oder die Anzahl der Datensätze.
  • in: Error "allow_url_fopen=0"

    geschrieben von fuerderer

    Laut PHP Manual kann man die Option allow_url_fopen nicht über ini_set() verändern.

    Es bleiben also zwei Möglichkeiten:
    1. Den PHP-Interpreter umkonfigurieren
    2. Das Skript abändern, sodass es auf anderem Weg auf die Web-Ressource zugreift, das ist jedoch recht umständlich.

    Was meinst du mit „neuer Server“? Ist das der Lima-City Webspace? Falls ja, Free oder Premium (bei Premium: Welches Paket?)

    Im Free-Paket von Lima-City ist es nicht möglich, die Konfiguration abzuändern, ich kann dir leider nicht sagen, ab welchem Premium-Paket das möglich ist. Kann das vielleicht jemand ergänzen?
  • in: Interner Website Counter

    geschrieben von fuerderer

    Ich hab hier mal ein Beispiel, vollständig mit HTML außen rum:
    <!doctype html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>Counter</title>
      </head>
      <body>
        <p>Sie sind der <?php
    $f = fopen("./counter_value.txt", "c+");
    flock($f, LOCK_EX);
    $counter = ((int)fgets($f))+1;
    ftruncate($f, 0);
    rewind($f);
    fwrite($f, "$counter\n");
    flock($f, LOCK_UN);
    fclose($f);
    echo $counter;
    ?>. Besucher.</p>
      </body>
    </html>
    Alles zwischen <?php und ?> ist PHP-Code. Den kannst du schnappen und dort in dein HTML einfügen, wo der Zählerstand angezeigt werden soll.
    Wichtig ist dann noch, dass die HTML-Datei die Endung .php bekommt, damit der PHP-Code auch ausgeführt wird.
    Falls du die Dateiendung .php nicht magst, gibt es noch gewisse Tricks, um auch in einer HTML-Datei PHP-Code auszuführen. Das lässt sich per .htaccess einstellen.
  • in: Interner Website Counter

    geschrieben von fuerderer

    Mit PHP lässt sich da auf jeden Fall was basteln.
    Einen externen Anbieter würde ich nicht nehmen, gerade wegen der DSGVO ist das einfach zu umständlich für einen simplen Counter. Du müsstest ja alleine dafür wieder einen Vertrag zur Auftragsdatenverarbeitung schließen, den Anbieter in der Datenschutzerklärung nennen, usw.

    Wieso meintest du „vorzugsweise JS“? Eine rein clientseitige Lösung wirst du nicht bekommen, wenn du die Zugriffe aller Besucher zählen möchtest und nicht jeder Besucher seinen eigenen Zähler haben soll.

    Ein PHP-Snippet kann ich dir gerne noch liefern. Du musst mir nur sagen, ob du den Zählerstand lieber in einer Datei oder in einer SQL-Datenbank ablegen möchtest und ob du mehrere Zähler haben möchtest (z.B. pro Unterseite) oder einen Zähler für die gesamte Website.
  • in: Anmeldung per PHP

    geschrieben von fuerderer

    Prinzipiell ist kein System zu 100% abgesichert. Das gilt für das Betriebssystem auf dem die Website läuft, für den Webserver, für den PHP-Interpreter und auch für dein PHP-Skript.

    Das PHP-Skript ist jedoch das, worauf du Einfluss hast, und wo Sicherheitslücken auch am wahrscheinlichsten sind. Wenn du uns das präsentierst, können wir drüber schauen und bezüglich Sicherheit beurteilen.
  • in: Wie kann ich meine Webeite sicherer machen? PHP

    geschrieben von fuerderer

    Hi Jonas.

    Es gibt einige Angriffsszenarien, die du als PHP-Entwickler kennen musst. Wenn du mit Daten vom Benutzer arbeitest (also $_GET, $_POST, $_COOKIE, $_SERVER, Dateiuploads) musst du beispielsweise entsprechende Sorgfalt walten lassen und diese je nach Verwendung passend maskieren.

    Eine gute Übersicht über mögliche Angriffe bietet Wikipedia:
    https://de.m.wikipedia.org/wiki/Sicherheit_von_Webanwendungen#Angriffsmethoden

    Zu jedem dieser Angriffe gibt es dann wiederum einen ganzen Artikel.
    Wenn du alle dort aufgeführten Angriffe verstanden und abgewehrt hast, dann hast du schon eine sehr sichere Seite.

    Für ein kleineres Projekt kannst du die unteren drei Angriffe durchaus ignorieren. Also Man-in-the-Browser, Denial-of-Service und Phishing. Diese sind sehr schwer bis unmöglich serverseitig abzuwehren.
  • in: php ftp script

    geschrieben von fuerderer

    Du gibst bei ftp_put zweimal die Variable $zieldatei an. Beim zweiten Mal wird der lokale Pfad der hochzuladenden Datei erwartet. Bist du sicher, dass hier $zieldatei für dich passt?

    Vielleicht solltest du dir einmal diese Seite ansehen, die Datei-Uploads behandelt: https://secure.php.net/manual/de/features.file-upload.post-method.php
    Insbesondere das Feld tmp_name ist für dich interessant, denn darüber erfährst du, wo die Datei lokal abgelegt ist.
  • in: Kartellverdacht von Insider bekommen

    geschrieben von fuerderer

    darvin schrieb:
    Aber wie ist es prinzipiell, wenn man weiß (und es beweisen kann), dass einer eine Straftat begonnen hat und es nicht meldet. Macht man sich dann Strafbar?
    Ich habe dazu folgendes Video von einem Rechtsanwalt gesehen: https://www.youtube.com/watch?v=O72f2cMNFp8

    Zusammengefasst: Nur sehr schwere Straftaten (genannt werden z.B. Angriffskrieg, Hochverrat, Geldfälschung, Raub, Mord) muss man anzeigen. Bei weniger schweren Straftaten bleibst du selbst straffrei, wenn du diese nicht anzeigst.
    Meiner Einschätzung nach musst du ein Kartell also nicht anzeigen.
  • in: Automatische Aktualisierung von Bildern

    geschrieben von fuerderer

    Die Html-Seite und das eingebundene Bild werden vom Cache unabhängig voneinander behandelt.
    Egal, ob man nun mit PHP irgendwelche Header setzt oder Meta-Tags ins Markup einfügt, das wirkt sich alles nur auf die Html-Datei aus, während das Bild munter weiter im Cache gespeichert bleibt.

    Das Ziel ist also, den no-cache Header für das Bild zu setzen und nicht für die Html-Datei.
    Am einfachsten geht das in einer .htaccess Datei:
    <Files bilddatei.jpg>
      Header add Cache-Control "no-cache"
    </Files>
    ^^ Der Dateiname muss noch angepasst werden.

    Theoretisch könnte man auch PHP verwenden um das Bild auszuliefern und dabei die Header zu setzen, einfacher dürfte aber der Weg über .htaccess sein.
  • in: Problem beim ausgeben eines Cookies mit PHP

    geschrieben von fuerderer

    Wenn ich deinen Code so verwende, funktioniert bei mir alles wie es soll. Du musst natürlich die Variable actions initialisieren, aber das hast du vermutlich getan, sonst würde der Browser die entsprechende Zahl an Klicks nicht anzeigen.

    Vielleicht liegt es am Cache.
    Hast du die Seite irgendwo stehen, sodass man mal draufschauen kann?
    Ansonsten könntest du auch mal den vollständigen Code posten. Eventuell ist woanders noch ein Fehler.
  • in: Meta-Tags mit JS auslesen ?

    geschrieben von fuerderer

    Versuche mal diesen Beispielcode:
    var metas = document.getElementsByTagName("meta");
    for (var i=0; i<metas.length; i++) {
      var e = metas[i];
      if (e.hasAttribute("name") && e.hasAttribute("content")) {
        var name = e.getAttribute("name");
        var content = e.getAttribute("content");
        console.log("Meta-Tag; Name: " + name + ", Inhalt: " + content);
      }
    }
    Den kannst du dann noch anpassen, je nachdem was genau du auslesen möchtest.
  • in: Leere Elemente aus Array ersetzen

    geschrieben von fuerderer

    Die Funktion preg_replace ersetzt die Array-Elemente nicht in-place, sondern gibt ein neues Array zurück.

    Anstatt
    preg_replace("/^[\s]?$/", "Ersatz", $array);
    müsstest du also
    $array = preg_replace("/^[\s]?$/", "Ersatz", $array);
    schreiben.

    @horstexplorer:
    Hinter dem Ausdruck für Whitespaces steht ein Fragezeichen, d.h. der String kann ein Leerzeichen enthalten, muss aber nicht.
  • in: Mit PHP Zeichenkette ausgeben, die am häufigsten in String..

    geschrieben von fuerderer

    na-web schrieb:
    Ich möchte wenn der String "Hallo, Hallo, Welt" ist die Zeichenkette ausgeben, die am häufigsten vorkommt also "Hallo" in diesem Fall ausgeben.
    Wie definierst du denn eine solche Zeichenkette, meinst du ganze Wörter?

    Denn "Hallo" kommt zwar zweimal vor, dagegen kommt aber die Zeichenkette "l" ganze 5 Mal vor.
  • in: Umstellung auf PHP bei meinem Wordpressblog

    geschrieben von fuerderer

    Um ehrlich zu sein, finde ich es schon witzig, dass man mehreren Parametern in einer Funktion den selben Namen gibt. Was sich der Entwickler deines Themes dabei wohl gedacht hat?

    Aber darum geht es nicht, du brauchst eine Lösung.
    Ich hab ein bisschen rumgespielt und herausgefunden, dass PHP 5.6 diese Schreibweise tatsächlich erlaubt. In der Variable $bwc steht dann der Wert, der für das zweite der beiden gleichnamigen Argumente übergeben wurde, der erste Wert wird also ignoriert.

    Nun, PHP 7 erlaubt das nicht mehr und um das Problem zu lösen, sollte es reichen wenn du dem ersten der beiden $bwc Parametern einen anderen Namen gibst. Hier ein Beispiel, was ich ändern würde:
    Funktionskopfzeile bisher:
    function art_normalize_widget_style_tokens($content, $bw, $bwt, $ewt, $bwc, $bwc, $ewc, $ew) {

    Ändern zu:
    function art_normalize_widget_style_tokens($content, $bw, $bwt, $ewt, $dummy, $bwc, $ewc, $ew) {


    Ich hoffe, du kommst damit weiter. Ist ja immerhin ein "Fatal Error", womöglich gibt es also noch mehr Probleme, bis der Blog unter PHP 7.0 glatt läuft.
    Viel Erfolg!
  • in: PhP Script aufrufen mit JS

    geschrieben von fuerderer

    horstexplorer schrieb:
    Allerdings wird hierbei nicht gewartet darauf, dass das PhP Script fertig gelaufen ist.
    Wie setze ich das so um das wenn das Script beendet wird meine Funktion ausgeführt wird, aber die Website nicht auf das beenden dieser wartet?
    Mich verwundert, dass dieses Skript nicht auf PHP wartet. Auf welche Weise hast du das denn überprüft? Denn eigentlich sollte es warten, das hast du schon richtig programmiert.

    Was mir an der Stelle aber auffällt:
    horstexplorer schrieb:
    Ich würde gern eine Webseite anzeigen lassen mit div 1 ausgeblendet und div 2 eingeblendet. Dann soll ein PhP Script ausgeführt werden und wenn das fertig durchgelaufen ist soll div1 ein und div2 ausgeblendet werden.
    Diese Beschreibung passt nicht zum Skript, dort blendest du die beiden Div's genau umgekehrt ein und aus. Das war doch hoffentlich nicht der einzige Fehler ...
  • in: CSS: Halbkreis erzeugen und einzelne Segmente füllen

    geschrieben von fuerderer

    Ich würde in diesem Fall eine Vektorgrafik erstellen. Falls du dich damit auseinander setzen möchtest, empfehle ich folgendes Tutorial: https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial

    Das Beispielbild, welches du gepostet hast, lässt sich mit SVG wunderbar nachbilden und diesen Vorgang kann man auch automatisieren, z.B. mit PHP.

    Was meinst du mit Ansprechbarkeit/Formatierbarkeit der Segmente? Alles was die statische Darstellung betrifft (Farben, Aufteilung, Größe der Segmente) kann man serverseitig vorberechnen und benötigt dann nicht einmal CSS. Soll sich die Darstellung jedoch auf dem Client ändern (z.B. mit hover-Effekten), dann wird das Ganze komplizierter.

    Eine Änderung der Farbe von Objekten im SVG wäre soweit ich weiß sogar mit CSS möglich, ich möchte das jetzt aber nicht garantieren. Wenn du komplizierteres machen möchtest, z.B. Größenänderungen, müsste man jedoch evtl. auf Javascript zurückgreifen.
  • in: Passwort ertellen

    geschrieben von fuerderer

    horstexplorer schrieb:
    Leider dauert das ganze relativ lang. Fürs Passwort generieren weniger das Problem, aber bei aufrufen in scripten ungeeignet, da es knapp 50s dauert. Evtl gebt das ganze schneller?
    Klar geht das schneller. Ich hab dir meinen Ansatz gepostet. Ein einzelner, richtig angewandter hash_hmac reicht aus, damit lässt sich in 86 Mikrosekunden ein neues Passwort berechnen. Machst du das Ganze komplizierter, dauert es natürlich entsprechend länger.
    Ich nehme an, dass die Berechnung von Pi bei dir sehr viel Zeit in Anspruch nimmt.
  • in: Passwort ertellen

    geschrieben von fuerderer

    Dieser selbst ausgedachte Algorithmus ist bestimmt interessant und eine nette Spielerei, hat aber leider entscheidende Nachteile.
    Zum einen lässt sich die wahre Sicherheit sehr schlecht abschätzen. Der Algorithmus ist schließlich geheim und du kannst als einziger beurteilen, wie sicher er sein wird. Da kann es schonmal passieren, dass du etwas übersiehst und eine Kryptoanalyse schneller zum Erfolg führt als du erwartet hättest.
    Zum zweiten lässt sich dieser Algorithmus schlecht vervielfältigen. Stell dir vor, du wärst Mitarbeiter eines IT-Unternehmens und müsstest diese Passwortänderung für insgesamt 100 Kunden implementieren. Würdest du dir 100 neue Algorithmen einfallen lassen?

    Ich empfehle daher, offene Algorithmen einzusetzen, deren Sicherheit gemäß Kerckhoffs Prinzip nur auf der Geheimhaltung eines Schlüssels beruht.

    Mein Ansatz sähe so aus:
    $key = "143105b7cdfbc1a9c055676b5ab370c2441131636b690283fd45c94564c64138";
    $date = date("d.m.Y");
    $db_password = hash_hmac("sha256", $date, $key);

    Meinen Beispielkey musst du natürlich austauschen, denn wenn er hier im Forum rumsteht, ist er logischerweise nicht sicher.

    HMAC ist dafür konzipiert, dass auch bei tausenden offengelegten Nachricht-Hash Paaren zu einer neuen Nachricht nicht der entsprechende Hash ermittelt werden kann, ohne den Key zu kennen.
    In diesem Fall bedeutet das konkret: Auch wenn jemand weiß, dass das einfache Datum zur Berechnung genutzt wird und über Jahre hinweg alle Datenbankpasswörter protokolliert hat, kann er ohne Key nicht das Passwort für den nächsten Tag errechnen.


    Und falls du diese Passwortänderung tatsächlich auch noch auf einem anderen Rechnernetz haben willst, kannst du einfach den Key austauschen anstatt einen neuen Algorithmus zu entwerfen.


    Ein entscheidendes Problem gibt es trotzdem noch: Wer den Programmcode in die Finger bekommt (und dabei ist es egal ob selbst implementiert oder meine HMAC Variante), der kann alle Passwörter, auch alle zukünftigen ermitteln. Du solltest deshalb in Erwägung ziehen, das Passwort jeden Tag auf einem deiner beiden Systeme zufällig zu erzeugen und auf eine sichere Weise auf das andere System zu übertragen.
  • in: Innerhalb einer Klasse auf eine andere Klasse zugreifen

    geschrieben von fuerderer

    user012 schrieb:
    Was wäre denn die andere/leichtere Methode?
    Na genau die, die du auch schon (fast) korrekt umgesetzt hast - mit dem Autoloader.
    Ich muss hier noch anmerken:
    - Den Autoloader packst du am besten in eine eigenständige Datei. Die lässt sich dann einfach von überall her einbinden.
    - Jede Klasse kommt ebenfalls in eine eigene Datei, gemäß dem Namensschema des Autoloaders. Nur dann werden Klassen die man benötigt auch gefunden und es werden keine Klassen unnötig geladen.

    Du musst dann nur noch daran denken, in jeder Datei die als Skripteinstieg dient einmal den Autoloader einzubinden. Anschließend kannst du nach Belieben deine Klassen verwenden und was fehlt wird automatisch geladen.

    So einen Autoloader zu verwenden ist bei großen Projekten wesentlich einfacher als im Blick zu behalten, wer denn jetzt genau wen einbindet.
  • in: setTimeout in einer Funktion

    geschrieben von fuerderer

    Dass hinter dem function Schlüsselwort ein Klammerpaar fehlt, ist mir nicht sofort aufgefallen. Ich habe deinen Beispielcode zum Test in ein neues HTML-Dokument eingefügt und dann mit Firefox geöffnet. Wenn es irgendwelche Fehler, in diesem Fall Syntaxfehler gibt, steht dann in der Webkonsole eine Fehlermeldung mit Zeilennummer und sogar Zeichenposition. Schaut man dann nochmal genauer an die Stelle, fällt der Fehler auch meistens schnell auf.

    Den anderen Fehler, dass du das event nicht übergeben hast, hab ich direkt entdeckt. Aber auch hier hätte die Webkonsole weiter geholfen. Die beschwert sich dann, dass die Variable "event" den Wert undefined enthält und kein Attribut "keyCode" besitzt.

    Klar, als Entwickler muss man auch lernen seine eigenen Fehler zu finden, auch wenn es keine Fehlermeldungen gibt. Ich baue dazu meistens Ausgaben in meine Programme ein, in Javascript geht das z.B. mit console.log()
    So kann man den Programmablauf generell oder auch bestimmte Variablenwerte untersuchen und damit den Fehler eingrenzen, bis man ihn schließlich gefunden hat.

  • in: setTimeout in einer Funktion

    geschrieben von fuerderer

    Beim Test hab ich zwei Fehler gefunden:
    1. Bei der function-Deklaration im setTimeout (Zeile 11) fehlt ein rundes Klammernpaar, direkt nach dem wort "function".
    2. Das "event" musst du beim Aufruf von KeyCheck übergeben (Zeile 16) und in der Funktionsdeklaration entgegen nehmen (Zeile 7), sonst kannst du nicht darauf zugreifen.

    Hier ist das Ergebnis, zumindest bei mir funktioniert es jetzt.
    <!doctype html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Versuch</title>
        <script>
    function KeyCheck(event) {
        var KeyID = event.keyCode;
        if(KeyID==83) {
            document.getElementById("Text").innerHTML = "Der Text";
            setTimeout(function() { document.getElementById("Text").innerHTML = "";  }, 3000);
        }
    }
        </script>
      </head>
      <body onkeydown="KeyCheck(event)">
        <span id="Text"></span>
      </body>
    </html>
  • in: setTimeout in einer Funktion

    geschrieben von fuerderer

    Das ist nicht besonders schwer. Wenn du uns zeigst, was du bereits versucht hast, können wir sicher helfen, vielleicht hast du ja einfach einen kleinen Fehler drin.

    Grob läuft das etwa so ab:
    function onButtonClick() {
      // Text einblenden
      setTimeout(function() {
        // Text, Button, was auch immer wieder ausblenden
      }, 5000)
    }

    Das musst du jetzt natürlich an deine Umgebung anpassen. Ich weiß ja nicht wie deine Seite aufgebaut ist und wie die betroffenen Elemente für Javascript ansprechbar sind.
  • in: Seite aufrufen mit PhP

    geschrieben von fuerderer

    Ob jetzt der Homeserver die Mail senden soll oder Lima-City, darüber lässt sich bestimmt streiten.
    Ich selbst habe keine Erfahrung mit Mailservern, kann aber bei dem PHP-Ansatz weiterhelfen. Dass ein PHP-Skript ein anderes aufruft, ist für mich nichts neues, so etwas habe ich schon ein paar mal gemacht.

    // Irgendein PHP Code
    $empf = urlencode("name@domain.tld");
    $btrf = urlencode("Betreff");
    $msg = urlencode("Nachricht");
    file_get_contents("https://horstexplorer.lima-city.de/test1.php?empf=$empf&btrf=$btrf&msg=$msg&key=Key");
    // Noch mehr PHP
    Das hat aber zur Folge, dass dieses PHP-Skript, das auf dem Homeserver läuft, auf den Lima-City Server wartet bevor es den Skriptablauf fortsetzt. Ist das nicht gewünscht, müsste ich schauen was PHP da alternativ zu bieten hat.

    Bezüglich Sicherheitsbedenken würde ich 3 Dinge beachten:
    - Variable Werte immer schön mit urlencode() maskieren.
    - Einen Key einbauen. (hat horstexplorer bereits) Dieser muss natürlich ausreichend lang und zufällig sein und logischerweise auch überprüft werden, damit nur das berechtigte Skript auf die Schnittstelle zugreifen kann.
    - https verwenden, damit die Url (insbesondere der Key) nicht unterwegs mitgelesen werden kann.
    Wenn du diese 3 Punkte beachtest, wüsste ich nicht, was daran noch unsicher sein sollte.
  • in: Die richtigen Rechte auf Lima City

    geschrieben von fuerderer

    theglobe schrieb:
    Allerdings kann mit den Gruppenrecht etwas gemacht werden, weil FTP und PHP unterschiedlichen Gruppen angehören. Ob das angesichts der Tatsache, dass beide aber Owner sind, eine Rolle spielt, teste ich noch etwas durch.
    Damit wirst du nicht viel erreichen. Wenn ein Prozess dem Owner einer Datei angehört, gelten für ihn die Ownerrechte, alles andere interessiert einfach nicht.

    Um das mal an einem Extrembeispiel klar zu machen: Wenn ich unter Linux einer Datei, die mir gehört die Rechte 077 gebe, darf ich selbst nicht mehr darauf zugreifen, während alle anderen Nutzer alles damit tun dürfen.
    Die Berechtigungen ändern kann ich natürlich trotzdem wieder, ich kann mich also nicht selbst von einer Datei aussperren. Aber solange ich die Rechte auf 077 belasse, wird mir der Zugriff verwehrt.

    Für Lima-City würde ich die Situation ganz einfach zusammenfassen:
    1. Wir müssen uns nicht um die Sicherheit des eigenen Webspaces kümmern. Andere Nutzer können nicht darauf zugreifen, das wird durch das FTP-Wurzelverzeichnis, open_basedir und die Sperrung einer Reihe von PHP-Funktionen sichergestellt. Außerdem sind die group- und others-Rechte standardmäßig bei neuen Dateien auf 0 gesetzt.
    2. Als FTP-Nutzer den PHP-Skripten Rechte wegzunehmen wird nicht funktionieren - zumindest nicht wirksam. Gleiches gilt umgekehrt.

    Die Dateirechte hier auf dem Webspace brauchen uns also nicht zu interessieren. Wir lassen sie einfach wie sie sind und alles ist gut.
  • in: Die richtigen Rechte auf Lima City

    geschrieben von fuerderer

    theglobe schrieb:
    Meine Beobachtung: FTP und PHP sind der selbe Owner/Eigner, doch sie gehören zu unterschiedlichen Gruppen. PHP zur Gruppe 65534, FTP zur Gruppe 33. Dennoch haben zugeteilte Gruppenrechte keine Bedeutung, denn der Eigner ist halt jedesmal der selbe. Andererseits kann ich mit einem PHP-Script den FTP-Zugriff mit chmod 040 sperren - und umgekehrt. Offenbar kann man die Unterscheidung auf diese Weise dennoch erreichen, und eine Absicherung wird auf diese Weise möglich. Oder?
    Auf Unix-Systemen ist es üblich, dass der Owner einer Datei jederzeit deren Rechte ändern kann. Da FTP und PHP immer als Eigentümer zählen, wäre damit eben kein Schutz gewährleistet.

    Die Rechte 040 habe ich also ausprobiert - und jetzt bin ich auch verwirrt. :confused:
    Wenn das Owner-Leserecht fehlt, kann ich über FTP die Rechte nicht mehr ändern. Ist das bei dir genauso?
    Außerdem kann ich mit FTP das Leserecht und das Schreibrecht des Eigentümers nicht mehr entfernen, sobald es einmal gesetzt ist. Wenn ich über FTP "chmod 000" bei einer Datei mit den Rechten 777 versuche, stehen die Rechte anschließend auf 600.

    Mit PHP ist eine Rechteänderung aber immer möglich, ohne Einschränkung.

    Mir erschließt sich deshalb noch nicht, wie man jetzt über FTP eine Datei anlegen soll, damit PHP diese noch lesen aber nicht mehr schreiben kann. Das war doch das Ziel des ganzen. Kannst du dafür ein Beispiel machen?
  • in: Die richtigen Rechte auf Lima City

    geschrieben von fuerderer

    theglobe schrieb:
    Binary-Butterfly-Artikel:
    "lima-city
    Keine Trennung von PHP- und FTP-Nutzer möglich, daher chmod wirkungslos und korrekte Dateirechte nicht realisierbar.

    Website: https://www.lima-city.de/
    Quelle: Support."

    (Gilt laut Artikel übrigens auch für 1&1, Alfahosting, Domainfactory, Hetzner und andere.)

    So wird es wohl sein. Mit der Einschränkung, dass die von mir genannten unorthodoxen Rechte-Einstellungen sehr wohl verhindern können, dass ein eingeschmuggeltes oder manipuliertes PHP-Script Schäden verursacht.
    Nein, auch die von dir vorgeschlagenen Rechte helfen nicht gegen eine Manipulation von Skriptdateien durch PHP.

    Ein PHP-Programm kann einfach selbst ein chmod() ausführen, eben weil es mit dem selben Nutzer wie FTP arbeitet. Das sieht dann z.B. so aus:
    <?php
    $perms = fileperms(__FILE__);
    chmod(__FILE__, 0600);
    $f = fopen(__FILE__, "a");
    fwrite($f, "// ".date("H:i:s")."\n");
    fclose($f);
    chmod(__FILE__, $perms);
    Speichere dieses Skript auf deinem Webspace und erteile ihm die Rechte 400. Es wird trotzdem bei jedem Aufruf einen Kommentar mit der aktuellen Uhrzeit bei sich selbst ergänzen. Dazu macht es sich zunächst schreibbar, hängt dann eine Zeile an und stellt schließlich die ursprünglichen Rechte wieder her, um nicht aufzufallen.
  • in: Darstellungs-Lags bei Animation

    geschrieben von fuerderer

    noxious schrieb:
    Zum einen weisen Funktionen wie "Sleep" darauf hin, dass du die Funktion von Framerates nicht verstanden hast. Du wartest nicht im Frame, du nimmst die Sekunden, wartest bis diese auf 1 höher als vorher sind und inkrementierst bis dahin eine Frames-Variable. Wenn die vergangene Zeit größer als 1 Sekunde ist, teilst du die aktuellen Frames durch die vergangenen Sekunden und erhälst... Frames per Second. Dann setzt man die Frames und die vergangenen Sekunden auf 0. Und fährt fort. Da wartet man nicht.
    Ich zeige die "Frames per Second" ja nicht direkt an, das würde mir nichts bringen weil das dann ja auf 50 steht, ich aber trotzdem nur 2 Frames jede Sekunde sehen kann.

    Was ich hier habe ist ein Framezähler, der kontinuierlich von Frame zu Frame hochzählt. Der Sinn davon ist es, eine Animation zu haben, damit sich das Bild zwischen den Frames auch jedesmal ändert. Ich hätte auch ein Rechteck im Kreis bewegen können, da gäbe es die selben Symptome.

    noxious schrieb:
    Ähnliches gilt für Framerate-Begrenzer. Man wartet nicht, sondern zeichnet nur, wenn die aktuelle Zeit größer als die gewünschte Zeit ist. Du sagst nicht "mache alles, warte n sekunden, mach dann das nächste", weil du dann immer die FPS + "die Zeit die du gebraucht hast" bekommst. Du updatest deine Daten so oft wie möglich, aber zeichnest nur, wenn die gewünschte Zeit vergangen ist.
    Mir ist bewusst, dass ich im Beispielprogramm oben nicht ganz exakt 50 FPS habe, weil von Sleep zu Sleep immer ein paar Mikrosekunden vergehen. Das ist aber auch ein Minimalbeispiel. Im ursprünglichen Programm schaue ich permanent auf die Uhr und warte nur so lange, wie es noch bis zur nächsten Frame dauert. Damit bekomme ich dann exakt 50 FPS.

    Das Problem ist ja nur ein Anzeigeproblem. Es lässt sich innerhalb des Programms nicht messen, da die Gameloop und paintComponent() regelmäßig aufgerufen werden und nirgendwo hängen bleiben.

    Ok, ich habe einmal testweise das
    Thread.sleep(20)
    ersatzlos gestrichen. Nun lastet das Java-Programm 1,6 CPU-Kerne aus und es werden ca. 33000 Frames pro Sekunde gezeichnet. Tatsächlich sichtbar sind jetzt ca. 18 Frames jede Sekunde, sehe ich auf einer Zeitlupenaufnahme meines Bildschirms. Das ist besser als 2 aber immernoch nicht gut, denn meines Wissens nach kann mein Bildschirm 60 Bilder pro Sekunde darstellen.

    Wenn ich jetzt den Framerate-Begrenzer einbaue, wie du ihn beschrieben hast, bin ich wieder da wo ich vorher war: Bei 50 gezeichneten Frames pro Sekunde, von denen 2 sichtbar sind. Und im Prinzip habe ich nur den Sleep-Befehl durch eine Busy-Waiting Warteschleife ersetzt, die jetzt einen CPU-Kern voll auslastet.


    Es wäre interessant, wenn mal jemand ein sauberes Beispiel schreiben könnte, das irgendeine Animation zeigt ohne dass man Maus oder Tastatur benutzen muss. Das würde ich dann bei mir testen und berichten.


    Edit: Jetzt habe ich das Problem endlich gelöst!
    Ich habe am Ende der Methode paintComponent() folgende Zeile eingefügt:
    Toolkit.getDefaultToolkit().sync();
    In der Dokumentation steht dazu:
    Synchronizes this toolkit's graphics state. Some window systems may do buffering of graphics events.

    This method ensures that the display is up-to-date. It is useful for animation.
    Anscheinend ist die Ubuntu Unity-Oberfläche eines dieser Systeme, die die Grafikausgabe puffern. Deshalb brauche ich die Zeile um ein flüssiges Bild zu bekommen, während es auf anderen Betriebssystemen auch so schon flüssig läuft.
  • in: Fehlererkennuung

    geschrieben von fuerderer

    Ich bin etwas spät dran, hoffe das ist noch relevant.

    Die Hamming-Distanz von 6 sagt ja aus, dass sich zwei verschiedene, gültige Codewörter in mindestens 6 Stellen unterscheiden. Das einfachste Beispiel wäre ein Wiederholungscode mit n=6

    Erstmal grob zum Verständnis:
    Aus einer "0" macht der Wiederholungscode "000000"
    Aus einer "1" macht der Wiederholungscode "111111"
    Diese Codewörter sind also nur gültig, wenn alle Bits gleich sind. Und damit haben wir eine Hamming-Distanz von 6, weil bei einer Änderung alle 6 Bits geändert werden müssen.

    Ein Korrekturverfahren kann jetzt problemlos 2 Bitfehler korrigieren. Es kann aber gleichzeitig auch beim Auftreten von 3 Bitfehlern einen Fehler melden, dann aber nicht korrigieren. Die Begründung an 3 Beispielen:

    001010: Hier haben sich wahrscheinlich zwei 1er-Bits eingeschlichen => Korrektur zu 000000
    101100: Das ist genau der Fall, in dem wir drei Bitfehler haben aber diese nur melden und nicht korrigieren können.
    011101: Hier haben sich wahrscheinlich zwei 0er-Bits eingeschlichen => Korrektur zu 111111
    (Die Reihenfolge der Bits in den fehlerhaften Codes spielt hier natürlich keine Rolle und wurde von mir willkürlich gewählt.)

    So, ich hoffe dass es durch diese Beispiele klarer wurde.
  • in: Darstellungs-Lags bei Animation

    geschrieben von fuerderer

    Hallo zusammen,

    ich versuche mit Java ein Spiel zu programmieren, das Problem ist aber, dass die Grafik zeitweise extrem ruckelt.
    Hier ein minimales Beispiel, in dem der Fehler auftritt:
    package test;
    
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class MyPanel extends JPanel implements Runnable {
    	static final long serialVersionUID = 1l;
    	private int frameNr;
    
    	public MyPanel() {
    		new Thread(this).start();
    	}
    
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		frameNr++;
    		g.drawString("Frame Nr. " + frameNr, 10, 50);
    		System.out.println(frameNr); // wird regelmäßig und flüssig in die Konsole ausgegeben
    	}
    
    	public void run() {
    		try {
    			while (true) {
    				Thread.sleep(20);
    				this.repaint();
    			}
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setSize(400, 200);
    		frame.add(new MyPanel());
    		frame.setVisible(true);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }
    Die Gameloop ruft 50 Mal pro Sekunde repaint() auf. In der paintComponent() Methode zähle ich die tatsächlich gezeichneten Frames und schreibe die Nummer auf die Konsole und in das JPanel.

    Die Ausgabe auf die Konsole erscheint immer regelmäßig und flüssig. (siehe Kommentar Zeile 20) Auf dem JPanel sehe ich jedoch zeitweise nur noch zwei Frames pro Sekunde. Der Zähler springt dort dann in 25er-Schritten nach oben.

    Es scheint, als würde das Java-Programm die Frames regelmäßig zeichnen, aber sie werden eben nicht regelmäßig auf dem Bildschirm angezeigt.

    Außerdem beobachte ich eine Abhängigkeit zu meinem Mauszeiger. Das Problem tritt überwiegend dann auf, wenn sich der Mauszeiger außerhalb des Fensters befindet oder wenn er im Fenster ruht. Wenn ich die Maus dagegen permanent innerhalb des Fensters bewege, bekomme ich eine flüssige Darstellung.

    Ich nutze Ubuntu 16.04 mit der Unity-Oberfläche.
    Als Hardware habe ich einen Intel Core i7 Prozessor und eine Intel Grafikkarte.

    Kann mir jemand erklären, wie es zu dem Problem kommt und wie man es beheben kann?
  • in: Problem/Frage bezüglich AJAX - PHP (POST)

    geschrieben von fuerderer

    Die Überprüfung auf
    !isset
    oder
    empty
    ergibt in der switch-case Anweisung nicht besonders viel Sinn. Du könntest auf "if, else if" umsteigen, dann funktioniert das.

    Aber diese Tests hast du vermutlich auch nur zum Debugging eingebaut. Wenn du wissen möchtest, welchen Wert eine Variable genau hat, dann hilft dir die Funktion
    var_dump()
    . Diese gibt dir den Typ und Inhalt einer Variablen aus.

    Teste damit mal
    $_POST['final']
    ,
    $final
    und
    $meldung
    durch, dann solltest du mehr wissen.
  • in: .sh Script per PhP starten

    geschrieben von fuerderer

    horstexplorer schrieb:
    Die Rechte im Verzeichnis habe ich mit
    chown www-data /sys/class/gpio/*

    hoffentlich richtig gesetzt.
    Nun ja, das ist naheliegend. Du kannst das aber auch überprüfen.

    Zuerst einmal würde ich gerne sehen, welche Rechte jetzt tatsächlich gesetzt sind. Das kannst du mit
    ls -l /sys/class/gpio
    abfragen.

    Dann kannst du einmal versuchen, die funktionierenden Shellskripte mit www-data Rechten auszuführen.
    Wechsle dazu einfach mit
    sudo su www-data
    in den Rechtekontext des Webservers und teste dann die Shellskripte.

    In PHP empfiehlt es sich, die Fehlermeldungen explizit einzuschalten. Füge also oben im Skript folgende Zeilen ein:
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    Danach gibt dir PHP unter Umständen auch Fehler aus.

    Mit diesen Schritten kannst du dann den Fehler genauer eingrenzen.
  • in: Subdomain erstellen

    geschrieben von fuerderer

    cybercrack schrieb:
    Kann man dass nicht für alle Subdomains automatisch machen?
    In der Webseiten verwaltung kann man ja, einfach *.domain.com machen, geht das auch bei den SSL-Zertifikaten?
    Prinzipiell gibt es Wildcard-Zertifikate, diese sind aber so weit ich weiß relativ teuer. Let's Encrypt bietet diese Wildcard-Zertifikate nicht an.
    Update: Ich habe soeben mitbekommen, dass es dieses Feature ab Januar 2018 geben soll. (Quelle)


    Bleibt also (bis dahin) nur noch, die Anforderung von Zertifikaten zu automatisieren, dann sind wir wieder hier:
    xn--94h schrieb:
    Du kannst das mit curl verwirklichen.

    Dazu muss sich der Script in mit deinen Account einloggen und in die Verwaltung gehen.


    Mehr dazu
  • in: Reload-Quelle feststellen

    geschrieben von fuerderer

    kalb schrieb:
    Welche JS methoden zum Reload gibt es den?
    Ich kenne da nur
    location.reload()
    . Überschreiben scheint nicht zu funktionieren, das hab ich grad versucht.

    Aber vielleicht reicht ja auch schon eine Suche durch den Quelltext nach dem Begriff reload.
  • in: Style eines untergeordneten DIV-Tags ergänzen?

    geschrieben von fuerderer

    Ich konnte jetzt bei den geposteten Codestücken nicht direkt einen Fehler erkennen.

    Vermutlich bist du auf einen der gemeinen Fallstricke von Javascript hereingefallen. Speziell geht es um die Variable i. Wenn du eine for-Schleife hast, die etwa so aussieht:
    for (var i=0; i<=25; i++) {
      // ...
    }
    dann solltest du das "var" durch "let" ersetzen, also so:
    for (let i=0; i<=25; i++) {
      // ...
    }
    Hintergründe dazu gibts z.B. auf Stackoverflow. Das Problem dabei ist, dass die Variable i bis zum Ende gezählt wird und schließlich einen Wert annimmt, der zur Abbruchbedingung führt. Wird dann das Callback aufgerufen, hat i einen zu großen Wert und es wird kein Element mehr gefunden.

    Wenn ich mit der Vermutung nicht richtig liege, müsstest du wohl etwas mehr Code liefern. Praktisch wäre, wenn du einen Link zu deiner Seite senden könntest.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    Ein Beispiel gibt es hier: http://doc.qt.io/qt-5/qtnetwork-http-example.html
    In der "http/httpwindow.cpp" steht wohl der Code zum eigentlichen Download. Ich hab das aber nur überflogen, scheint auf den ersten Blick relativ viel zu sein.

    Grob zum Verständnis: Das C++ Programm ruft eine .php-Datei vom Webserver auf und damit startet dieses PHP-Skript auf dem Server automatisch. Und wenn PHP Ausgaben macht (z.b. mit echo), dann empfängt C++ diese Ausgaben und macht damit irgendwas, das Beispielskript speichert es in eine Datei.

    Was ich damit sagen möchte: Serverseitig brauchst du keine Textdatei zu erzeugen. Was zum C++ Programm übertragen werden soll, gibst du einfach mit echo aus.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    Also, hier noch ein Beispiel für einen timing-safe Stringvergleich in C++:
    bool hash_equals(const char *a, const char *b) {
      bool equals = true;
      while (true) {
        equals &= (*a == *b);
        if (!(*a && *b)) {
          return equals;
        }
        a++;
        b++;
      }
    }
    Am besten, man kompiliert das ohne Optimierung, damit der Compiler nicht noch irgendwelchen Mist macht.


    uebungen-till schrieb:
    Wie könnte ich das mit der serverseitigen Authentifizierung machen?
    Dazu brauchst du serverseitig ein Programm, das den Hashwert aus der Datenbank liest, ein vom Nutzer übergebenes Passwort damit überprüft und dann dem Client antwortet ob die Anmeldung erfolgreich war. Außerdem muss das Programm alle Serverzugriffe überwachen (was auch immer die Nutzer genau machen können) und dabei sicherstellen, dass nur angemeldete Nutzer zugreifen können.
    Ist deine MySql Datenbank bei Lima-City? Dann wirst du wohl PHP für die Authentifizierung verwenden. Hast du einen eigenen Server, kannst du auch andere Möglichkeiten in Betracht ziehen.

    Ein Beispielprogramm wäre jetzt komplex, etwas Vorarbeit solltest du schon leisten. Wenn es an einem bestimmten Punkt klemmt, dann helfe ich gerne wieder.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    Klar, mach ich.

    Zunächst einmal erzeuge ich einen Passworthash:
    $passwort = "passwort123";
    $hash = password_hash($passwort, PASSWORD_DEFAULT);
    echo $hash;
    Ergebnis (z.B.)
    $2y$10$4mijsKmr44Tt5OlakgacueA6w.K.8K8l12Up1PVPl4b052hWpFk.C
    Hier kommt bei jedem Aufruf der Funktion
    password_hash()
    ein anderes Ergebnis heraus, deshalb bekommst du nicht genau den gleichen Wert, falls du das wiederholst.


    Jetzt erkläre ich kurz die Bestandteile des Hashs:
    $2y$10$
    Angaben über den Algorithmus (und hier z.B. noch die verwendete Zahl der Runden)
    4mijsKmr44Tt5Olakgacue
    Der Salt (hier 22 Zeichen, das gilt aber nicht für jeden Algorithmus)
    A6w.K.8K8l12Up1PVPl4b052hWpFk.C
    Der eigentliche Hashwert


    Ich musste feststellen, dass du den Salt nicht zuverlässig vom Hashwert abtrennen kannst, da die Trennung eben abhängig vom Algorithmus wäre. Es gibt aber eine einfachere Lösung, denn man kann auch den ganzen Hashwert übergeben und der Algorithmus nimmt sich dann seinen Salt.

    Hier also die Überprüfung eines Passworts:
    $passwort = "passwort123";
    $hash = "$2y$10$4mijsKmr44Tt5OlakgacueA6w.K.8K8l12Up1PVPl4b052hWpFk.C";
    $kontrollhash = crypt($passwort, $hash);
    echo $kontrollhash."\n";
    var_dump($hash == $kontrollhash); // Vorsicht mit dem Vergleichsoperator!
    Ergebnis:
    $2y$10$4mijsKmr44Tt5OlakgacueA6w.K.8K8l12Up1PVPl4b052hWpFk.C
    bool(true)


    Wenn das Passwort nicht stimmt, kommt ein anderer Hashwert heraus:
    $passwort = "passwort124";
    Fürht zu:
    $2y$10$4mijsKmr44Tt5Olakgacuea5V4gj1Gu.U3C0B0XKti0sY57dubtzW
    bool(false)


    Ich schrieb noch: Vorsicht mit dem Vergleichsoperator!
    PHP empfiehlt, beim Vergleich solcher Hashwerte eine Funktion zu verwenden, die nicht für Timing-Attacken anfällig ist und bietet zu diesem Zweck die Funktion
    hash_equals()
    . Für C++ gilt dies prinzipiell auch. Wenn du das beachten möchtest, kann ich auch hierzu noch Beispielcode liefern.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    uebungen-till schrieb:
    Zum hashen in PHP habe ich das benutzt:
    password_hash($password, PASSWORD_DEFAULT);
    Ok, dann schau dir mal die Funktion
    crypt()
    an. Diese gibt es zum einen als PHP-Funktion (siehe Manual). Dort steht z.B. folgendes:
    password_hash() ist ein einfacher crypt()-Wrapper und kompatibel zu bestehenden Passwort-Hashes.

    Tatsächlich kann man mit
    crypt()
    die Passworthashs überprüfen, die mit
    password_hash()
    erstellt wurden. Dazu übergibt man zuerst das Passwort und als zweites die Angaben über Algorithmus und Salt (also den entsprechenden Teil des Hashs) und vergleicht das Ergebnis mit dem vorgegebenen Hash.

    Die
    crypt()
    -Funktion gibt es auch für C++, zumindest bei Linux ist das so. (siehe Manpage)
    Falls du Windows einsetzt, musst du schauen ob es eine äquivalente Bibliothek für Windows gibt.

    Ich hab mich jetzt kurz gefasst und alles nur grob beschrieben, für Rückfragen bin ich da.
  • in: Daten Byte-weise mit C oder C++ in andere Datei kopieren

    geschrieben von fuerderer

    Ich habe mir die 3 Dateien einmal heruntergeladen. Wenn ich minimalbeispiel.cpp kompiliere und ausführe (Linux), bekomme ich eine neue Datei, in der genau die vorderen 100 Byte fehlen - wie erwartet.

    Dass Windows hier andere Ergebnisse liefert, liegt vermutlich an Zeile 36:
    file_neu.open("b_my.txt",ios::out);
    Füge hier einmal noch das binary-Flag hinzu:
    file_neu.open("b_my.txt",ios::out | ios::binary);

    Ich konnte jetzt nicht selbst testen ob das die Ursache war, weil ich gerade kein Windows zur Hand habe.


    Edit:
    Noch ein Hinweis, ich schrieb vorher von der Schleife, die man eher vermeiden sollte. Damit meite ich z.B. sowas, Zeile 38-41:
    for (long i = 0; i <= (size-size_header-1); i++)
    {
        file_neu << nutzdaten[i];
    }
    Du kannst die Daten einfach mit write() schreiben und benötigst keine Schleife. Das ist um Größenordnungen schneller. (auch wenn das bei 2MB vielleicht noch nicht so bemerkbar ist.)
    Konkret heißt das, du kannst diese Schleife komplett durch folgenden Befehl ersetzen:
    file_neu.write(nutzdaten, size-size_header);
  • in: Daten Byte-weise mit C oder C++ in andere Datei kopieren

    geschrieben von fuerderer

    Wenn du die Datei schon komplett im Speicher hast, musst du sie tatsächlich nicht nochmal einlesen. Die Schleife mit der byteweisen Ausgabe in die Datei ist aber auch nicht wirklich brauchbar.

    Du kannst bei einem char-Pointer einfach einen Wert dazuaddieren, dadurch verschiebt sich der Pointer.
    char *nutzdaten = memblock + size_header;
    nutzdaten
    steht jetzt direkt nach den Headern und du kannst mit Hilfe von write() die Daten ab hier in eine Datei schreiben.

    Ansonsten: Was genau ist dein Problem? Ist es das hier:
    chst schrieb:
    [...] und bin leider recht bald wieder gescheitert, weil die neue Datei um insgesamt 8 Zeilen (bei 12500 eingelesenen) zu lang wird:
    Dann müsstest du mir erklären, was "8 Zeilen zu lang" bedeutet. Die Zeilen können ja nicht aus dem Nichts kommen, also was genau ist am Ergebnis falsch?
  • in: Style eines untergeordneten DIV-Tags ergänzen?

    geschrieben von fuerderer

    Wenn du ein Element ausgewählt hast, kannst du mit dem Attribut "children" an die inneren Elemente gelangen.

    Also, ein deinem Beispiel würde
    map_id.children
    ein Array liefern mit allen Elementen, die sich im Baum direkt unter dem ausgewählten div befinden. Ausgenommen sind Text-Elemente, also die Textbereiche, die nicht in ein weiteres Tag eingeschlossen sind.

    Du musst dich dann von Knoten zu Knoten durch den Baum nach unten vorarbeiten. Oft reicht es, die children abzuzählen, um an das gewünschte Element zu kommen.

    mathesoft schrieb:
    Ergänzend wäre es hilfreich, wenn ich den letzten Winkelwert speichern könnte, wenn der Nutzer dann zB 5 Grad weiterdrehen möchte. Wie mache ich das mit dem Werte speichern am besten - irgendwo auf der Page einen Value setzen?
    Klar, dazu reicht zunächst einmal eine Variable. Im Normalfall hast du einen Skriptblock, in dem die Funktion zur Drehung deklariert ist. Du kannst dann außerhalb des Funktionsblocks die Variable deklarieren, damit sie ihren Wert behält solange die Seite offen ist.

    Möchtest du den Wert auch gespeichert lassen wenn der Nutzer die Seite schließt, musst du z.B. auf LocalStorage zurückgreifen.
  • in: Rekursion schnell berechnen

    geschrieben von fuerderer

    jonas-bayer schrieb:
    Die Methode pow war mir tatsächlich auch schon aufgefallen - weil meine Zahlen Integer.MAX_VALUE deutlich überschreiten, nützt sie mir aber wenig.
    Hättest du ein konkretes Beispiel für Formel: n und Formel: w, bei dem Formel: n den Wert Integer.MAX_VALUE überschreitet? Ehrlich gesagt glaube ich kaum, dass das Ergebnis dann noch annähernd in der Größenordnung 10^5000 liegt.

    Theoretisch gibt es auch noch die Möglichkeit, die Potenz bitweise durchzuführen.
    Pseudocode zur Berechnung von a^b:
    e = a
    Stelle b binär dar
    Ignoriere die 1 ganz vorne bei b
    Iteriere von links nach rechts über die restlichen Bit von b:
        e = e * e
        Falls Bit = 1:
            e = e * a
    Gib e zurück


    Ein anderes Problem ist aber noch die Berechnung der Wurzel, denn dabei kommt kein ganzzahliger Zwischenwert heraus. Erst das Endergebnis ist wieder eine Ganzzahl.

    Man könnte jetzt durch vorheriges Multiplizieren und anschließendes Dividieren auch "Nachkommastellen" in die BigInteger Objekte einfügen, muss aber aufpassen, dass die Genauigkeit am Ende auch ausreicht um auf den richtigen Ganzzahlwert runden zu können.

    Dann ist mir noch aufgefallen, dass Formel: (w-sqrt(w^2-1))^n schon sehr früh kleiner als 1 ist und sich bei größeren Argumenten sehr schnell immer mehr der 0 annähert. In der Praxis wird man diesen Teil der Formel also ignorieren können.
  • in: Rekursion schnell berechnen

    geschrieben von fuerderer

    Ich kann bei dem Problem nicht ganz folgen, das beginnt schon bei der Definition der rekursiven Funktion:
    jonas-bayer schrieb:
    Formel: x(n+1,w)= 2*w*x(n,w)-x(n-1)
    Was bedeutet Formel: x(n-1)? x ist doch für zwei Argumente definiert. Meintest du Formel: x(n-1,w)?

    jonas-bayer schrieb:
    Formel: x(n,w)=1/2*((w+sqrt(w^2-1)^n+(w-sqrt(w^2-1)^n)
    Und hier werden zwei geöffnete Klammern nicht wieder geschlossen.

    jonas-bayer schrieb:
    Der Haken: In Java sind keine Methoden zur Potenzierung für die BigInteger / BigDecimal-Objekte implementiert.
    Ich sehe bei BigInteger eine Methode namens "pow". Richtig, sie nimmt ein Argument vom Typ int als Exponent entgegen, aber generell sollte das reichen. Wenn du noch größere Exponenten hast, wirst du das Ergebnis auch kaum noch abbilden können.

    So wie ich das einschätze, darf Formel: w eine sehr große Zahl sein, ohne groß Probleme zu verursachen. Wenn aber Formel: k ebenfalls "sehr groß" wird, also allerspätestens bei ca. 12 Dezimalziffern, wird die ganze Berechnung unpraktikabel, weil dann das Ergebnis einfach viel zu groß wird.
  • in: PHP einbinden

    geschrieben von fuerderer

    cybercrack schrieb:
    Ich möchte dies aber zentral in einem anderem Ordner speichern, leider können diese dann nicht mehr dadrauf zugreifen da diese ja keinen Zugriff mehr haben, da der Subdomain nur auf den einen Ordner Zugriff hat.
    Ja, das ist bei Lima-City so geregelt. Man muss sich dann etwas anders behelfen.

    Ich würde vorschlagen, ein neues MySql-Passwort mit file_get_contents() auf die verschiedenen Domains zu verteilen. Du brauchst dann für jede Domain ein Skript, das etwa so aussieht:

    neues-pw.php
    <?php
    $neuesPw = var_export($_GET['newpw'], true);
    file_put_contents(__DIR__."/mysql-pw.php", <<<EOF
    <?php
    const MYSQL_PW = $neuesPw;
    EOF;

    An einem zentralen Ort kannst du dann etwa so ein Skript ausführen:
    <?php
    $neuesPw = "abc123";
    
    file_get_contents("https://site1.example.com/neues-pw.php?newpw=$neuesPw");
    file_get_contents("https://site2.example.com/neues-pw.php?newpw=$neuesPw");
    file_get_contents("https://site3.example.com/neues-pw.php?newpw=$neuesPw");

    Du musst nur aufpassen, dass die URL's, mit denen man das Passwort setzt, von niemandem manuell aufgerufen werden. Ansonsten gibt es danach keine Verbindung mehr zur DB. Das ist aber auch schon das ganze Risiko, es wird also niemand das richtige Passwort zur Datenbank auslesen können.

    @airfield-manager
    Das Vorgehen ist prinzipiell möglich, du musst aber daran denken, dass die PHP-Datei beim include() selbst schon geparst wird und PHP nur das Ergebnis einbindet.

    Und wenn eine URL das MySql-Passwort ausgibt, besteht das Risiko, dass dieses gefunden wird. Das wollte ich effektiv vermeiden, weshalb ich neue Passwörter lieber verteilen würde als sie von einem zentralen Ort zu lesen.

    Außerdem sollte man an die Performance denken, wenn bei jedem Request gleich noch ein zweiter Request durch den Webserver muss um Konfigurationen zu laden.
  • in: Apache2: SSL mit Dynamischen VirtualHosts

    geschrieben von fuerderer

    Ich kenne jetzt nicht jedes Detail von Apache, ob man die SSL-Zertifikate aus dynamisch generierten Pfaden lesen kann.

    Du könntest aber ein Skript schreiben, das alle Zertifikate in /var/certs sucht und aus deren Namen die Apache Konfiguration zusammenbaut. Da drin steht dann eben für jede Domain ein VirtualHost-Block.

    Nach einer Änderung an den vorhandenen Domains müsste man dann einmal das Skript aufrufen und danach Apache neu starten. Wäre das eine Option für dich?
  • in: Reload-Quelle feststellen

    geschrieben von fuerderer

    Neben den von dir genannten Punkten gibt es noch die Möglichkeit, eine Seite per HTTP-Header nach einer bestimmten Zeit neu laden zu lassen. Ansonsten fällt mir gerade auch keine weitere Möglichkeit mehr ein.

    Wenn du uns die URL mitteilst, können wir einmal selbst auf die Suche gehen.
  • in: Chat-Anwendung sendet doppelte Nachrichten

    geschrieben von fuerderer

    Stichwort dafür ist Ajax.
    Ein Tutorial z.B. im html-seminar

    Es wird dann kein Formular abgesendet sondern die Nachricht im Hintergrund von Javascript an den Server gesendet. Für eine Chatanwendung solltest du außerdem auch Nachrichten per Ajax vom Server laden.

    Noch besser für den Zweck eignen sich Websockets. (setzt glaube ich auch Web Whatsapp ein)
    Diese sind aber hier bei Lima-City nicht möglich.
  • in: php sql view probleme

    geschrieben von fuerderer

    Demnach schlug der Aufruf von execute() fehl. Ich füge direkt danach noch eine Zeile ein, um die Fehlerursache auszugeben:
    public function getBesucher(){
             
            $json = array();
             
            $stmt = $this->prepare("SELECT `visitor_year`, `visitor_month`, `visitor_day`, `visitor_hour` ,count(`visitor_ip`) as besucher FROM `view_besucher` GROUP BY `visitor_hour`,`visitor_day` , `visitor_month` order by `visitor_date` ");
            var_dump($stmt === false);
             
            var_dump($stmt->execute());
            echo $this->error; 
            var_dump($stmt->store_result());
            var_dump($stmt->bind_result($year,$month,$day,$hour,$besucher));
            $counter =0;
            while ($fetch_return = $stmt->fetch()) {
                $json[] = '[Date.UTC('.$year.','.$month.','.$day.','.$hour.'),'.$besucher.']';
            }
            var_dump($fetch_return);
            var_dump($json);
            return $json;
        }
    Was bekommst du dann als Ausgabe?
  • in: php sql view probleme

    geschrieben von fuerderer

    Die Funktion mysqli_error() gibt dir eine Fehlerbeschreibung, direkt nachdem ein Fehler auftrat. Außerdem musst du das betreffende Mysqli-Objekt übergeben, das wäre in deinem Fall $this.

    Ich versuche es einmal anders, lass mich die Methode getBesucher() um ein paar Debuggingausgaben ergänzen:
    public function getBesucher(){
    		
    		$json = array();
    		
    		$stmt = $this->prepare("SELECT `visitor_year`, `visitor_month`, `visitor_day`, `visitor_hour` ,count(`visitor_ip`) as besucher FROM `view_besucher` GROUP BY `visitor_hour`,`visitor_day` , `visitor_month` order by `visitor_date` ");
    		var_dump($stmt === false);
    		
    		var_dump($stmt->execute()); 
    		var_dump($stmt->store_result());
    		var_dump($stmt->bind_result($year,$month,$day,$hour,$besucher));
    		$counter =0;
    		while ($fetch_return = $stmt->fetch()) {
    			$json[] = '[Date.UTC('.$year.','.$month.','.$day.','.$hour.'),'.$besucher.']';
    		}
    		var_dump($fetch_return);
    		var_dump($json);
    		return $json;
    	}
    Wenn du das ausführst, was wird dir dann ausgegeben?
  • in: php sql view probleme

    geschrieben von fuerderer

    muellerlukas hat gleich zu Beginn von PDO gesprochen, obwohl du das nicht explizit erwähnt hattest. Ist das überhaupt richtig, dass du PDO einsetzt oder nutzt du Mysqli?

    Bei Mysqli musst du prinzipiell jeden Schritt überprüfen, also die Rückgabewerte von prepare, execute, store_result und bind_result auswerten. Ansonsten entgehen dir womöglich Fehler.
  • in: php sql view probleme

    geschrieben von fuerderer

    Irgendwo muss die Ursache ja liegen.

    Kannst du vielleicht etwas mehr Code posten? (Wo man auch die Fehlerbehandlung sieht)

    Was genau bekommst du auf Lima-City als Ergebnis? Bedeutet "kein Result", dass du nachweislich ein leeres Ergebnis bekommst oder schlug die Abfrage fehl?

    Kannst du vielleicht noch einmal sicherstellen, dass die Daten in der DB von Lima-City vorhanden sind. (Auch wenn du schon sagtest, dass PhpMyAdmin Ergebnisse liefert.)
  • in: Encoded JS Injection

    geschrieben von fuerderer

    Der verlinkte Artikel von mein-wunschname auf Stackexchange scheint schlüssig, demnach bedeuten diese Requests auch keine Bedrohung.

    Ich muss mich noch einmal korrigieren, die maskierten Sonderzeichen sind nicht vom Client maskiert sondern vom Webserver, um sie in das access_log zu schreiben. Und die Länge von 64 byte ist wohl auch nicht konsistent, wenn man die von kozak veröffentlichten Zugriffe betrachtet.

    Ich würde das ganze also einfach ignorieren, eine Gefahr besteht wie gesagt nicht.
  • in: Encoded JS Injection

    geschrieben von fuerderer

    Ja, das ist wirklich sehr verwunderlich.

    Ich schaue zunächst einmal auf den Auszug aus dem access_log. Offensichtlich hat ein Client mit dem Webserver verbunden aber keinen gültigen Request abgesendet sondern nur eine fragwürdige Zeichenkette verschickt. Der Webserver hat das zurecht mit 400 Bad Request beantwortet.

    Diese fragwürdige Zeichenkette enthält viele Sequenzen in der Form "\x**" wobei die beiden Sterne jeweils einer Hexziffer entsprechen. Das erinnert mich sofort an PHP, denn dort kann man Sonderzeichen auf diese Weise kodieren. Dekodiere ich das ganze, erhalte ich 64 Byte für mich zufällig scheinende binäre Daten, aus denen ich nichts weiter schließen kann.

    Ich vermute einen unabsichtlichen Fehler irgendeines Programmes da draußen im Netz, aus dem keine Gefahr hervorgeht. Mir ist nicht klar, wie du das ganze mit Javascript und einem Javascript Obfuscator in Verbindung bringst oder woraus du schließt, dass Fail2Ban die Verbindung blockiert hätte.

    Für weitere Analyse würde ich mehrere dieser Requests sammeln. (kozak und mein-wunschname, ihr könnt das gern gemeinsam tun) Vielleicht lässt sich dann ein Schema erkennen. Außerdem könnte man versuchen, die IP-Adresse zurück zu verfolgen, z.B. über einen Reverse Lookup oder durch geografisches Eingrenzen.
  • in: Webseiten-Inhalt zyklisch aktualisieren

    geschrieben von fuerderer

    Hallo,

    das mit Long Polling bekommst du sicher hin, also fangen wir klein an:
    Zuerst einmal musst du Ajax verstehen. Bei Ajax ruft Javascript im Hintergrund eine bestimmte Seite vom Server ab und wertet dann das Ergebnis aus. So könntest du z.B. regelmäßig beim Server anfragen, ob es Neuigkeiten gibt.
    Ajax-Tutorial mit Beispiel
    (Auf der Seite kannst du dich mal umschauen, es gibt auch Tutorials zu CSS und zu Javascript allgemein.)

    Zu Long Polling wird das ganze, wenn der Server erst dann etwas sendet, wenn es auch Neuigkeiten gibt.
    Also ganz grob, etwa folgender Ablauf in PHP:
    <?php
    for ($i=0; $i<=30; $i++) {
      if (neuigkeitenVorhanden()) {
        neuigkeitenSenden();
        exit;
      }
      if ($i<30) sleep(1);
    }
    sendeInfoNichtsNeues();
    Ich habe die Zählschleife eingebaut, damit es keine Timeouts gibt, falls längere Zeit nichts gesendet werden muss. Der Browser muss halt nach jeder Antwort wieder neu anfragen.

    Vorteil von Long Polling gegenüber regelmäßigen Ajax-Requests ist einfach, dass die Internetleitung entlastet wird. Es ist dann das PHP-Skript selbst, welches z.B. im Sekundentakt nach neuen Nachrichten in der Datenbank schaut.

    Da du auch Countdowns erwähnt hast: Diese interagieren normalerweise überhaupt nicht mit dem Server. Sie bekommen nur einen Startwert und werden dann von Javascript bis auf 0 herunter gezählt.
  • in: WebSockets bei Lima-City einrichten?

    geschrieben von fuerderer

    Websockets sind alleine mit PHP und damit auf Lima-City leider nicht umsetzbar.

    Da bleibt dir nur, per Ajax zu pollen oder vielleicht noch serverseitig auf Long-Polling zu setzen. Wenn du dein genaues Ziel beschreibst, (wie häufig bekommt der Nutzer Aktualisierungen) kann ich dir noch genauere Tipps dazu geben.

    JS wirst du übrigens in jedem Fall brauchen, egal ob für Websockets oder Ajax. Es sei denn, du lädst die Seite sekündlich neu, aber das ist äußerst unpraktisch, ressourcenfressend und deshalb auf Lima-City ebenfalls nicht erlaubt.
  • in: Probleme mit Weiterleitungen

    geschrieben von fuerderer

    Gut, das was wir hier tun ist alles andere als sauber. Am besten wäre es, wenn ein PHP-Skript von der Kommandozeile ohne Zeitlimit gestartet wird und alleine die ganze Serie erledigt. Aber deinem Eröffnungspost nach ist das wohl nicht möglich.

    Ich nehme an, du möchtest den Bot hier auf Lima-City zum Laufen bekommen, richtig?

    sonok schrieb:
    Wenn bei den Cronjobs mal einer ausfällt ist der ganze Textblock futsch.
    Dass ein Cronjob ausfällt, halte ich für eher unwahrscheinlich, im Gegensatz zu dem Risiko, dass die Weiterleitungskette abbricht. (z.B. durch ein Timeout)

    sonok schrieb:
    Ich bräuchte außerdem eher eine ziemlich sekundengenaue Ansteuerung ...
    Das bekommt man hin - durch entsprechend geregelte Verzögerungszeiten.

    Eins ist mir auch noch nicht klar: Der Bot läuft einmal etwa 10 Minuten (300 Nachrichten im Abstand von 2s), aber wie oft muss er das tun? Stößt du ihn z.B. manuell an für die nächsten 10 Min. oder soll er täglich einmal für 10 Min. arbeiten?
  • in: Probleme mit Weiterleitungen

    geschrieben von fuerderer

    Ok, dass dieses Skript aus einem Cronjob heraus aufgerufen wird, war mir nicht ganz klar, da du einmal "Browser" erwähnt hattest. Vermutlich funktioniert meine Lösung dann also nicht.

    Wie und wo richtest du diese Cronjobs ein? Meist kann man die Aufrufe nämlich minütlich neu starten. Das wären für dich dann 30 Aktionen pro Cronjob. Zum einen kannst du wie bisher mit Weiterleitungen arbeiten, zum anderen kannst du auch mehrere Nachrichten in einen Skriptaufruf versenden. Dabei musst du nur auf das Limit der Ausführungszeit achten und vielleicht hat auch der Cronjob-Client ein eigenes Timeout. Das lässt sich durch Probieren feststellen.

    Wenn du beispielsweise 6 Nachrichten auf einmal sendest, dauert das Skript 12 Sekunden. Dieses müsste dann noch 4 Mal weiterleiten. (für insgesamt 5 Aufrufe) An den Parametern kann man wie gesagt noch schrauben, aber eine Minute kannst du damit bestimmt überbrücken, bis dann (hoffentlich) der nächste Cronjob anläuft und die Aufgabe übernimmt.
  • in: Probleme mit Weiterleitungen

    geschrieben von fuerderer

    Hallo sonok,

    unter den vorgegebenen Umständen schien mir dein Vorhaben zunächst schwierig, aber dann kam ich auf eine simple Idee:
    <?php
    header("Refresh: 2");
    Der HTTP-Header weist den Browser an, in 2 Sekunden die Seite neu zu laden. Bleibt nur zu hoffen, dass die Anweisung in dem eingesetzten Browser beachtet wird. Falls nicht, kann man noch die Alternative per meta-Tag versuchen.

    Du kannst auch eine andere Url angeben:
    <?php
    header("Refresh: 2; url=http://example.com/");

    Und den Mechanismis zum Mitzählen bekommst du bestimmt selbst implementiert.
  • in: mysql-Abfrage zur Ausgabe aktueller Datensätze MIT Sortierun

    geschrieben von fuerderer

    chst schrieb:
    Leider brauche ich für meine nachfolgende grafische Aufbereitung eine chronologische Aufbereitung.
    Ja, an diesem Punkt wird es schwierig mit purem SQL-Code. Ich habe auf die Schnelle auch nichts passendes gefunden.
    Da du die Datensätze aber sowieso in einem Array sammelst, kannst du dieses einfach in PHP umkehren.
    Schreibe folgende Zeile hinter die Schleife, bevor du das JSON-Objekt erzeugst:
    $output = array_reverse($output);
    Und zur Abfrage nimmst du die Zeile mit "DESC" und "LIMIT 0, 20"
    Das sollte für deinen Anwendungsfall ausreichen.
  • in: Wie kann man Seiten ladezeiten verringern

    geschrieben von fuerderer

    @htmlwerbung

    Mir ist nicht so ganz klar, wie du Grafiken und Skripte in einem Cookie ablegen möchtest. Das hört sich für mich zunächst nach einem sehr schlechten Plan an.
    Dir ist klar, dass der Inhalt von Cookies bei jeder Anfrage komplett an den Server gesendet wird?
    Möchtest du wirklich die binären Daten vollständig da rein kodieren?

    Es wäre vielleicht möglich, mit Javascript ein Bild aus einem Cookie zu lesen, (mit PHP macht es noch viel weniger Sinn) aber aus oben genanntem Grund ist das sehr ineffizient.

    Für so etwas ist eben der Browsercache da. (wurde ja bereits erwähnt) Damit werden Bilder nur einmal geladen und bleiben dann gespeichert, also genau das, was du erreichen wolltest. Außerdem hat der Nutzer (bzw. Browser) dann noch Kontrolle darüber, was er aufheben möchte und was nicht.
  • in: Bitcoin macht nur Kurzfristig sinn

    geschrieben von fuerderer

    bruchpilotnr1 schrieb:
    man muss nur das Netzwerk am leben halten und bekommt transaktionsgebühren?
    Zunächst einmal möchte ich ergänzen, dass es noch etwa 120 Jahre dauert, bis keine neuen Bitcoins mehr erzeugt werden. Aber richtig, die Transaktionsgebühren der Überweisungen bekommen die Miner trotzdem.
    Jeder der einem anderen Bitcoins überweist, legt dabei auch selbst die Transaktionsgebühren fest. In einem neu generierten Block können nur begrenzt viele Transaktionen quittiert werden. Der Miner wählt also aus eigenem Interesse die Überweisungen mit den höchsten Gebühren und erzeugt damit neue Blöcke. Hat er einen Block gefunden, darf er diese Transaktionsgebühren behalten.

    bruchpilotnr1 schrieb:
    Dachte Bitcoins kann nicht angreifbar sein, weil es ein vorgeschriebener Prozess ist?
    Der 51%-Angriff bedeutet, dass ein Angreifer mehr als die Hälfte der gesamten Rechenleistung des Netzes besitzt. Dieser kann dir dann Bitcoins überweisen und wenn die Zahlung bei dir eingetroffen ist und du ihm Gegenleistung erbracht hast, schreibt er einfach die Blockchain neu, wobei er das Geld jemandem anders überweist. Sobald seine Kette länger ist als die "offizielle" wird sie von allen Teilnehmern automatisch akzeptiert und dein Geld ist wieder weg.
    Ich gehe davon aus, dass die gesamte erbrachte Rechenleistung der Miner zukünftig eher sinkt, weil ja auch die Vergütung sinkt. Deshalb meinte ich, ein 51%-Angriff könnte einfacher werden.

    bruchpilotnr1 schrieb:
    Hab mir mal den Bitcore Client heruntergeladen und dort stand, dass es noch ca. 3 Jahre und 42 Wochen aktualisiert werden müssen. Ist das etwa das du gemeint hast? Wenn ja dann hole ich mir schonmal eine externe 2 TB Festplatte.
    Richtig, da lädt er dir bestimmt die aktuelle Blockchain herunter. Genau das stört mich an Bitcoins. Man kann nicht "mal nebenbei" daran Teilnehmen sondern benötigt große Mengen an Speicherplatz und eine entsprechende Internetgeschwindigkeit um sich ein Wallet zu eröffnen.
  • in: Bitcoin macht nur Kurzfristig sinn

    geschrieben von fuerderer

    bruchpilotnr1 schrieb:
    Allerdings ist die anzahl auf 21 Millionen begrenzt. Wenn die anzahl erreicht ist, gibt es keinen grund mehr für die Miner dies noch weiter zu machen.
    Das ist nicht ganz richtig. Die Miner erhalten zwar keine direkte Vergütung mehr, die Transaktionsgebühren bekommen sie aber trotzdem. Es ist also trotzdem nicht umsonst, weiter zu minen. Klar sinkt die weltweite Rechenleistung, wenn die Vergütung eines Blocks sinkt, aber die Leistung wird wohl nie Null erreichen. Das System wird dadurch höchstens angreifbarer, weil der 51%-Angriff einfacher wird.
    bruchpilotnr1 schrieb:
    Wenn Bitcoins verloren gegangen sind, werden sie nicht ersetzbar sein. Also wenn mehr und mehr BTC verloren gehen gibt es bald keine mehr bzw. keiner hat mehr darauf zugriff. Schlichtweg wird es immer weniger und nicht mehr.
    Richtig, wenn immer mehr Menschen ihre Wallets verlieren, führt das zur Deflation, das heißt die Preise sinken. Problematisch dürfte das jedoch nicht sein, denn ein Bitcoin lässt sich in 100 Millionen Satoshis unterteilen und kann damit auch sehr kleine Beträge abbilden. Sollte das dennoch zum Problem werden, führt die Community sicher noch nehr Nachkommastellen ein, um Bitcoins noch feiner zu unterteilen.
    Der Bestand an Bitcoins geht ja nicht sofort auf Null, nur weil ein paar Leute ihr Wallet verlieren. Dazu müssten schon alle Teilnehmer gleichzeitig das Wallet verlieren.
    Ich mache mir viel mehr Sorgen um die Blockchain, die ja etwa 100 GB groß ist und immer größer wird. Jeder Teilnehmer (oder zumindest jeder Miner) muss diese Blockchain besitzen und aktuell halten, um das System zu sichern.

    Edit: Tippfehler ausgebessert
  • in: Link ausführen zeitlich verzögern

    geschrieben von fuerderer

    Doch klar, mit Javascript geht das.
    Javascript:
    document.addEventListener("DOMContentLoaded", function() {
      var elements = document.getElementsByClassName("verzoegert")
      for (var i=0; i<elements.length; i++) {
        let e=elements[i]
        e.addEventListener("click", function(evt) {
          evt.preventDefault()
          setTimeout(function() {
            document.location.href=e.getAttribute("href")
          }, 5000)
        })
      }
    })
    HTML:
    <a href="http://example.com/" class="verzoegert">Link zu example.com</a>


    Wer kein Javascript aktiviert hat, kann den Link ohne Verzögerung aufrufen.
  • in: Oberstes Verzeichnis im Webspace

    geschrieben von fuerderer

    Wenn ich dein Problem richtig verstanden habe, reicht es einen Schrägstrich vorne an die Linkadresse anzufügen.

    Ein Beispiel:
    Nehmen wir an, du bist auf der Seite
    http://example.com/ein/unterordner/seite.html

    Wenn du jetzt als Link
    andereseite.html
    benutzt, landest du auf
    http://example.com/ein/unterordner/andereseite.html


    Stellst du einen Schrägstrich voran, also
    /andereseite.html
    dann landest du innerhalb der Domain ganz oben, also auf
    http://example.com/andereseite.html


    Falls du für die lokale Version einen Webserver laufen hast und die Seite über http://localhost/ testest, dann sollte das auch dort funktionieren. Rufst du die Seite mit dem Browser direkt von der Platte auf, dann geht das nicht. Ich nehme aber an, du hast einen Webserver, denn du verwendest ja PHP :wink:
  • in: $_session als array

    geschrieben von fuerderer

    Dein Ansatz ist gar nicht so falsch, mit der richtigen Syntax sollte dein Beispielskript funktionieren.
    <?php
        session_start();
            $spieler=array("Frank","Lutz","Thomas");
             $z=0;
            foreach ($spieler as &$value)
            {
            $z++;
            $sz="Spieler".$z;
            echo $value.$sz."<br />";
             $_session[$sz] = $value;
             Echo "session hier ". $_session[$sz]."<br/>";
            }
            echo "<hr /><hr />";
    
            echo "Mittenabfrage".$_session['Spieler2']."<br />" ;
    
            for ($zz=1;$zz<=3;$zz++)
            {
                echo "Spieler".$zz."<br />" ;
                $szz="Spieler".$zz;
                echo "Sessionsname:".$_session[$szz]."<br />";
            }
    
    ?>
    Ich habe in Zeile 10, 11 und 21 die einfachen Anführungszeichen bei der Variable $sz bzw. $szz entfernt. So wird der Variableninhalt als Schlüssel für das Array verwendet und nicht der Variablenname.
  • in: sms versenden geht nicht

    geschrieben von fuerderer

    So wie das aussieht, liegt der Fehler an der SMS-Api selbst, weil dein Programm bei der Abfrage einen Error 500 erhält. Das sollte so nicht sein.
    An dieser Stelle rate ich dir, ein Support-Ticket zu dem Problem öffnen, damit mal ein Admin nachschaut wo es denn klemmt.
  • in: sms versenden geht nicht

    geschrieben von fuerderer

    Hallo Frank,

    was genau passiert denn, wenn du das Programm ausführst? Es gibt immerhin 4 verschiedene Fehlermeldungen. Kommst du überhaupt bis zum Formular?
    Und falls du nur eine weiße Seite siehst oder ein Error 500 kommt, aktiviere bitte die Fehlermeldungen (siehe Hilfe) und versuche es erneut.
  • in: Schleife mit php-variable in javascript nutzen

    geschrieben von fuerderer

    Hallo Frank,

    ehrlich gesagt werde ich noch nicht ganz schlau, was du vor hast.
    Um ein paar Benutzereingaben zusammenzuaddieren und auszugeben, benötigst du kein PHP, das kann Javascript alleine. Wenn du aber Zahlen vom Server laden oder auf den Server speichern möchtest, dann kommt PHP ins Spiel.

    Es ist gut, dass du Code postest, was du schon versucht hast. Aber du solltest auch noch genau beschreiben, was die Seite eigentlich tun soll. Dann kann man dir hoffentlich besser helfen.
  • in: Problem mit Zuweisung auf window.location.href

    geschrieben von fuerderer

    Hallo mathesoft,

    die Zuweisung in die Variable
    window.location.href
    reicht völlig aus, um den Browser auf eine andere Seite zu leiten. Wenn du den darauf folgenden Befehl
    window.location.reload(true)
    entfernst, sollte die Weiterleitung funktionieren.
  • in: durchgängige Verbindungen von DIVs prüfen

    geschrieben von fuerderer

    airfield-manager schrieb:
    Ich hätte eine Idee abzufragen, ob ein Gebäude überhaupt an der Strasse liegt aber dann nicht ob die Strasse durchgehend ist.
    Das ist schon einmal brauchbar. Verallgemeinere das zu einer Funktion, die prüft, ob zwei Objekte aneinander grenzen.

    Danach kannst du ausgehend von der öffentlichen Anbindung die Straßen verfolgen, um zu sehen, welche davon erreichbar sind.
    Hier etwas Pseudocode:
    var strassen // Array aller Straßen, inklusive öffentlicher Anbindung
    var gebaeude // Array aller Gebäude
    
    // Zunächst alle Straßen als "nicht erreichbar" markieren, außer die öffentliche Anbindung.
    for (var i=0; i<strassen.length; i++) {
      strassen[i].erreichbar = istOeffentlichErreichbar(strassen[i])
    }
    
    // Nun alle angrenzenden Straßen ebenfalls als erreichbar definieren
    do {
      var veraendert=false
      for (var i=0; i<strassen.length; i++) {
        if (strassen[i].erreichbar) {
          for (var j=0; j<strassen.length; j++) {
            if (!strassen[j].erreichbar && grenzenAneinander(strassen[i], strassen[j])) {
              strassen[j].erreichbar=true
              veraendert=true
            }
          }
        }
      }
    } while (veraendert) // Nach jeder neu gefundenen Straße, die ebenfalls angrenzt, muss der Vorgang wiederholt werden, da an diese noch weitere Straßen angrenzen könnten.
    
    // Und zuletzt die Gebäude
    for (var i=0; i<gebaeude.length; i++) {
      gebaeude[i].erreichbar=false
      for (var j=0; j<strassen.length; j++) {
        if (strassen[j].erreichbar && grenzenAneinander(gebaeude[i], strassen[j])) {
          gebaeude[i].erreichbar=true
          break
        }
      }
    }
    // Jetzt steht bei jedem Gebäude ein Attribut "erreichbar" auf true oder false.
    Dieser Vorgang muss dann eben nach jeder Änderung (setzen, löschen, verschieben von Straßen/Gebäuden) wiederholt werden.
  • in: Datentypen php und JavaScript

    geschrieben von fuerderer

    Dieses "alert" steht in einer eigenen kleinen Funktion, welche du als Callback verwendest.
    Diese Funktion besteht bei dir nur aus den folgenden Zeilen:
    function(msg) {
      alert(msg)
    }
    Das wichtigste dabei: Nur innerhalb dieser Funktion ist die Variable "msg" gültig. (Das hat auch seinen Sinn, erst wenn die Funktion aufgerufen wird, ist das Ergebnis bekannt, vorher nicht.)
    Du musst also die Auswertung der Variable ebenfalls hier hinein schieben - z.B. gleich hinter das "alert".

    Noch eine Sache zur Sicherheit: Ich hoffe, dir ist klar, dass man die Datei "Aktivierung.html" auch einfach so aufrufen kann, wenn man keinen korrekten Aktivierungscode hat. Javascript lässt sich vollständig manipulieren, das solltest du immer beachten.
  • in: $_POST[] wird nicht immer übertragen

    geschrieben von fuerderer

    Das liegt vermutlich daran, dass htmlentities den einen String schluckt, wegen Problemen mit der Zeichenkodierung.
    Um diese Vermutung zu überprüfen, kannst du den Code einmal testweise umbauen:
    print_r($_POST);
    
    $codebl = 0;
    while(isset($_POST['codeblock'.$codebl])){
      print_r(bin2hex($_POST['codeblock'.$codebl]));
      echo "<br>";
      $codebl++;
    }
    Die Funktion bin2hex stellt die Strings hexadezimal dar, sodass ich genau nachvollziehen kann, was dein Programm empfängt und in welcher Kodierung die Strings vorliegen. Wenn du diese Ausgabe dann hier veröffentlichst, schau ich mal nach, ob es daran liegt.

    Um das Problem dann zu beheben, musst du überall die gleiche Zeichenkodierung verwenden. Die Seite, von der du die Daten wegschickst, ist hier wohl das Problem.

    Edit: Ich habe gerade diesen Beitrag von czibere wieder gefunden. Da steht ausführlich, was man alles auf utf-8 einstellen muss.
  • in: Zeitstempel beim Einlesen aus mysql in json umwandeln

    geschrieben von fuerderer

    Ersetze einmal diesen Ausdruck:
    mysql_fetch_assoc($query)
    durch das hier:
    mysql_fetch_row($query)
    Vermutlich reicht das schon. Wenn nicht, schau ich nochmal drüber.
  • in: Php: copy(); funktioniert nicht

    geschrieben von fuerderer

    Ich hab den copy-Befehl gerade auf dem Lima-City Space getestet. Er funktioniert.
    Mein Code:
    <?php
    header("Content-Type: text/plain");
    var_dump(
      copy(__FILE__, __DIR__."/copy.php")
    );
    Ergebnis: bool(true)
    und die Kopie existiert.

    Vielleicht versuchst du, die Datei über den DocumentRoot hinaus zu kopieren, also in den Bereich einer anderen Domain, bzw. sie von dort zu holen. Das funktioniert auf Lima-City nicht.
  • in: Zeitstempel beim Einlesen aus mysql in json umwandeln

    geschrieben von fuerderer

    Du kannst die Umrechnung in den Unix-Timestamp bereits von der Datenbank ausführen lassen.

    Deine Abfrage sieht momentan so aus:
    SELECT * FROM temp ORDER BY timestamp
    Zuerst musst du den Stern nach dem Wort SELECT durch eine mit Komma getrennte Aufzählung aller Spaltennamen ersetzen.
    Dann kannst du anstatt dem Spaltennamen
    timestamp
    einfach
    unix_timestamp(`timestamp`)
    einfügen. So errechnet dir die DB automatisch den benötigten Wert.
  • in: PHP exec funktioniert nicht

    geschrieben von fuerderer

    Das gepostete Skript funktioniert bei mir fehlerfrei.

    Wenn ich "exec" in der php.ini bei disable_functions eintrage, dann kommt dieser Fehler:
    Warning: exec() has been disabled for security reasons
    Auch bei Lima-City kommt genau diese Fehlermeldung. Dies ist aber bei dir offensichtlich nicht das Problem.

    Jetzt beginnen die Spekulationen ...

    Informationen über die Umgebung sind da mal angebracht. Also hast du den Server bei dir privat aufgesetzt oder hostest du die Seite irgendwo / wenn ja, wo?

    Dann könntest du noch zwei Dinge versuchen:

    1. Kannst du ein anderes Programm (z.B. "ls") ausführen?
    <?php
    exec(sprintf("ls -l > %s 2>&1 & echo $! >> %s", 'outputfile.txt', 'pidfile.txt'));
    ?>
    Sollte das klappen, schau die Ausgabe noch einmal genau an oder zeige sie uns. Denn dass mit den Dateirechten etwas nicht stimmt, ist sehr naheliegend, auch wenn du versicherst, sie auf 777 gesetzt zu haben.

    2. Hast du Zugriff auf eine Shell, dann versuch mal, diesen Shellbefehl direkt auszuführen. Also:
    ./executable > outputfile.txt 2>&1 & echo $! >> pidfile.txt


    Vielleicht kommen wir mit diesen Ergebnissen dem Fehler näher.
  • in: Datenübergabe von arduino mittels PHP-Datei an SQL-DB

    geschrieben von fuerderer

    Zu dem geposteten Code:

    Stimmt, du hast noch das Host-Feld ergänzt. Das hatte ich vergessen, ist aber ebenfalls essenziell.
    Dann solltest du noch in den Zeilen 25 und 26 das "print" durch "println" ersetzen.

    Hier nochmal der ganze Code:
    #include <SPI.h>
    #include <Ethernet.h>
    
    byte mac[] = { 0xD4, 0x28, 0xB2, 0xFF, 0xA0, 0xA1 };
    char server[]="www.bsob-leinenborn.lima-city.de";
    IPAddress ip(192,168,2,199);
    EthernetClient client;
    
    void setup() {
    Serial.begin(9600);
    Ethernet.begin(mac,ip);
    delay(1000);
    }
    
    void loop() {
    
      Serial.println();
      Serial.println("Verbindung aufbauen...");
    
     int x = client.connect(server,80);
     Serial.println(x);
     if (x > 0) {
       Serial.print ("connected to ");
       Serial.println (server);
       client.println("GET /N.php?T=65&D=565&F=78&H=666 HTTP/1.1");
       client.println("Host: www.bsob-leinenborn.lima-city.de");
       client.println("User-Agent: Arduino");
       client.println("Accept: text/html");
       client.println();
       delay(1000);
        
     } 
       else {
       Serial.println("keine Verbindung");
    } 
    client.stop();
    delay (5000);
    }

    Und zu dem Thema SSL:
    Ich empfehle dir, wie auch schon muellerlukas meinte, den Request vorerst (zum Testen) unverschlüsselt über HTTP zum Laufen zu bringen. Danach kannst du immernoch zu HTTPS wechseln.
    Das Problem mit dem "www" vor der Domain wird dann wichtig, sobald du auf HTTPS umsteigst.
  • in: Datenübergabe von arduino mittels PHP-Datei an SQL-DB

    geschrieben von fuerderer

    Hallo.

    Mir ist an deinem Codebeispiel aufgefallen, dass du noch keinen vollständigen Request sendest.

    Nimm diese Codezeile aus dem anfangs geposteten Code:
    client.print("GET /N.php?T=65&D=565&F=78&H=666");

    und erweitere das in dieser Form:
    client.println("GET /N.php?T=65&D=565&F=78&H=666 HTTP/1.1"); // Protokoll und Zeilenumbruch ergänzt
    client.println("User-Agent: Arduino"); // Lima-City braucht ein User-Agent, sonst wird der Request abgewiesen
    client.println(); // Request abschließen mit einer Leerzeile
    Ich hoffe, das hilft dir weiter.
  • in: Globale Variable setzen funktioniert nicht?

    geschrieben von fuerderer

    Ich hab während test42test aktiv war auch eine Funktion geschrieben und dazu noch gegen Race-Conditions abgesichert:
    function counter($dateiname) {
      $h=fopen($dateiname, "c+");
      flock($h, LOCK_EX);
      $zugriffe=(int)stream_get_contents($h);
      $zugriffe++;
      fseek($h, 0);
      ftruncate($h, 0);
      fwrite($h, $zugriffe);
      flock($h, LOCK_UN);
      fclose($h);
      return $zugriffe;
    }

    Dazu noch ein Beispiel zur Verwendung:
    echo "Das ist der ".counter($File_Name).". Zugriff.";
    In $File_Name muss natürlich der Name der Datei stehen, die du zum Zählen nutzen möchtest.
  • in: Hilfe für Loginscript im PHP

    geschrieben von fuerderer

    Grundlagen:
    Der Server muss sicher sein. SQL-Injection und XSS müssen dir was sagen. Maskierungen sind oberste Pflicht, bevor man sich weitere Gedanken über Sicherheit macht.

    Bezüglich des Passworts gibt es zwei Dinge zu beachten:

    1. Rainbow-Tables
    Es gibt Tabellen, in denen zu Milliarden von Passwörtern die passenden Hashs gespeichert sind. Man findet einige Cracker-Seiten im Internet, wo man nur noch den Hash eingeben muss und bei einem Treffer wird dann das zugehörige Passwort ausgespuckt. Deshalb ist ein purer Hashwert sehr unsicher. Der Hash sollte deshalb inmer mit einem Salt berechnet werden. (Am besten noch zufällig erzeugt und zusammen mit dem Hash abgespeichert.)

    2. Brute Force
    Wer ein Passwort aus einem Hashwert knacken will, kann Brute Force einsetzen. Ein einzelner Hash ist meist nach Mikrosekunden berechnet. Somit kann man Tausend bis Millionen Passwörter pro Sekunde ausprobieren. Wenn du den Hash-Algorithmus jetzt aufwändiger machst, z.B. indem du 1000 Hashwerte in einer Schleife berechnest, dann verzögert sich der Loginvorgang kaum wahrnehmbar, eine Brute-Force Attacke dauert aber 1000-Mal so lang.

    => Schau dir mal bcrypt an, dort werden diese zwei Punkte beachtet. Oder setze es selbst um. :biggrin:

    Auch in Bezug zur Session sind einige Dinge zu beachten:

    1. Session Hijacking
    Ein Angreifer gelangt an das Sessioncookie eines angemeldeten Nutzers.
    Gegenmaßnahmen: Die Session eine feste Zeit nach dem Login und auch nach einer gewissen Zeit Inaktivität ablaufen lassen.

    2. Session Fixation
    Ein Angreifer schiebt dem Opfer eine bestimmte Session-Id unter. Das Opfer meldet sich an und der Angreifer ist ebenfalls angemeldet.
    Gegenmaßnahmen: Beim Login eine neue Session-Id vergeben.

    3. Cross Site Request Forgery
    Ein Angreifer erstellt eine Angriffsseite, die (z.B. mit Hilfe von Javascript) eine Aktion bei dir im Loginbereich ausführt. Ein Opfer ist bei dir bereits eingeloggt und besucht nun die Angriffsseite. Die Aktion wird nun, meist auch noch unbemerkt, mit den Rechten des Opfers durchgeführt.
    Gegenmaßnahmen: Jedes Formular erhält ein "hidden"-Feld mit einem zufällig generierten Token. Beim Empfang muss geprüft werden, ob das Token gültig ist.

    Zusammenfassung:
    Mach dir Gedanken über die einzelnen Punkte. Nicht alles davon muss umgesetzt werden. Das ist abhängig davon, wie sicher dein System am Ende sein soll / wie viel du programmieren möchtest.
  • in: Drupal 8 und OPCache

    geschrieben von fuerderer

    thomasba schrieb:
    theaterkantine schrieb:
    Das wundert mich, zumal Lima-City doch ausdrücklich damit wirbt, dies zur Verfügung zu stellen.
    Echt? Wo denn?
    https://www.lima-city.de/2008/features
    Ich weiß zwar nicht, wie man zu dieser Seite navigieren kann, Google findet sie jedenfalls.

    Unter der Überschrift "Webspace", Punkt 20 heißt es:
    Der aktivierte Zend OPcache beschleunigt deine PHP-Seiten
  • in: Suche nach Datei mit glob()

    geschrieben von fuerderer

    Hallo webfreclan,

    Die Funktion glob() gibt für die gefundenen Dateien den gesamten Pfad zurück. Wenn du also einen bestimmten Pfad festlegst, dann treffen die case-Ausdrücke nicht mehr, da dort nur die Dateinamen ohne Pfad stehen.

    Ich habe die Pfadangabe einmal ergänzt. Das sieht dann so aus:
    <?php
    
    	function get_endung($dir = ''){
    		$file = $dir."index.*";
    		
    		foreach (glob($file) as $indexfile) {
    			switch ($indexfile) {
    				default:
    				case $dir.'index.html':
    					return 'html';
    					break;
    				case $dir.'index.php':
    					return 'php';
    					break;
    			}
    		}
    	}
    	
    echo get_endung('/var/www/html/test/test/testdir/');
  • in: Ubuntu/Bash Mysql

    geschrieben von fuerderer

    Hallo youtvti,

    meinst du sowas? Das Skript versucht, sich anzumelden, also bei falschem Benutzernamen oder Passwort liefert es ebenfalls einen Fehler.
    Host=youtvti.lima-db.de 
    Benutzername=USER000000
    Passwort=12345
    
    if mysql --host="$Host" --user="$Benutzername" --password="$Passwort" < /dev/null > /dev/null 2>&1
      then
        echo -e "MySql Online	[\033[1;32mOK\033[0m]"
      else
        echo -e "MySql Offline	[\033[1;31mFAILED\033[0m]"
    fi
    youtvti schrieb:
    kein Apache Mysql
    Was ist Apache Mysql? Ich hoffe, das betrifft nicht meinen Code.
  • in: PHP Klasse/Methode für Uploadscript will nicht

    geschrieben von fuerderer

    Hallo scriptserv,

    zuerst einmal definierst du in Zeile 19 eine Eigenschaft der Klasse "upload":
    var $fehler = 0;
    Um jetzt innerhalb einer Methode auf diese Eigenschaft zuzugreifen, musst du
    $this->fehler
    verwenden. Das betrifft die Zeilen 29, 40, 51, 61, 74 und 89.
    Zu Zeile 89 gibt es noch etwas anderes zu sagen: Ein einfaches Gleichheitszeichem ist der Zuweisungsoperator. Um Werte miteinander zu vergleichen, musst du zwei Gleichheitszeichen verwenden. Korrekt sieht das dann so aus:
    if ($this->fehler == 0)
    Der Code funktioniert jetzt bei mir, hier nochmal vollständig:
    <form name="uploadformular" enctype="multipart/form-data" action="?content=upload" method="post">
        Datei: <input type="file" name="uploaddatei" size="60" maxlength="255" >
        <input type="Submit" name="submit" value="Datei hochladen">
    </form>
    
    <?php
    
    if ($_POST["submit"]){
        $test = new upload;
        $test->checkZugelassen();
        $test->richtigesBild();
        $test->existiertBild();
        $test->bildgroeße();
        $test->existiertBereinigtesBild();
        $test->uploadBild();
    }
    class upload
    {
        var $fehler = 0;
        
        function checkZugelassen()
        {
            $zugelasseneDateien = array("image/png", "image/jpeg", "image/gif", "image/jpg");
            if (! in_array($_FILES['uploaddatei']['type'], $zugelasseneDateien))
            {
                echo "<p>Dateityp ist nicht zugelassen. <br/>
                         Bitte laden Sie nur Dateien mit folgenden Endungen auf den Server: 
                         .jpg / .png / .jpeg / .gif</p>";
                $this->fehler = 1;
                exit;
            }
        }
        
        function richtigesBild()
        {
            $check = getimagesize($_FILES['uploaddatei']['tmp_name']);
            if($check != TRUE) 
            {
                echo "<p>Das Bild hat keinen Inhalt oder ist defekt</p>";
                $this->fehler = 1;
                exit;
            }
        }
        
        function existiertBild()
        {
            $exists = file_exists("./galerie/".$_FILES['uploaddatei']['name']);
            if($exists == TRUE)
            {
                echo "<p>Der Dateiname existiert bereits</p>";
                $this->fehler = 1;
                exit;
            }
         }
        
        function bildgroeße() 
        {
            if ($_FILES['uploaddatei']['size'] > 500000) 
            { 
                echo "<p> Ihre Datei ist leider zu groß</p>";
                $this->fehler = 1;
                exit;
            }
        } 
        
        function existiertBereinigtesBild() 
        {
            $this -> clean($_FILES['uploaddatei']['name']);     
            $exists2 = file_exists("./galerie/".$_FILES['uploaddatei']['name']);
        
            if($exists2 === TRUE)
            {
                echo "<p>Der Dateiname existiert bereits (Fehler2)</p>";
                $this->fehler = 1;
                exit;
            }
        }
        
        function clean()
        {
            $_FILES['uploaddatei']['name'] = strtolower  ($_FILES['uploaddatei']['name']);
            $_FILES['uploaddatei']['name'] = preg_replace('/[^A-Za-z0-9\-.]/', '', $_FILES['uploaddatei']['name']);
            $_FILES['uploaddatei']['name'] = str_replace (array(' ','ä','ö','ü','ß','Ä','Ö','Ü'), 
            array('-','ae','oe','ue','ss','Ae','Oe','Ue'), $_FILES['uploaddatei']['name']);  
            return ($_FILES['uploaddatei']['name']);
        }   
        
        function uploadBild() {
            if ($this->fehler == 0) 
            {	
                $name = $_FILES['uploaddatei']['name'];
                move_uploaded_file($_FILES['uploaddatei']['tmp_name'],'galerie/'.$name );
    
                echo "<p>Hochladen erfolgreich: ";	
                echo '<a href="galerie/'.$name.'">';	
                echo "$name";	
                echo '</a></p>';
                exit;
            }
            else
            {
                echo "<p>Beim Hochladen gab es ein Problem";	
                exit;
            }
        }
    }
    ?>

    Vorsicht:
    Prüfe, ob das hochgeladene Bild die zum Mime-Type passende Endung hat. Ohne diese Prüfung öffnest du eine fatale Sicherheitslücke, über die ein Hacker die komplette Seite lesen/verändern kann.
  • in: Sichere Javascript Anwendung

    geschrieben von fuerderer

    So eine Javascript Verschlüsselung bringt nur scheinbare Sicherheit. Mit genug Zeit und/oder entsprechenden Werkzeugen versteht man den Code trotzdem und kann ihn manipulieren. Du darfst dir deshalb also keine falsche Sicherheit einbilden. Höchstens als Ergänzung zu einem bereits sicheren System kann man sich so etwas überlegen.

    Allgemein gilt: Du musst alles was vom Client kommt, serverseitig (also in PHP) nochmal überprüfen, ob es auch gültig ist.
    Speziell in deinem Beispiel bedeutet das: Prüfe noch einmal nach, ob die angegebene Zeit wirklich schon vergangen ist. Bedenke dabei aber auch Unregelmäßigkeiten bei der Übertragung durchs Internet.

    Wenn du das umgesetzt hast, dann ist es schon recht sicher. Du beachtest dann nur noch nicht, ob der Benutzer die Seite auch die ganze Zeit anschaut. Man könnte die Seite also öffnen und dann einfach mal den PC angeschaltet lassen und nach Stunden wieder vorbei schauen.

    Bedenke auch den Fall, dass ein Benutzer mehrere Seiten gleichzeitig (oder die gleiche Seite mehrfach) offen hat. Du musst dann entscheiden, ob man auf diese Weise mehrere Punkte pro Minute bekommen kann, oder nicht.
  • in: While Schleife

    geschrieben von fuerderer

    Im Moment läuft die Schleife einfach so lange, wie die Datenbank Ergebnisse liefert. Am sinnvollsten ist jetzt, der Datenbank zu sagen, dass sie maximal 10 Zeilen zurückgeben soll. Das geht mit dem Schlüsselwort "Limit". Ich hab es hier mal in die Abfrage (Zeile 4) eingefügt.

    Außerdem hab ich noch die Ausgabe der Tabelle umgebaut. <table> und </table> dürfen nicht innerhalb der Schleife stehen und das <br> hab ich entfernt, das gehört da nicht hin.
    <?php 
    require_once('funciones.php');
    #//Database
    conectar('localhost', 'dbo', 'akcore', 'dbo');
    $sql = 'SELECT  *  FROM characters ORDER BY Level DESC LIMIT 10';
    $result = mysql_query($sql);
    
    echo '<table id="rand06">';
    while ($row = mysql_fetch_object($result)) {
      echo "<tr>
          <th>$row->CharName </th>
          <td>is Level $row->Level has $row->Exp Exp need $row->MaxExpInThisLevel to Level up</td>
        </tr>";
    }
    echo "</table>";
    ?>
  • in: Scripte laden nur bei Einbinden am Ende des Dokuments ganz

    geschrieben von fuerderer

    Vermutlich greifst du mit Javascript sofort auf irgendwelche Elemente aus dem Body zu. Bindest du das Script im Head ein, sind diese Elemente aber noch nicht geladen und die Zugriffe schlagen fehl. Wenn du das Script am Ende des Body einbindest, sind schon alle Elemente bekannt.

    Falls das dein Problem ist, könntest du damit Abhilfe schaffen:
    document.addEventListener("DOMContentLoaded", function() {
      // Deine Zugriffe auf das Dokument
    })
    Schreibe das, was sofort (also nach dem Laden) die Seite verändert in die Funktion. Diese wird erst dann ausgeführt, wenn alle Elementknoten geladen sind und es sollte keine Fehler geben.

Login zum Webhosting ohne Werbung!