Hallo!
Mein Name ist David Müller, ich arbeite bei der Public Cloud Group und wohne in Frankfurt. Hier geht es hauptsächlich um Webentwicklung.Kategorien
- webdev (131)
- php (84)
- Javascript (32)
- Datenbanken (22)
- Software Engineering (12)
- Performance (8)
- Security (27)
- PHP-WTF (11)
- Best of the Web (13)
- Quicktips (32)
- Linux (4)
- Java (3)
- misc IT (10)
- Persönlich (9)
- webdev (131)
Blogroll
Neueste Kommentare
- Tristan Tate bei Javascript: Arrays kopieren
- Daniel Marschall bei Dealing with Trusted Timestamps in PHP (RFC 3161)
- Login Mit Facebook Tutorial – Logini helper bei Facebook API – Tutorial
- PHP validation/regex for URL - Design Corral bei Why URL validation with filter_var might not be a good idea
- Manuel bei Meine ultimativen Buchempfehlungen
Archiv der Kategorie: Datenbanken
MySQL-Injection mal anders
Man nehme folgenden Script-Aufbau:
<?php $mysqli = new mysqli('localhost', 'root', '', 'datatabletest'); $rating = $mysqli->real_escape_string($_GET['rating']); $sql = "SELECT name, rating FROM movies WHERE rating > " . $rating;
Da wir ja mustergültig escapen, sollte eigentlich nichts schief gehen – oder? Nun, der Benutzer übermittelt in $_GET[‚rating‘] folgenden Wert:
3 AND 0 = IF(1, BENCHMARK(1000000, MD5(REPEAT(CONVERT(1, CHAR), 1000))), 0)
Der Wert von $sql lautet danach:
SELECT name, rating FROM movies WHERE rating > 3 AND 0 = IF(1, BENCHMARK(1000000, MD5(REPEAT(CONVERT(1, CHAR), 1000))), 0)
Ein astreines DoS-Einfallstor. In solchen Fällen besser intval verwenden.
Veröffentlicht unter Datenbanken, Security, webdev
4 Kommentare
MySQL: Spaß mit float
Man nehme folgenden Code:
DROP DATABASE IF EXISTS test; CREATE DATABASE test; USE test; DROP TABLE IF EXISTS test; CREATE TABLE test (number_double DOUBLE, number_float FLOAT); INSERT INTO test VALUES (1000000000000000, 1000000000000000); SELECT number_double, number_float FROM test;
Okay, soweit noch keine Sensation. Wenn man nun aber MySQL dazu zwingt, den konkreten und exponentenfreien Wert rauszurücken, indem man folgendermaßen selektiert:
SELECT number_double * 1, number_float * 1 FROM test;
offenbart sich:
Gleiches Spiel selbstverständlich, wenn ich den Wert per PHP aus der Datenbank heraushole.… Den ganzen Post lesen
Veröffentlicht unter php, Datenbanken, webdev
4 Kommentare
MySQL „SHOW PROFILE“
Hab heute in meiner favorisierten Datenbank-GUI HeidiSQL den Query Profiler entdeckt, hinter dem sich bei genauer Recherche das MySQL-Kommando SHOW PROFILE verbirgt – nur grafisch aufgehübscht.
Eine sinnvolle Ergänzung zu EXPLAIN – grade die temporären Tabellen oder unerwartet auffällige Sortierungen fallen hier schnell auf.… Den ganzen Post lesen
Veröffentlicht unter Datenbanken, Quicktips, webdev
2 Kommentare
MySQL PROCEDURE ANALYSE – Optimale Feldtypen ermitteln
Oft wählt man aus Verlegenheit völlig überdimensionierte Datentypen (VARCHAR(512) und gut…). Ist auch irgendwie verständlich, schließlich ist oft nicht bekannt, in welche Sphären die späteren Feldinhalte vorstoßen werden. Wenn sich die Datenbank aber mal etwas eingeschwungen hat, kann es lohnenswert sein, etwas zu tweaken. Dazu hilft MySQL mit der procedure analyse.
Sieht dann so aus:
Umsetzen muss man die Vorschläge dann selbst.… Den ganzen Post lesen
Veröffentlicht unter Datenbanken, Quicktips, webdev
3 Kommentare
Best-of-the-Web 8
Ding Ding Ding. Runde 8!
- Mozilla wagt neue CSS-Experimente – Kleine Zusammenstellung, was bei Firefox 4 CSS-technisch neu kann.
- 3 Tenets for Implementing a REST API – Versionierung einer REST-API. Sollte man die API-Version über HTTP-Header oder die URL regeln?
- Online HTML5 JSON Report format – JSON lesbar machen.
- The current State of HTML 5 Forms – Welcher Browser unterstützt welches Formelement?
- Kleine Lizenzgeschichte des PHP Handbuchs – Was man bei der Verwendung des Beispielcodes aus dem Manual beachten sollte.
- Software Licenses For Dummies – Den Lizenzdschungel menschenlesbar erklärt.
- MySQL Handbuch zu Indexen – MySQL zwingen, einen Index (nicht) zu benutzen (auch interessant: ist ein WHERE-Index immer sinnvoll und wie man den MySQL Index Optimizer „überlistet“)
- command-line-fu for web developers – Teils sehr abgefahrene, nützliche Shellcommands
Veröffentlicht unter php, Datenbanken, Software Engineering, Best of the Web, webdev
Hinterlasse einen Kommentar
MySQL Limit: Anzahl Ergebnisse ohne LIMIT herausfinden
In einigen Situation ist der geneigte Entwickler interessiert an der Gesamtzahl der Ergebnisse, die eine Abfrage ohne LIMIT – Klausel ergeben hätte. Die Holzhammermethode in so einem Fall ist, die Abfrage einfach nochmal ohne LIMIT abzufeuern. Doch es geht besser. Und zwar mit folgendem Konstrukt:
SELECT SQL_CALC_FOUND_ROWS productid, price, stock FROM products WHERE price > 100 LIMIT 10, 30; SELECT FOUND_ROWS();
Durch das „Einschleusen“ von SQL_CALC_FOUND_ROWS können wir direkt danach mit FOUND_ROWS() die Gesamtzahl an Ergebnissen erfragen. Für den Fall, dass nur ein Attribut selektiert werden soll, kann man auch direkt eine Abfrage draus machen:
SELECT SQL_CALC_FOUND_ROWS productid FROM products WHERE price > 100 LIMIT 10, 30 UNION SELECT FOUND_ROWS();
Auf die Art und Weise wird an das Resultset als letzte Zeile noch die Gesamtzahl an Ergebnissen ohne LIMIT angehangen.… Den ganzen Post lesen
Veröffentlicht unter Datenbanken, Quicktips, webdev
9 Kommentare
MySQL Storage Engine Vergleich – Warum MyISAM?
Neuerdings ist InnoDB die Standard-Engine von MySQL, was ich echt vernünftig finde. Ich finde es erstaunlich, wie sich MyISAM so lange halten konnte und würde gern verstehen, warum. Meiner Meinung nach zeichnet die Verbreitung von MyISAM ein trauriges Bild für Webanwendungen im Allgemeinen. Foreign Keys sind ein Segen! Deshalb die gewagte Aussage: Webanwendungen werden oft als wilder Hack hingeschustert, weswegen auch auf Datenbankseite keine vernünftige Integrität gebraucht wird.
Anders kann ich mir jedenfalls nicht erklären, wie es MyISAM zu solch einer hohen Verbreitung geschafft hat. Nachfolgend führe ich nochmal eine kleine (von mir kommentierte) Gegenüberstellung auf, die die wichtigsten Unterscheidungsmerkmale umfasst:
MyISAM
- Die Daten-Speicherung in little endian soll für eine Maschinenunabhängigkeit / Betriebssystemunabhängigkeit sorgen – Ich weiß nicht, in wiefern das im Webumfeld praxisrelevant ist (LAMP als Standard-Stack).
Veröffentlicht unter Datenbanken, webdev
7 Kommentare
Datenbank-Transaktionen von akademischer Seite: Behind the Scenes
Disclaimer
An diejenigen mit ordentlichen Vorkenntnissen auf dem Gebiet der Transaktionen: Bitte nicht Abschrecken lassen. Es geht nach der kurzgehaltenen Einführung noch ordentlich in die Tiefe.
Was sind Transaktionen
Nach Definition ist eine Transaktion eine logische Arbeitseinheit, die entweder ganz oder garnicht durchgeführt wird. Bei einem Fehler wird die Datenbank also in den Zustand vor Ausführung der Transaktion versetzt, als ob nie etwas geschehen wäre.
Beispiel: Wo könnte man Transaktionen mehr benötigen als auf einem Gebiet, auf dem Fehler richtig weh tun? Die Bankenwelt! Man stelle sich folgendes ultrasimples Datenmodell vor:
CREATE TABLE `konto` ( `kontonr` INT NOT NULL PRIMARY KEY , `betrag` INT NOT NULL DEFAULT '0', `kundenid` INT NOT NULL ) ENGINE = INNODB; CREATE TABLE `ueberweisung` ( `ueberweisungsid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `from_kontonr` INT NOT NULL , `to_kontonr` INT NOT NULL , `betrag` INT NOT NULL ) ENGINE = INNODB;
Man beachte InnoDB als Engine, da MyISAM keine Transaktionen unterstützt.… Den ganzen Post lesen
Veröffentlicht unter php, Datenbanken, Security, webdev
9 Kommentare
#1062 – Duplicate entry ‚2147483647‘ for key ‚PRIMARY‘
Das war mal wieder grad mal wieder ein Fehler, wie er im Buche steht. Anwendung läuft seit Jahren astrein, aber auf einmal frisst die Tabelle keine neuen Einträge mehr. Als Entwickler sollte einem die Zahl 2147483647 ja bekannt vorkommen. Folgender Ablauf zum reproduzieren:
CREATE TABLE `produkt` ( `artikelnr` int(11) NOT NULL, `preis` float NOT NULL, PRIMARY KEY (`artikelnr`) );
Und der Inhalt:
INSERT INTO produkt (artikelnr, preis) VALUES (2147483647, 4.99); INSERT INTO produkt (artikelnr, preis) VALUES (2147483648, 6.95);
Das zweite insert-Statement liefert: #1062 – Duplicate entry ‚2147483647‘ for key ‚PRIMARY‘.
Simple Erklärung:
… Den ganzen Post lesenThe number 2,147,483,647 is the maximum value for a 32-bit signed integer in computing.
Veröffentlicht unter Datenbanken, webdev
7 Kommentare
Was die Cloud, AJAX, HTML5 und NoSQL gemeinsam haben
Antwort: Alles ist fürchterlich cool und wird von den wenigsten Benutzern dieser Ausdrücke wirklich verstanden.
Ich bin Pionier! 1999 lud ich bereits Bilder auf meine GeoCities „Webseite“ und brachte damit meine Daten in der Cloud unter! AJAX war lange Zeit (und ist vielleicht bei manchen immernoch) ein Synonym für alles, was es im Web an coolen Sachen gibt. AJAX hat jetzt allerdings eine starke Konkurrenz: Das mega-abgefahrene HTML5! Ob bunte CSS-Übergänge, Canvas oder WebWorker: Es ist neu, krass und HTML5 ja sowieso.
So, nachdem das mal gesagt wurde, solls um das eigentliche Thema dieses Posts gehen: NoSQL.
Ich finde die aktuelle Situation ja sehr interessant: Bis vor etwa 2 Wochen war NoSQL noch der Stern am Datenbankhimmel.… Den ganzen Post lesen
Veröffentlicht unter Datenbanken, webdev
3 Kommentare