PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prüfung von $_SERVER['QUERY_STRING']



jochenjjj
12-11-2003, 14:06
hallo zusammen

Ich übergebe per Link die Parameter Tabelle=1(oder 2,3,4 usw).Diese lasse ich dann auf
der nächsten Seite auswerten.(d.h. ist Tabelle=1 wird Produkt1 angezeigt,ist Tabelle=2
wird Produkt2 angezeigt usw.)
Wenn jetzt aber der User nach der Linkbetätigung manuell in der Url die Zahlen der
Tabelle=1(oder 2,3,4 usw) beliebig verändert kann er diese ausspioniern.
Ich habe als Lösung folgendes gedacht:
Mit der Umgebungsvariable $_SERVER['QUERY_STRING']
(enthält den Query-String, also das, was beim Aufruf hinter dem Fragezeichen (?) steht
Beispiel: name=Michael&nachname=Mueller)

möchte ich eine Prüfung durchführen.Diese ist ja nachdem Linkaufruf festgelegt und wenn jemand diese
Url manuell verändert ,verändert er auch die $_SERVER['QUERY_STRING'] und dann soll die Meldung kommen
das zb.die Datenbank nicht erreichbar ist.
Kann mir jemand bei dieser Abfrage helfen?

mfg jochen

ohcibi
12-11-2003, 14:44
also so wie ich das verstanden hab is das ja sehr umstaendlich... du muesstest ja beim ersten aufruf in dem $Tabelle gesetzt is muesste der query string ja erstma zwischengespeichert werden um beim nten aufruf verglichen zu werden....


poste mal den code den du bisher hast und erklaer mal naeher was du willst, so richtig versteh ich das naemlich nich, wenn ich das wort produkte hoere die ueber einen wert inner get-variable geholt werden versteh ich nich warum man das nich aendern koennen sollte, schließlich kann man ja sicher ueber andere links auch auf andere produkte zurueckgreifen...


was isn das?

http://www.mrunix.de/forums/showthread.php?s=&threadid=33574

jochenjjj
12-11-2003, 14:53
Code:
seite1.php(Das ist der link womit ich en Parameter von FK_Tabelle übergebe)
<? echo '<a href="save_ba.php?FK_Tabelle=', urlencode($row_holz['FK_Tabelle']), '">Produkt1</a>';?>

save.php(hier wählt er nach dem Parameter der übergeben wurde die Tabelle aus)
<?php

if($_GET["FK_Tabelle"] !="")

{

$query="SELECT * FROM tabelle WHERE ID_ta=".$_GET["FK_Tabelle"];
$result=mysql_query($query) or die("query:'$query' ".mysql_error());


$row_tabelle=mysql_fetch_array($result);

}

?>
Das wird nur ungeprüft zur mysql datenbank geschickt.ich suche eigentlich nur nach einer Prüfmethode

mfg

ohcibi
12-11-2003, 14:58
ich verstehe dein problem nich wenn du den code da hast und ich schreib irgendwas in die url wo mysql_query() keine entsprechung in der spalte 'ID_ta' der tabelle 'tabelle' findet dann is die menge der gefundenen ergebnisse ganz einfach 0 und dann kann da nix mehr 'spioniert' werden......

jochenjjj
12-11-2003, 15:01
Das habe ich bisher immer als Antwort bekommen wenn ich es so machen würde
wie ich es bisher habe und wo du sagst das das so in ordnung wäre


---------------------------------------------------------------------------------------------------

Stichwort SQL Injection - niemals (nieeeemals!) Variablen, die dein Skript von aussen übermittelt bekommt ungeprüft in SQL Queries einbauen.

Ich wiederhole um die Wichtigkeit der Aussage zu unterstreichen: NIEMALS!

Immer überprüfen und validieren was von draussen kommmt - entweder du stellst eine IF oder eine CASE Abfrage vornedran, oder du führst intern ein Array mit gültigen Werten und gleichst den Übermittelten
-------------------------------------------------------------------------------------

ohcibi
12-11-2003, 20:36
hm naja also mir waer es neu dass man mit der konstruktion WHERE spalte='wert' irgendwelche sicherheitsluecken offenstehen hat wenn der wert nich ueberprueft wird und vom benutzer selbst festgelegt werden kann (zum beispiel wie in dem fall ueber die $_GET) - wenn das so is (SQL injection hoert sich ja so an) dann waers ganz gut wenn ma jemand nen link oder ne erklaerung posten koennte was da genau passieren kann und wie....

[EDIT]

jetz war ich unachtsam, ich hatte schon laengst ne suchseite von google offen... hier:
http://su2.info/uni/sosi/xss_paper/node11.html

okay also da hab ich natuerlich auch ne idee zu... du bastelst einfach ne kleine func die die genutzte variable auf sonderzeichen ueberprueft und wenn die false zurueckgibt dann nutzte einfach die()... natuerlich kannste dir dafuer dann auch noch ne func basteln die ne schoene fehlermeldung ausgibt.... oder noch besser, du schreibst das die() gleich in die func rein da musste keine if-konstruktion bauen.... also hier die func:



<?php
function checkquery($string) {
if (preg_match("/(\"|\'|\.|\\|\(|\))+/",$string)) die("nich mit mir du .....");
}
?>

und dann rufst du die funktion einfach
<?php checkquery($dievariablediedudahattest); ?> auf bevor du die mysql_query machst - die func beendet dann das script an der stelle falls sich eines der folgenden zeichen in dem string befinden: " ' . \ ( ) ich weiß jetz nich ob das alle zeichen sind die man maskieren sollte aber so zumindest sieht ne ziemlich einfache loesung auf.... alternativ kannst du wie gesagt anstatt die() auch ne eigene func schreiben, sollte ja nich so schwer sein

ich seh jetz gerad noch dass er dort irgendwie die backslashes entfernt hat, also da muss bei preg_match("/( .... )+/",$string) noch vor jedes der genannten sonderzeichen nen backslash........

Gaert
12-11-2003, 22:19
Hallo liebe Leute!

@ohcibi

Zum Stichwort "SQL Injection", welches ich in dem anderen Post in den Raum geworfen habe, würde ich euch Bitten zu googeln!

Bereits die ersten paar Treffer werden euch Klarheit verschaffen...

In diesem Thread führe ich ebenfalls ein Beispiel an, wie man durch eine erfolgreiche SQL Injection die komplette aktuelle Datenbank löschen kann...
http://www.mrunix.de/forums/showthread.php?s=&threadid=30849&highlight=SQL

@jochenjjj
Ich habe deine Doppelpostings nun eine ganze Zeit toleriert!
Als Moderator des PHP Forums spreche ich dir jetzt mal eine ganz persönliche Rüge aus:
Solltest weiterhin jedesmal ein neues Thema aufmachen, wenn innerhalb von ein paar Stunden niemand auf deinen alten Thread antwortet werde ich das neue Thema mitsamt den Antworten löschen!

Bitte hab ein wenig Geduld mit der Community, und erläutere die Frage im alten Thread genauer, wenn niemand darauf antwortet, anstatt einfach frech ein neues Thema aufzumachen... es gibt hier einige Leute, die sich wegen dir unnötig arbeit machen, weil du zwei Threads mit dem selben Thema geöffnet hast.

Danke für dein Verständnis.


Gruß,

Gaert