php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.05.2009, 11:00   #11 (permalink)
Benutzer
 
Benutzerbild von wassereimer
 
Registriert seit: 06.04.2009
Beiträge: 93
wassereimer befindet sich auf einem aufstrebenden Ast
wassereimer eine Nachricht über ICQ schicken wassereimer eine Nachricht über MSN schicken
Standard

Ok, dann fange ich mal an.
- Ist ja nicht so das ich mich drücke und die anderen alles machen lassen möchte.

Allerdings wäre es natürlich schön, da ich mich nicht sehr gut auskenne, wenn andere User noch Vorschläge machen was noch getan werden sollte.

1) Überprüfen ob das Script nicht direkt aufgerufen wurde, sondern nur von einem weiterem Script eingebunden wurde:
PHP-Code:
<?php
    
if( realpath($_SERVER['SCRIPT_FILENAME']) === realpath(__FILE__) ) {
        die(
"Meldung");
    }
?>
2) Bei Passwörtern braucht man eigentlich nichts machen, wenn sie via md5 übermittel werden. Dann kommt ja eh nur der Hashwert zur Datenbank

3) Wenn es eine Zahl ist, sollten wir es durch intval laufen lassen.
PHP-Code:
<?php
$test 
intval($test);
?>
4) Dann ist ja das Problem, wenn man magic_quotes_gpc aktiviert hat und stripslashes anwenden möchte, das fehlerhafte Sachen dabei raus kommen können.
Was sollte man da am besten nutzen? Wie sollte man vorgehen?

5) Wenn es sich um reinen Text handelt, einfach mit mysql_real_escape_string rüber gehen, würde ich sagen...
PHP-Code:
<?php
$test 
mysql_real_escape_string($test);
?>
Das war es dann erstmal was mir so einfällt.

Lg
wassereimer

Geändert von wassereimer (10.05.2009 um 11:06 Uhr).
wassereimer ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 10.05.2009, 11:25   #12 (permalink)
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 2.448
PHP-Kenntnisse:
Anfänger
litterauspirna befindet sich auf einem aufstrebenden Ast
litterauspirna eine Nachricht über ICQ schicken
Standard

Dein 4 Punkt verstehe ich von der Ausage her nicht ganz. Wenn dann ist nicht get_magic_quotes_gpc aktiviert sondern magic_quotes. Die Funktion get_magic_quotes_gpc ist nur eine PHP Funktion die abprüft ob magic_quotes in der ini auf on steht und wenn das der Fall ist musst die Variablen eben mit stripslashes behandeln und die bereits gesetzten escapes entfernen um eben dann doppelte escapes zu ver meiden und das machst eben so hier.

PHP-Code:
if(get_magic_quotes_gpc()==&& get_magic_quotes_gpc())
{
       
$var stripslashes($var);

Hier prüfst du eben ob magic_quotes in der ini auf on steht und wenn ja dann werden die escapes entfernt, wenn sie nicht aktiviert ist also magic_quotes auf off steht wird der Code in dem if Block gar ich erst abgearbeitet weil die Bedinung da drin get_magic_quotes_gpc()==1 nicht wahr ist.

zu 5.)
Die Aussage ist fachlich nicht ganz richtig. Wenn du in einer Sqlabfrage in der Where Clausel nach Strings (Zeichenketten) abfragst oder eben Zeichenketten in die DB schreibst, dann musst da darauf mysql_real_escape_string anwenden, auch ein Passwort im md5() Hash ist eine Zeichenkette, also würde ich auch diese prüfen. Bei Integer Werten wendest du eben intval($var) oder noch besser (int)$var an. Und bei Gleitpunktzahlen eben dann (float)$var oder auch (double)$var wenn es sich um relativ sehr genaue Berechnungen handelt (das kenne ich nur aus C so, musste in PHP damit noch nie arbeiten). Damit ist eigentlich alles abgedeckt was nun die einzelnen Datentypen angeht.

Ich zum Beispiel typisiere meine Variablen bevor ich sie nutze auch in der Deklaration noch. Also so hier.
PHP-Code:
$var = (string)$_POST['var'];
$int_var = (int)$_POST['int_var'];
$float_var = (float)$_POST['float_var']; 
Wenn man mal bisschen was mit C gemacht hat oder sich da rein arbeitet stöst man eben dann auf den Bereich Variablen Deklaration, Initialisierung und Definition. Wobei Definition eigentlich Deklaration und Initialisierung in einem sind. In C musst du halt eben die Variablen so ausgeben

Code:
printf("%d",var);
In PHP musst du bei der Ausgabe eben nicht extra formatieren. In C werden Variablen generell intern als INT Werte in den Speicher gelegt und du musst manuell für die Formatierung sorgen, in PHP wird das intern für dich übernommen.

Nun gut das weitet sich aber nun zu sehr aus und triftet stark vom Thema ab. Sorry für den kleinen Ausflug

Ich denke das müsste als Erklärung eben reichen so das du weiter dich informieren kannst.

Ich denke ich werde auf meiner Seite mal ein kleines Tut schreiben wo es sich um Grundliegende Sicherheitsvorkehrungen dreht, dank nikosch bin ich da auch sehr viel gründlicher geworden.
__________________
Ich bin Masochist denn ich bin Dynamo Dresden Fan!
http://www.lit-web.de

Geändert von litterauspirna (10.05.2009 um 11:33 Uhr).
litterauspirna ist offline   Mit Zitat antworten
Alt 10.05.2009, 12:49   #13 (permalink)
Benutzer
 
Benutzerbild von wassereimer
 
Registriert seit: 06.04.2009
Beiträge: 93
wassereimer befindet sich auf einem aufstrebenden Ast
wassereimer eine Nachricht über ICQ schicken wassereimer eine Nachricht über MSN schicken
Standard

Danke erstmal für diese Umfangreiche Antwort und für deine Beteiligung hierbei.

Dann bin ich schon mal einen Schritt weiter...
Ich habe nun eine kleine Funktion dazu geschrieben...

Bevor ein Kommentar hierzu kommt: Wie kann ich eine Funktion beenden?
Hab ich das richtig gemacht? Wird diese Meldung dann ausgegeben?
Ich wollte die Überprüfung, ob das Script nicht direkt aufgerufen wurde, sondern nur von einem weiterem Script eingebunden wurde, gerne mit in die Funktion einbauen...
PHP-Code:
<?php
function protect($var$typ)
{
  if (
realpath($_SERVER['SCRIPT_FILENAME']) === realpath(__FILE__)) {
      die(
"Meldung");
  }

  if(
get_magic_quotes_gpc()==&& get_magic_quotes_gpc()) {
      
$var stripslashes($var);
  }

  switch (
$typ) {
    case 
"text":
      
$var mysql_real_escape_string($var);
    break;    
    case 
"zahl":
      
$var intval($var);
    break;
    case 
"pw":
      
$var mysql_real_escape_string(md5($var));
    break;
  }
  
  return 
$var;
}
?>
Den Punkt mit dem Passwort habe ich geändert... Dies geht nun auch durch mysql_real_escape_string.

Was ich bei den magic_quotes meinte war, das ich öfters schon gelesen habe, das es zu Fehlern kommen kann wenn man einfach nur stripslashes macht bei eingeschaltetem magic_quotes...
Weil stripslashes dann auch zu viel entfernen kann...

Wo ist denn der Unterschied zwischen intval($var) und (int)$var?
Den einzigen den ich bisher im Netz finden konnte war, dass die Geschwindigkeiten variieren. Und intval soll davon die schnelle sein... (Quelle)

Lg
wassereimer
__________________
Wer fragt ist ein Narr - für 5 Minuten. Wer nicht fragt ist ein Narr - sein Leben lang.
Die deutsche Sprache ist Freeware, jeder darf sie kostenlos nutzen. Sie ist jedoch nicht OpenSource und eigenmächtige Veränderungen sind nicht gestattet.

Geändert von wassereimer (10.05.2009 um 12:56 Uhr).
wassereimer ist offline   Mit Zitat antworten
Alt 10.05.2009, 17:03   #14 (permalink)
Erfahrener Benutzer
 
Registriert seit: 06.06.2008
Beiträge: 2.119
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer Mensch
Wolla eine Nachricht über ICQ schicken
Standard

Einen MD5-Hash brauchst du nicht zu escapen - der enthält keine Sonderzeichen.

