php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.01.2009, 16:10  
Neuer Benutzer
 
Registriert seit: 28.01.2009
Beiträge: 4
basti0681 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Hab paar grundsätzliche fragen

Hallo zusammen

Bin neu hier und hoff, ich frag nicht das gleiche, wie 99054589389 vor mir.

Schutz vor sql injection:

Habe einige Artikel und Tutorials gelesen. Was mich wundert, ist das nie htmlspecialchars angewendet wurde in den Beispielen, die ich gesehen habe.
Verbindet ihr das nicht mit mysql_real_escape_string??

Zu OOP:

mittlerweile trau ich mich langsam an Klassen ran.
Hab zu Übungszwecken paar Klassen geschrieben, u.a. ne kleine news- Klasse und dabei folgendes entdeckt:

PHP-Code:
class News extends MySQL{
        protected 
$result=array();
        public function 
writeNews($table,$author,$headline,$text) {
                
// stripslashes if magic quotes are on        
                
if(get_magic_quotes_gpc()) {
                        
$text stripslashes($text);
                        
$author stripslashes($author);
                        
$headlinestripslashes($headline);
                }
                
// convert lines to html breaks 1st
                
$text nl2br($text);
                
// escape all strings by mysql routine!
                
$table mysql_real_escape_string($table);
                
$headline mysql_real_escape_string($headline);
                
$text mysql_real_escape_string($text);
                
$author mysql_real_escape_string($author);
                
$sql "INSERT INTO ".$table."
                          (user, headline, text, date)
                          VALUES
                          ('$author', '$headline','$text', NOW());"
;
                
$result $this -> doQuery($sql);
                if (
$result) {
                         return 
true;            
                }
                else {
                         return 
false;
                }
     }
... 
Bei den Methoden updateNews, addComment, etc muß ich natürlich wieder magic quotes checken, stripslashes,alles escapen.... Geht das nicht eleganter?? Mir ist leider keine Lösung per array eingefallen, aber da geht bestimmt was

Und zu guter Letzt: Hab mir ne eigene MySQL- Klasse gebastelt.
Allerdings hab ich noch nicht ausgiebig viel Zeit in die exceptions investiert.
Benutzt ihr mysqli? Oder eigene Klassen? Deklariert ihr die gar als interface, damit man zusätzlich zum implementieren noch vererben kann oder schließt sich das aus wegen der public Methoden?

Danke schonmal fürs Lesen

___
edit: Sorry, den quelltext hats verzogen beim Einfügen ausm editor
__________________
life sucks - but it has a great texture

Geändert von basti0681 (28.01.2009 um 16:34 Uhr).
basti0681 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.01.2009, 16:14  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Willkommen im Forum!

Wie der Name htmlspecialchars schon sagt, dient dieser Befhel dazu, Sonderzeichen in entsprechende Entitäten umzusetzen. Das ist genau genommen nur für Nicht-Unicodezeichensätze notwendig, die nicht alle Zeichen abbilden können oder für die Ausgabe von HTML-eigenen Zeichen. Mit der Datenbank hat das nichts zu tun.
mysql_real_escape_string macht dasselbe für Datenbanken: DB-System eigene Zeichen maskieren (escapen), um so nicht die Daten zum Teil der Syntax werden zu lassen.

Zu stripslashes und get_magic_quotes_gpc gibt es jede Menge Beispiele im Netz, u.a. in den user notes im php Manual. Typisch ist, gleich die Eingabearrays ($_POST, $_GET...) oder besser Kopien davon gleich am Anfang des Scripts pauschal zu behandeln.

Zur news Klasse: Wenn die $table nicht aus usereingaben stammt, brauchst Du die nicht escapen. Zudem könnte sowas auch die Datenbankklasse übernehmen.

Zur DB Klasse: Da solltest DU nochmal etwas über OOP lesen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (28.01.2009 um 16:19 Uhr).
nikosch ist offline  
Alt 28.01.2009, 16:17  
Erfahrener Benutzer
 
Benutzerbild von Screeze
 
Registriert seit: 04.01.2009
Beiträge: 844
PHP-Kenntnisse:
Fortgeschritten
Screeze wird schon bald berühmt werden
Standard

das problem hab ich aber auch gehabt, ich hab mir bestimmt schon über 5 verschiedene tutorials angeschaut gehabt, und überall wurde htmspecialchars, entities ect. verwendet. hab vor 2 tagen das erste mal das mysql_real_escape_string gefunden.
ist das allgemein ein fehler bei vielen tutorials oder ist das eine so sicher wie das andere?
wenn ich vorher das andere verwendet habe, müsste ich dann alles umbauen um es zu sichern?
Screeze ist offline  
Alt 28.01.2009, 16:21  
Neuer Benutzer
 
Registriert seit: 28.01.2009
Beiträge: 4
basti0681 befindet sich auf einem aufstrebenden Ast
Standard

Danke schonmal. Auch für die freundliche Begrüßung!
Hatte das vor Jahren mal gelesen, daß man mit addslashes und htmlspecialchars escaped vorm in die DB einfügen.

Werds dann wohl nur noch vor den Useroutput setzen

@screeze: den ersten meiner Meinung nach richtig guten Artikel zur Sicherheit hab ich hier gelesen. Vielleicht hilfts dir ja auch weiter gruß
__________________
life sucks - but it has a great texture

Geändert von basti0681 (28.01.2009 um 16:25 Uhr).
basti0681 ist offline  
Alt 28.01.2009, 16:21  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

@screeze:
Nein! htmlspecialchars ist für DB Escaping ungeeignet! Du solltest es umbauen und Dir in diesem Zusammenhang gleich UTF-8 Codierung für Deine Komponenten (Scriptcode, Datenbankfelder...) angewöhnen.

Zitat:
edit: Sorry, den quelltext hats verzogen beim Einfügen ausm editor
Versuch mal leerzeichenbasierte Tabs im Editor.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 28.01.2009, 16:23  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

kleine Korrektur zu #2: htmlspecialchars kümmert sich ausschließlich um & " ' < und >
Für sonstige Entitäten ist htmlentities zuständig. Allerdings bildet das nur Zeichen innerhalb des angegeben Zeichensatzes ab. Man kann es also nicht dafür nutzen, Zeichen aus anderen Zeichensätzen darzustellen.
David ist offline  
Alt 28.01.2009, 16:26  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Richtig. Schon wieder verwechselt (wo doch schon entities im anderen Befehl drinsteckt. Gehirn bitte merken). Ein Grund mehr, das nicht für Datenbanken zu verwenden.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 28.01.2009, 16:28  
Erfahrener Benutzer
 
Benutzerbild von Screeze
 
Registriert seit: 04.01.2009
Beiträge: 844
PHP-Kenntnisse:
Fortgeschritten
Screeze wird schon bald berühmt werden
Standard

ich hatter immer htmlentities benutzt nicht specialchars, aber das scheints nicht besser zu machen...

*notiz an mich selbst: traue nie tutorials, auch wenn die aussagen in 6 weiteren damit übereinstimmen*
Screeze ist offline  
Alt 28.01.2009, 16:36  
Neuer Benutzer
 
Registriert seit: 28.01.2009
Beiträge: 4
basti0681 befindet sich auf einem aufstrebenden Ast
Standard

@ Nikosch: werd ich in Zukunft wohl so handhaben. Habs jetzt geändert. Geht eigentlich eh nur um das immer gleiche Wiederholen von mysql_real_escape_string sowie das stripslahes. Wär dankbar, wenn ihr da nen Tip habt, will gern so sauber wie möglich programmieren.
Von daher bin ich für jede Form von Kritik offen.
__________________
life sucks - but it has a great texture
basti0681 ist offline  
Alt 28.01.2009, 16:40  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich machs aktuell so.

Alle Scripte auf UTF-8, DB auf UTF-8, DB Verbindung dito.

Am Anfang ein Bootstrap-Script mit Frontcontroller. Im Frontcontroller oder einer geeigneten Klasse werden Kopien der Superglobalen bereitgestellt, die vorher bei Bedarf (je nach magic_quotes) mit stripslashes behandelt wurden. Zugriff über statische Methoden.

Bildschirmausgaben werden mit htmlentities maskiert, Datenbankeingaben mit mysql_real_escape_string. Letzteres übernimmt bei mir die Datenbankklasse (Das kann sinnvoll sein, wenn bspw. mehrere Datenbankverbindungen verwendet werden. Das DB Objekt enthält ja in diesem Fall die aktuelle Verbindungsressource, die man besser für mysql_real_escape_string mit angeben sollte). Bspw. kannst Du ein Array mit zu escapenden Werten übergeben, das später auch direkt mit vsprintf in die Generierung der Query eingehen kann.
Bitte beachten: Bei INT-Feld-Angaben in der Query ohne Stringbegrenzer hilft real_escpae nichts. Da sollte man explizite Typumwandlung verwenden oder %d / %f in Verbindung mit printf-kompatiblen Formatstrings oder generell immer alle Feldwerttypen mit ' ' in die Query schreiben.
Vgl:
PHP-Code:
$query 'SELECT ... WHERE id = ' mysql_real_escpae_string ($id);
// böse Falle wenn id bspw. '0 OR 1=1' ist

// besser:
$query 'SELECT ... WHERE id = ' . (int) $id// explizite Typzuweisung

// oder:
$query sprintf ('SELECT ... WHERE id = %d' $id); 

// oder:
$query 'SELECT ... WHERE id = "' mysql_real_escpae_string ($id) . '"'
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (28.01.2009 um 16:49 Uhr).
nikosch ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Anfänger und Mysql... Paar Fragen! Finaldragon PHP Tipps 2008 40 03.05.2008 10:28
Ein paar Fragen robydog PHP Tipps 2008 7 23.04.2008 11:45
habe ein paar fragen zu REGEX imported_kremser PHP Tipps 2006 11 31.01.2006 15:30
ein paar Fragen Da-JS PHP Tipps 2006 1 08.01.2006 16:36
Ein paar Fragen Diego1978 PHP Tipps 2005-2 2 13.08.2005 00:57
Noch ein paar fragen zu isamchk und INDEX und PRIMARY bendigo Datenbanken 0 29.07.2005 16:52
Paar Fragen zum Formmailer c-f-g PHP Tipps 2005 8 09.05.2005 11:14
Generelle PHP Fragen Madden PHP-Fortgeschrittene 3 11.04.2005 01:24
mal ein paar fragen zu login und "communitysytem" Fraylman PHP Tipps 2004-2 10 30.12.2004 17:32
[Erledigt] Allgemeine Anfänger Fragen PHP Tipps 2004-2 5 20.12.2004 14:57
[Erledigt] Ein paar Fragen! HELP! Off-Topic Diskussionen 9 07.12.2004 13:15
ein paar fragen! PHP Tipps 2004-2 18 16.11.2004 12:59
Ein Paar Fragen PHP Tipps 2004-2 6 10.11.2004 19:21
[Erledigt] Lamp unter Suse 9.1 / Paar Fragen! Server, Hosting und Workstations 2 21.08.2004 22:53
[Erledigt] Fragen über Fragen... wer kann helfen? PHP Tipps 2004 2 08.07.2004 21:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php immer mysql_real_escpae_string, php oop login mit begrüssung

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:12 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum