Portal > Foren > PHP > PHP-Programmierung > frage zu "falscher" get-variable
Antwort
 
Themen-Optionen
Alt 30.03.2008, 20:37 Nach oben    #1
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard frage zu "falscher" get-variable

moin!

ich uebergebe per link zb, profil.php?uid=12, die userid 12. funktioniert, weil den user mit der id 12 gibt es. nehmen wir mal an ein benutzer editiert den link zu bloedsinn wie profil.php?uid=1edf_werw32...dann krieg ich hier nur fehlermeldungen. wie fange ich sowas ab?
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.03.2008, 22:46 Nach oben    #2
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Überprüf, ob es sich bei $_GET['uid'] um eine Zahl handelt. Am einfachsten geht das mit is_numeric().
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.03.2008, 22:53 Nach oben    #3
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

hi!

gut, aber wenn die zahl trotzdem keiner uid entspricht wirft er auch fehlermeldungen aus, denn ich verwende $uid in einer query (where uid = $uid)...
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.03.2008, 23:47 Nach oben    #4
Der Student
 
Benutzerbild von Flor1an
 
Registriert seit: 03.01.2007
Ort: München
Beiträge: 86
Standard

Naja ist doch recht einfach. Wenn der Query "leer" ist, also keine Daten zurück gibt weißt du dass es diesen User nicht gibt! Dann kannst du selber entweder nichts machen oder ne eigene Fehlermeldung dem Nutzer anzeigen.
__________________
Wenn ich du wäre, wäre ich lieber ich.

http://www.clubstars.net
http://www.x-tinct.de
Flor1an ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 00:33 Nach oben    #5
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

und hoffentlich escapst du $uid ! sonst kann dir darüber jemand CODE in dein Query einschleusen!
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 10:09 Nach oben    #6
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

Zitat:
Zitat von robo47 Beitrag anzeigen
und hoffentlich escapst du $uid ! sonst kann dir darüber jemand CODE in dein Query einschleusen!
was ist escapen und wie mache ich das?!

Zitat:
Naja ist doch recht einfach. Wenn der Query "leer" ist, also keine Daten zurück gibt weißt du dass es diesen User nicht gibt! Dann kannst du selber entweder nichts machen oder ne eigene Fehlermeldung dem Nutzer anzeigen.
ah jo, dann mache ich einfach nach der query ein mysql nums rows und wenn da nix kommt dann breche ich die ganze aktion ab.
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 10:17 Nach oben    #7
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Zitat:
Zitat von richy Beitrag anzeigen
was ist escapen und wie mache ich das?!
http://de2.php.net/mysql_real_escape%20string
Schau dir vor allem die Beispiele an.

Zitat:
Zitat von robo47 Beitrag anzeigen
und hoffentlich escapst du $uid ! sonst kann dir darüber jemand CODE in dein Query einschleusen!
Nicht, wenn überprüft wird, ob es sich um eine Zahl handelt.
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 11:40 Nach oben    #8
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

ok... muss ich bei jedem query irgendwas escapen, oder nur wenn ich einen string uebergebe?

nehmen wir mal an ich habe eine liste.php, die defaultmaessig alle profile listet.

jetzt baue ich die moeglichkeit ein diese liste zu filtern per liste.php?zeigen=neueste_profile und setze die query in eine if-klammer:
PHP-Code:
if ($_GET[zeigen] == "neueste_profile")
{
 
$sql "blablabla;";

muss ich nur im letzeren fall etwas escapen oder auch bei der defaultabfrage?
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 11:43 Nach oben    #9
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Du musst immer dann escapen, wenn du Eingaben vom Benutzer in die Query mit einbaust.
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 11:45 Nach oben    #10
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.213
Standard

Grundregel dabei ist: ALLES was vom Benutzer kommt kann auch Schaden anrichten.

Was Sicherheitsfragen rund um PHP angeht kann ich dir dieses Buch empfehlen!
PHP-Sicherheit
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 13:01 Nach oben    #11
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Zitat:
Zitat von richy Beitrag anzeigen
ok... muss ich bei jedem query irgendwas escapen, oder nur wenn ich einen string uebergebe?
Hi.

Du musst einfach sicherstellen, dass die übergebenen Werte den Sinn deiner Abfrage nicht umbiegen können. Angenommen, du hast folgende Abfrage:

PHP-Code:
$sQuery "SECET * FROM `users` WHERE `user` = '$sUser'"
Du gehst davon aus, dass der Wert $sUser eine Zeichenkette mit einem zu prüfenden Benutzernamen ist. Aber ist das auch wirklich so? Wo kommt dieser Wert her?

Das könnte z.B. so aussehen:
PHP-Code:
$sUser 'guest';

if(isset(
$_REQUEST['user']))
    
$sUser $_REQUEST['user'];

$sQuery "SECET * FROM `users` WHERE `user` = '$sUser'"

Das bedeutet also, dass hier jeder beliebige Benutzer (oder Angreifer) diesen Wert selbst festlegen kann. Konkret heißt das, dass du der Öffentlichkeit folgendes Werkzeug anvertraust:

Code:
SECET * FROM `users` WHERE `user` = '<beliebige Eingabe>'
Was also, wenn der Benutzer deine Seite mit folgendem Parameter aufruft (URL-kodiert natürlich) :

?user=niemand' or `user`='admin

Zusammengesetzt mit obigem Code wird daraus die Abfrage:
Code:
SECET * FROM `users` WHERE `user` = 'niemand' or `user`='admin'
So einfach kann sich der Benutzer dann z.B. die Daten des Administrators anzeigen lassen oder manipulieren.

Jetzt stellt PHP für sowas einen halbherzigen Schutzmechanismaus zur Verfügung, den du über die Konfigurations-Option magic_quotes.gpc an- und ausschalten kannst:

http://php.net/manual/en/security.magicquotes.php

Dadurch werden also z.B. Hochkommata escaped. Das ist nett gedacht, aber letztlich nervig und unsinnig und schlecht umgesetzt, siehe hier:

http://bugs.php.net/bug.php?id=29776

Das eigentliche Problem ist ein konzeptionelles, denn woher soll PHP wissen, was du mit den Daten vorhast. Hast sicherlich schonmal Gästebücher oder automatisch generierte E-Mails gesehen, in denen dann z.B. Hallo \"Paul\" zu lesen war.

Besser ist folgendes Vorgehen: Alle Daten so annehmen, wie sie vom Benutzer gemeint waren bzw. eben geschickt wurden und dann, je nach Verwendung die enthaltenen Sonderzeichen entschärfen.

Also:
1. magic_quotes.gpc überprüfen und ggf. die Wirkungen rückgängig machen, um die ursprünglichen daten wieder herzustellen (siehe z.B. den Code von php at kaiundina dot de im oben verlinkten Bug-Report).

2. Je nach Verwendung Daten manipulieren. Hier musst du eben sicherstellen, dass die Daten auch wirklich dem Format entsprechen, das du erwartest (also auch z.B. die Länge einer Zeichenkette beim Schreiben in die Datenbank berücksichtigen) und die
Steuerzeichen für den jeweiligen Kontext „escapen“. Und das sind halt völlig andere, ob du die Daten ausspucken möchtest (htmlentities()), in eine MySQL-Datenbank packen möchtest (mysql_real_escape_string()), an die Shell übergeben möchtest (escapeshellarg()), in eine CSV-Datei schreiben möchtest etc.

Ich benutze für MySQL eine Klasse, der ich die Query und die Werte getrennt übergebe:
PHP-Code:

$sQuery 
'
    SELECT
        *

    FROM
        `users`

    WHERE
        `user` = "%user%"
'
;

$aData = array('user' => $sUser);

$Reqult $this->query($sQuery$aData); 
In der Methode werden die Werte dann automatisch escaped und eingesetzt. Damit brauche ich mir nicht weiter einen Kopf machen bzw. muss mir nicht bei jedem Wert überlegen, wo er herkommt und in welchem Wertebereich er liegt, also was für Werte da alles möglich wären.

Nur beim Einfügen von Werten musst du natürlich prüfen, was da reinpasst. In ein Feld INT passt natürlich kein Text oder keine Fließkommazahl etc.

Ein beliebter Fehler in diesem Zusammenhang ist z.B. auch, die E-Mail-Adresse bzw. den Namen nicht zu entschärfen, den ein Benutzer in ein Kontaktformular eingibt und diese Daten dann ungefiltert an mail() zu übergeben. Damit kann man dein Formular dann wunderbar nutzen, um SPAM zu verschicken. Dazu findest du Material unter dem Stichwort „e-mail header injection“.

Hoffe, das gibt dir ein klareres Bild von der Thematik.

Basti

Geändert von Basti (31.03.2008 um 13:08 Uhr).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 17:57 Nach oben    #12
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

Zitat:
Zitat von Basti Beitrag anzeigen

Hoffe, das gibt dir ein klareres Bild von der Thematik.

Basti
auf jeden fall! besten dank!
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 18:21 Nach oben    #13
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

mal noch ne blöde frage:

im php.net tutorial befindet sich die db-verbindung in einer if-klammer:

PHP-Code:
<?php

if (isset($_POST['product_name'])
    && isset(
$_POST['product_description'])
    && isset(
$_POST['user_id'])) {

 
// Verbinden mit der Datenbank
    
$link mysql_connect('mysql_host''mysql_user''mysql_password')

    if(!
is_resource($link)) {

        echo 
"Verbindung zum Server fehlgeschlagen\n";
     
// ... den Fehler loggen

    
} else {
ist es zwingend notwendig, dass die db-verbindung einer bedingung unterliegen muss? ich hab zb eine profile.php, die defaultmaessig alle profile listet. die db-connection wird ohne bedingung geoeffnet...
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 18:50 Nach oben    #14
Jonas
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 240
Standard

Nein, man kann die Datenbankverbindung öffnen, wann man lustig ist.

Das Beispiel prüft, ob auch alle POST-Variablen vorhanden sind und baut erst dann eine Verbindung auf, da sonst überhaupt keine Verbindung notwendig ist.

Ich kaufe mir ja auch erst das Baumaterial wenn ich eine Baugenehmigung habe.
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL


Artemis ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 18:52 Nach oben    #15
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

ok tnx... ein frage weniger, aber hier schon die naechste.

ich verwende get statt wie in dem beispiel post. grund zur sorge?
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 18:55 Nach oben    #16
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Zitat:
Zitat von richy Beitrag anzeigen
rund zur sorge?
Nein. In diesem Fall nicht.

http://www.php-faq.de/q/q-formular-methode.html
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 19:04 Nach oben    #17
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

Zitat:
Zitat von Corvin Beitrag anzeigen
Zitat:
Zitat von robo47 Beitrag anzeigen
und hoffentlich escapst du $uid ! sonst kann dir darüber jemand CODE in dein Query einschleusen!
Nicht, wenn überprüft wird, ob es sich um eine Zahl handelt.
also muss ich nur escapen wenn der an die query uebergebene string nicht vollstaendig numerisch ist?
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 19:23 Nach oben    #18
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Ja. Mit (falschen) Zahlen kann man kein Schaden anrichten.
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 19:28 Nach oben    #19
Benutzer
 
Registriert seit: 26.03.2008
Ort: paderborn
Beiträge: 43
Standard

tnx!
__________________
gruss,
richy
richy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 19:41 Nach oben    #20
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.213
Standard

Zitat:
Zitat von Corvin Beitrag anzeigen
Ja. Mit (falschen) Zahlen kann man kein Schaden anrichten.
Das kommt ganz drauf an!

Das würde ich so jedenfalls nicht direkt unterschreiben!
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

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 aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage zu Aufklapp-Menü mit CSS Hobbyuser HTML, XML und CSS 8 12.08.2006 18:41
[Smarty] Variable in variable aus Konfigurationsdatei umwandeln? thrawn PEAR, PECL und Frameworks 9 20.07.2006 11:52
Get und Post aufruf in Servlet js-mueller Allgemeine Java-Programmierung 2 28.04.2006 20:36
Probleme mit Variable in SQL Anweisung Doggi Datenbanken 10 15.12.2005 14:04
Variablennamen mit Variable. Creativ PHP-Programmierung 9 30.11.2005 08:40


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:00 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44