Die Magic Quotes kannst du auch direkt aus dem POST-Array streichen lassen. Zugleich kann man überflüssige Leerzeichen entfernen:

PHP-Code:
foreach ($_POST as $key => $value ) {
  if ( 
get_magic_quotes_gpc() ) {
    
$value stripslashes($value);
  }
  
$_POST[$key] = trim($value);

Im Script kannst du dann ganz normal mit $_POST weiterarbeiten. Wenn eine Variable nur numerische Werte annehmen darf, dann kannst du mit intval() oder (int) arbeiten:

PHP-Code:
$_POST['alter'] = (int) $_POST['alter']; 
Erst wenn Zeichenketten in einen Querystring gebaut werden müssen, erst dann kommt mysql_real_escape_string zum Einsatz:

PHP-Code:
$sql "SELECT name FROM user 
          WHERE name ='" 
mysql_real_escape_string($_POST['name']) . "'"
Wolla ist offline   Mit Zitat antworten
Alt 10.05.2009, 17:25   #15 (permalink)
Benutzer
 
Benutzerbild von wassereimer
 
Registriert seit: 06.04.2009
Beiträge: 93
wassereimer befindet sich auf einem aufstrebenden Ast
wassereimer eine Nachricht über ICQ schicken wassereimer eine Nachricht über MSN schicken
Standard

Danke auch für deine Antwort.

Zu dem MD5-Hash hat litterauspirna allerdings geschrieben:
Zitat:
Die Aussage ist fachlich nicht ganz richtig. Wenn du in einer Sqlabfrage in der Where Clausel nach Strings (Zeichenketten) abfragst oder eben Zeichenketten in die DB schreibst, dann musst da darauf mysql_real_escape_string anwenden, auch ein Passwort im md5() Hash ist eine Zeichenkette, also würde ich auch diese prüfen.
Und ich finde da hat er schon ein wenig recht. Und schaden kann es ja nicht.
Oder sehe ich da was falsch?

Zitat:
Die Magic Quotes kannst du auch direkt aus dem POST-Array streichen lassen. Zugleich kann man überflüssige Leerzeichen entfernen:
Das ist mir bewusst. - Aber ich wollte diese Funktion speziell für alle Variablen nutzen, die auch nur mit der Datenbank in Verbindung kommen.
Eine weitere Funktion wollte ich anschließend noch schreiben, für allgemeine gesendete Daten die per Post, Get oder ähnlichem übermittelt werden.

Das intval() habe ich ja schon in die Funktion eingebaut...
Ich habe die Funktion auch noch auf floatval erweitert...

PHP-Code:
<?php
function protect($var$typ)
{
  if (
realpath($_SERVER['SCRIPT_FILENAME']) === realpath(__FILE__)) {
      die(
"Meldung");
  }

  if(
get_magic_quotes_gpc()==&& get_magic_quotes_gpc()) {
      
$var stripslashes($var);
  }

  switch (
$typ) {
    case 
"text":
      
$var mysql_real_escape_string($var);
    break;    
    case 
"zahl":
      
$var intval($var);
    break;
    case 
"langezahl":
      
$var floatval($var);
    break;
    case 
"passwort":
      
$var mysql_real_escape_string(md5($var));
    break;
  }
  
  return 
$var;
}
?>
Funktioniert denn in einer Funktion
PHP-Code:
      die("Meldung"); 
?

Lg
wassereimer
__________________
Wer fragt ist ein Narr - für 5 Minuten. Wer nicht fragt ist ein Narr - sein Leben lang.
Die deutsche Sprache ist Freeware, jeder darf sie kostenlos nutzen. Sie ist jedoch nicht OpenSource und eigenmächtige Veränderungen sind nicht gestattet.
wassereimer ist offline   Mit Zitat antworten
Alt 10.05.2009, 17:28   #16 (permalink)
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 760
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

nein - litterauspirna hat nicht recht:

$pw = md5($_POST['password'];

reicht aus.
Koala ist offline   Mit Zitat antworten
Alt 10.05.2009, 17:36   #17 (permalink)
Benutzer
 
Benutzerbild von wassereimer
 
Registriert seit: 06.04.2009
Beiträge: 93
wassereimer befindet sich auf einem aufstrebenden Ast
wassereimer eine Nachricht über ICQ schicken wassereimer eine Nachricht über MSN schicken
Standard

Ok, dies habe ich angepasst...

Noch offene Fragen:
- Funktioniert "die("Meldung");" in einer Funktion?
- Muss noch etwas getan werden, was ich bisher evtl. vergessen habe?
- Kann mir stripslashes, nach der Prüfung ob magic_quotes an ist, evtl zuviel aus einem String entfernen?
- Fällt euch noch etwas auf oder würdet Ihr diese Funktion auch bei euch bedenkenlos einsetzen?

Lg
wassereimer
__________________
Wer fragt ist ein Narr - für 5 Minuten. Wer nicht fragt ist ein Narr - sein Leben lang.
Die deutsche Sprache ist Freeware, jeder darf sie kostenlos nutzen. Sie ist jedoch nicht OpenSource und eigenmächtige Veränderungen sind nicht gestattet.
wassereimer ist offline   Mit Zitat antworten
Alt 10.05.2009, 18:00   #18 (permalink)
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 760
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

man kann die Leute auch Löcher in den Bauch fragen ...

Zitat:
Funktioniert "die("Meldung");" in einer Funktion?
Wieso probiest Du das nicht selbst aus ?
Ist eben einfacher zu fragen oder wie ?

Zitat:
Kann mir stripslashes, nach der Prüfung ob magic_quotes an ist, evtl zuviel aus einem String entfernen?
Schau in die Doku.

Vielleicht fängst einfach mal an was zu machen.
Koala ist offline   Mit Zitat antworten
Alt 10.05.2009, 18:18   #19 (permalink)
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 25.134
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Fällt euch noch etwas auf oder würdet Ihr diese Funktion auch bei euch bedenkenlos einsetzen?
Auf keinen Fall.

1.
Zitat:
if (realpath($_SERVER['SCRIPT_FILENAME'])
hat weder mit den Belangen der Funktion zu tun, noch muss mehr als einmal pro Script vorgenommen werden. Ein die ist auch unpraktisch.

2.
Zitat:
if(get_magic_quotes_gpc()
Selbe Argumentation. Ist nur einmal noetig, wobei man die Funktion mehrfach für dasselbe Feld aufrufen koennte. Hat auch nichts mit "protect" oder "real_escape" zu tun.

3.
Zitat:
$var = stripslashes($var);
stripslashes funktioniert so nicht für Arrays.

4.
Zitat:
mysql_real_escape_string
Ist unnütz für Hashes und ohne Datenbankverbindung wertlos. Die ist aber kein Parameter der Funktion

5.
Zitat:
float
ist keine lange Zahl, sondern eine Gleitkommazahl. Lerne Grundlagen!

6.
Zitat:
protect($var, $typ)
nichtssagender Bezeichner, kein Default für Typ

Usw. usf. Hättest Du die Links oben mal vollständig gelesen, hättest Du einen Grossteil der Kritiken schon gekannt.
__________________
--
„Eins ist Fakt: Gescannt wird nackt!“

Privatsphäre 2.0 - Nacktscanner mit Eyetracking.
Unser Flugzeug darf kein geschlechtsfreier Raum sein.
--
nikosch ist offline   Mit Zitat antworten
Alt 10.05.2009, 20:36   #20 (permalink)
Benutzer
 
Benutzerbild von wassereimer
 
Registriert seit: 06.04.2009
Beiträge: 93
wassereimer befindet sich auf einem aufstrebenden Ast
wassereimer eine Nachricht über ICQ schicken wassereimer eine Nachricht über MSN schicken
Standard

Also eigentlich nur mysql_real_escape_string für alles...
Außer bei Zahlen halt intval oder floatval...
Bei Hashes gar nichts...

Richtig?
__________________
Wer fragt ist ein Narr - für 5 Minuten. Wer nicht fragt ist ein Narr - sein Leben lang.
Die deutsche Sprache ist Freeware, jeder darf sie kostenlos nutzen. Sie ist jedoch nicht OpenSource und eigenmächtige Veränderungen sind nicht gestattet.
wassereimer ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Antwort


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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
realpath $_server[\'script_filename\']

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:02 Uhr.




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