Taugt die Sicherheit was?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
all
array
buchstabe
code
ehrlich sagen
funktion
http
index
klammern
lernen
manual
methode
muster
problem
sicherheit
system
tip
url
versuchen
zahl
-
also ich hab mal bissel was rumgelesen und ich muss ganz ehrlich sagen, in sicherheit bin ich ein großer noob!
aber es ist ja wichtig, also hab ich was versucht, aber ich hab keinen schimmer ob sowas was taugt.
hier erstmal die class:
class save { public static function init() { if (get_magic_quotes_gpc() == 0) { self::save_cookie(); self::save_get(); self::save_post(); } } private static function save_get() { foreach($_GET as $k => $v) { $_GET[$k] = addslashes($v); } } private static function save_post() { foreach($_POST as $k => $v) { $_POST[$k] = addslashes($v); } } private static function save_cookie() { foreach($_COOKIE as $k => $v) { $_COOKIE[$k] = addslashes($v); } } public static function is_email($mail) { $muster = "/^[A-z0-9-_.]+@[A-z0-9-_.]+\.[A-z]{2,4}$/"; if (preg_match($muster, $mail) == 0) { return false; } else { return true; } } public static function is_int($var) { if (intval($var) == $var) { return true; } else { return false; } } public static function is_str($var) { $muster = "/^[A-z0-9-]$/"; if (preg_match($muster,$var) == 0) { return false; } else { return true; } } }
kurz aufklärung:
die init() soll prüfen ob die magic_quotes an ist, wenn nich, dann übernimmt die class das maskieren aller GPC. ich weiß nicht ob das wirklich was taugt, aber hilft vllt?
is_mail ist um rauszukriegen ob das ne mail ist (die man reingibt). is_int eben um zu prüfen ob das eine zahl ist (integer) und is_str ob das ergebnis eben meinem muster entspricht. eben nur buchstaben, zahlen und des minus (bindestrich). brauch ich um bestimmte werte eben auf "legalität" zu prüfen.
taugt sowas überhaupt was? oder ist das reiner schwachsinn?
nochwas:
ich nutze eine eigene art und weise die URL auszulesen:
function get_url($v=all) { $url = $_SERVER['QUERY_STRING']; $array = explode('-', $url); if (is_numeric($v)) { return ($array[$v]); } return ($array); }
die url die damit ausgelesen werden soll sieht dann in etwa so aus:
index.php?page-value1-value2
das ist dazu da um die daten sauber zu übergeben und lesbare URLs zu erhalten.
mir persönlich kommt die funktion nackt vor, darum wollt ich eig den query-string auch prüfen, aber wenn ich den manipuliere dann kommen da so komische dinge raus 0.0
ich erklärs mal:
index.php?'modul'-"test"
wenn ich den querystring ausgebe erhalte ich:
%27modul%27-%22test%22
das ist direkt da, wenn ich in der oberen funktion
beifüge. aber warum? ich versteh das irgendwie nicht.echo $url;
und zur sicherheit der funktion (damits unbeirrt läuft) soll eig alles was nicht buchstabe oder zahl ist einfach rausgeholt werden. sodass aus'bla/h(8
einblah8
zu machen. vllt hat jemand eine lösung?
vielen dank =) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Also prinzipiell ist addslashes schon nicht schlecht. Am besten haust du danach noch ein html-entities dran. ich mache dies aus Sicherheitsgründen sogar in jedem Fall - egal ob nun magic_quotes an ist oder nicht. Bei jeder Variable die übergeben wird, wird erstmal escaped. Damit bist du meist schonmal auf der sicheren Seite.
Ich verstehe grade nicht ganz, warum du nicht die standard $_GET-Variante nimmst, um deine Variablen zu übergeben, aber um dein Problem zu erklären: Die URL unterstützt nicht jedes Zeichen, so beispielsweise nicht die Anführungszeichen, welche vom Browser zum Hex-Wert umgerechnet werden. Das ganze nennt sich dann URL-Encoding. Um das los zu werden könntest du mal urldecode ausprobieren - wobei ich nicht weiss, in wiefern das ganze dann ggf. Sicherheitstechnische Probleme gibt.
Anhang:
* htmlentities
* urldecode
So, ich hoffe ich habe jetzt nichts übersehen. -
Also, fangen wir an mit der allgemeinen Idee:
Um es kurz zu machen: Der Ansatz ist falsch; zumindest für die meisten Zwecke. Mit deiner Methode maskierst du absolut alle Usereingaben und zwar alle mit der selben Methode: addslashes(). Das ist aber eigentlich nur nützlich, wenn du eine eine SQL-basierte Datenbank schreibst. Wenn du die Usereingabe mit echo ausgibst, dann helfen dir die \ nicht weiter. In diesem Fall müsstest du eher '<', '>' und '&' maskieren. Oder du willst jetzt die Usereingabe in eine Textdatei schreiben. Dann hast du in der Datei lauter unnötige \. Daher sollte man allgemein immer erst dann escapen, wenn es wirklich nötig ist.
ich mache dies aus Sicherheitsgründen sogar in jedem Fall - egal ob nun magic_quotes an ist oder nicht. Bei jeder Variable die übergeben wird, wird erstmal escaped. Damit bist du meist schonmal auf der sicheren Seite.
Hier wirst du schnell feststellen müssen, dass das nicht sinnvoll ist. Wenn magic_quotes jetzt aktiviert ist und du dann nochmal dein addslashes drauf haust, dann wird \ nicht zu \\, sondern zu \\\\. Wenn du das dann wieder ausgibst, sieht das seltsam aus ;)
In Wirklichkeit macht man gerade das Gegenteil, man versucht die Magic Quotes wieder zu entfernen, wenn sie denn an sind.Wie das geht, findet ihr hier: http://www.php.net/manual/de/security.magicquotes.disabling.php. Warum magic quotes und automatisches Escaping wie in deiner Klasse nicht verwendet werden sollten, findet ihr noch mal hier zusammengefasst: http://www.php.net/manual/de/security.magicquotes.whynot.php
Wenn du übrigens dem ersten Link folgst und in den ersten User-Kommentar guckst (das Script benutze ich immer), dann fällt dir vielleicht auch ein allgemeiner Fehler in deiner Implementierung auf. Und zwar kann $_GET nicht nur ein "flaches" Array sein, sondern auch mehrdimensional. Daher wird in diesem Code Schnipsel auch array_walk_recursive benutzt ;)
public static function is_email($mail) { $muster = "/^[A-z0-9-_.]+@[A-z0-9-_.]+\.[A-z]{2,4}$/"; if (preg_match($muster, $mail) == 0) { return false; } else { return true; } }
Hier nur so ein Tipp aus Erfahrung: Nutze um die Mail zu prüfen lieber einen möglichst simplen und viel zulassenden PCRE, beispielsweise '#^[^@]+@(?:[^.]+\.)+[A-Za-z]{2,6}$#' (hoffe ich hab mich grad net vertippt, ist ungetestet.) Dieser PCRE wird wohl alle Emails durchlassen außer die aller exotischsten mit IPs und Sondernotationen, deiner hingegen würde unter anderem viele Fremdsprachige nicht zulassen. Weiterhin würde ich noch einen Check des MX-Records der Domain über getdnssrr() machen (dazu findeste im Netz was ;) Zusammen (also PCRE und checkdnsrr) ist das schon ziemlich sicher ;)
public static function is_int($var) { if (intval($var) == $var) { return true; } else { return false; } }
Nur ein Coding Style Tipp: Du hast da eigentlich genau das selbe stehen wie:
public static function is_int($var) { return intval($var) == $var; }
Da nochmal ein if drum zu packen ist schlichtweg unnötig ;) (Gilt auch für die preg_match Beispiele ;)
function get_url($v=all) { $url = $_SERVER['QUERY_STRING']; $array = explode('-', $url); if (is_numeric($v)) { return ($array[$v]); } return ($array); }
Hm, also was genau das bringt versteh ich net so recht. Also warum benutzt du diese Variante?
PS: Die Klammern um das return sollte man weglassen, return ist keine Funktion. (Wenn du die Klammern benutzt wirst du spätestens Probleme bekommen, wenn du Referenzen zurückgibst, return (&$array) geht im Gegensatz zu return &$array nämlich nicht ;)
Schlusswort: Alles nur meine Meinung. Andere sehen es vielleicht so, dass sie allgemein alles Escapen und dann an bestimmten Stellen wieder unescapen ;)
Ah, und nochwas: Ich selbst benutzte meine eigene Datenbankklasse: http://github.com/nikic/DB. Die bietet eine einfache Möglichkeit das Escaping zu automatisieren. Die Klasse setzt aber vorraus, dass du PDO verwendest ;)
€dit: Und es ist super, dass du dich so um die Sicherheit deiner Appliketionen scherst ;)
Beitrag zuletzt geändert: 21.6.2010 13:27:34 von nikic -
ich fühle mich gerade voll gegen die wand gelaufen...
so dummer anfänger fehler... kla, escaped wird ja nur im zusammenhang mir SQL, dies ist das erste mal dass ich komplett ohne SQL arbeite. das system soll auf flatfiles basieren. da kann ich das eig weglassen (daran denken muss ich trotzdem). es soll später eine SQL unterstützung vllt modular dazusteckbar sein, aber dann, wie du sagtest nikic, muss man das selbst entscheiden ob des escaped werden soll oder nich. ich hab einfach zu lang schon nichtsmehr mit php gemacht...
ich hab des mal versucht so aus zu schalten (ini_set() kommt mir da so spät vor):
php_flag magic_quotes_gpc Off php_flag register_globals Off php_flag allow_url_fopen Off php_flag display_errors Off
in einer .htaccess. ich bin noch am googlen um mir die PHP.ini values leichter umändern zu können.
über so exotische emails hab ich noch nie nachgedacht (bin ich beschränkt...) aber das ist eine gute idee. ich werd mir da mal bissel gedanken machen. deins sieht schon ganz gut aus, werd ich mal nachvollziehen (sieht ungewohnt aus^^)
dein codestyle tipp werd ich auch gerne beherzigen und versuchen mir anzugewöhnen, das ist viel übersichtlicher und einfacher. ich habe noch eine menge zu lernen doch ich werde es schaffen meister
des return keine funktion ist das weiß ich, nur ich dachte irgendwo mal gelesen zu haben dass die klammern dazugehören (manches ohne klammern nicht geht) und des sieht sauber aus. aber dann hab ich mich wohl vertan und die klammern waren gerade schuld DAS es nicht geht. ok, da hab ich wohl falsch erinnert^^
die funktion get_url()
function get_url($v=all) { $url = $_SERVER['QUERY_STRING']; $array = explode('-', $url); if (is_numeric($v)) { return ($array[$v]); } return ($array); }
habe ich vor langer zeit (vor dem halben jahr lernphase und entspannung) viel benutzt. wofür genau die war hab ich keine ahnung, muss ich ehrlich sagen. dazu hab ich ne zu mieserable dokumentation, aber sie wird einen sinn gehabt haben. außerdem finde ich sind die URLs so so schön aufgeräumt und es ist einfach^^
über die URL sollen nur daten per dies übergeben werden. ich halte wenig von get, muss aber noch prüfen wie die ganze suppe darauf reagiert (wenn in einem modul get benutzt wird). mod_rewrite ist auch ne feine sache nur kenn ich mich damit nicht aus, und wenn ich nichtmal die grundlagen richtig beherrsche wie ich im mom das gefühl habe, dann weiß ich nicht ob ich neues dazulernen will um das dann "schlampig" zu benutzen.
aber das URL en/decoden kommt mir da so gelegen, die funktion soll ursprünglich nur buchstaben und zahlen in den zeichenketten kriegen, so werden komische zeichen noch komischer und man fällt bis jetzt immer ins fallback system wegen unangenehmen wert (bei sonderzeichen aber denk ich auch)^^
deine klasse werde ich mir nachher mal anschauen wie sie funktioniert, ob ich daraus etwas lernen kann was mir hilft, und wie sie funktioniert. bin ich gespannt drauf =)
sicherheit ist mir sehr wichtig, nur muss ich ganz ehrlich sagen: sicherheit ist ein großes wort für einen kleinen mann. ich bin mir selbst nichtmal sicher wie ich immer davon ausgehen kann "sicher" zu sein. alle werte prüfen ist ein anfang, das versuche ich auch stets, aber wie ist prüfen richtig? mit meinen statischen funktionen will ich prüfen ob die werte einem bestimmten typ/muster/wert entsprechen, und sie erst verarbeiten wenn sie dem typ/muster/wert entsprechen. auch die nachverarbeitung ist darauf aus ein fallback zu haben, also wenn die werte nicht so sind wie erwartet dass dann das system sagt "nein, will ich nich" oder so. nur sich immer daran zu orientieren ist schwer (bzw gewöhnungsbedürfitg).
wenn ihr noch irgendwelche hinweise oder vorschläge habt wie man "sicherheit im selbstversuch" verbessern kann, also wie man "sicherheit erhöht" (ja, sicherheit ist immer relativ), bin ich euch dankbar =)
ich will sichere grundsteine haben um darauf aufzubauen und will etwas "gutes" fabrizieren und keinen "schlampigen " code. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage