Datenbank-Einträge vor dem einfügen "codieren"

Ich hab hier 'mal ein kleines Script gebastelt, das Einträge "codiert" in die Datenbank schreibt:
Code:
function real_encode_string($string) {
    $firststring = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
    $secondstring = array("<:a:>", "<:e:>", "<:i:>", "<:o:>", "<:u:>", "<:A:>", "<:E:>", "<:I:>", "<:O:>", "<:U:>");
    $string = str_replace($firststring, $secondstring, $string);
    return $string;
}
function real_decode_string($string) {
    $firststring = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
    $secondstring = array("<:a:>", "<:e:>", "<:i:>", "<:o:>", "<:u:>", "<:A:>", "<:E:>", "<:I:>", "<:O:>", "<:U:>");
    $string = str_replace($secondstring, $firststring, $string);
    return $string;
}
Meine Frage 'nun an euch:
Ist dieses Script sicher genug?
Dass es mysql_query's in mysql_q<:u:><:e:>ry's umwandelt, müsste klar sein :D
Der Server müsste dann die Befehle nicht mehr erkennen, stimmt das?

L.G. PCFreund
PS: Ja ihr dürft den Script verwenden, war ja nich so schwer :D
 
Gegenfrage: was genau erwartest du dir von dem Script? Dass es SQL-Injections unterbindet?

In SQL-Injections wirst du kein "mysql_query" finden, sondern Code, welcher den reinen SQL-Code (also das was IN mysql_query(....) steht) manipuliert.

Dieses Script von dir ist in meinen Augen nur unnötiges Aufblähen und bringt keinen großen Gewinn.

Viel wichtiger ist, dass du sämtliche User-Eingaben mittels mysql_real_escape_string() escapest und z.B. dort, wo Zahlen erwartet werden, explizit in int castest, dort wo Fließkommazahlen erwartet werden explizit in float castest und da, wo ein ganz bestimmtes Format erwartet wird (E-Mail-Adressen, URLs), mit regulären Ausdrücken prüfst, ob die Eingaben korrekt sind.
 
Ich sehe das genauso. Das Script wird dir nichts bringen.

Beherzige beavisbee's Sicherheitstipps und verwende zusätzlich noch Whitelists. Wenn du also irgendwo eine bestimmte ID erwartest, prüfe anhand einer Whitelist ob es die ID auch gibt, usw.
 
mich würd mal der ansatz hinter deinen sript da interessieren?
gehst du davon aus, das alle schädlichen befehle mit vokalen daherkommen und du die so rauskickst?
 
Gegenfrage: was genau erwartest du dir von dem Script? Dass es SQL-Injections unterbindet?

In SQL-Injections wirst du kein "mysql_query" finden, sondern Code, welcher den reinen SQL-Code (also das was IN mysql_query(....) steht) manipuliert.
1. jap ich will sql-injections unterbinden
2. "INSERT INTO `test` SET `bla` = 'xD'" wird zu
"<:I:>NS<:E:>RT <:I:>NT<:O:> `t<:e:>st` S<:E:>T `bl<:a:>` = 'xD'"

gibts von außen trotzdem noch irgendwie eine möglichkeit, mich hacken zu können ?!
und achja:
mysql_real_escape_string() wird davor ausgeführt :D
 
wenn du mysql_real_escape_strings() schon drin hast, wozu dann das noch?
und ja, es gibt IMMER möglichkeiten irgendwo was zu hacken. auch profis bauen hier und da sicherheitslücken rein, einfach weil irgendwas zu komplex wurde.
sicher is netzwerkkabel ziehen :p
 
1. jap ich will sql-injections unterbinden
2. "INSERT INTO `test` SET `bla` = 'xD'" wird zu
"<:I:>NS<:E:>RT <:I:>NT<:O:> `t<:e:>st` S<:E:>T `bl<:a:>` = 'xD'"

gibts von außen trotzdem noch irgendwie eine möglichkeit, mich hacken zu können ?!

Ja.

Es gibt auch SQL-Injections, die ohne Vokale auskommen.
Das allseits Bekannte
Code:
' or 1=1/*
zum Beispiel.
Zudem könnte man das ein oder andere auch Hexadezimal schreiben.

Daher ist deine Idee im Prinzip überflüssig. Um SQL-Injections effektiv zu verhindern, musst du woanders ansetzen, z.B. wie es mysql_real_escape_string() tut. Allerdings ist das allein auch nicht 100%-ig sicher.
 
und was auch ganz nützlich ist: Dinge, gegen die man ein System absichern will, selbst probieren...

Also selbst mit dem Thema SQL-Injections beschäftigen, um zu verstehen, was da im Hintergrund passiert. Nur so kann man abschätzen, welche Maßnahmen sinnvoll sind und welche ehr weniger...
 
Was spricht eigentlich gegen Prepared_Statement oder PHP prepared-statements als Anti-SQL-Injection? Oder wäre das zu einfach ;) ?
Das hab ich mit PDO gemeint. Mir fiel nur der Begriff nichtmehr ein.
Danke CDW :)

Dresko hat gesagt.:
"or" hat meiner Meinung nach auch einen Vokal :p

Wenn du deinen Server wirklich sichern willst würde ich zuerstmal den Server richtig konfigurieren.
* mysql Port nur auf localhost binden
* Sonst nur die nötigen Ports nach außen forwarden (80, 25, 110, ...)
* SSH/phpMyAdmin nur mit Ip aus dem LAN -> Für den Zugriff von außen einen VPN-Server aufsetzen
* Apache Konfiguration (Logs, Information Disclosure, ...)
* Linux System -> chroot
* User-Rechte mit denen der Web-Service läuft
...

MfG
Inliferty
 
Zurück
Oben