Archiv verlassen und diese Seite im Standarddesign anzeigen : manuelle Eingaben unterbinden
Hallo zusammen ...
ich würde gern folgendes script
$result = mysql_query("SELECT * FROM table WHERE id=$id");
$row = mysql_fetch_array($result);
echo "".$row['data']."";
erweitern, so daß wenn jemand manuel im Adressleistenbereich was zufälliges id ID-Sektion eingibt, zB ?id=ABG123 oder ?id=-,123 ,, usw ,, sodann eine leere Seite zu sehen bekommt. Damit möchte ich unschöne Fehlermeldungen vermeiden und vorallem manuele Eingaben soweit wie möglich unterbinden.
:)
MelloPie 28-08-2008, 10:38 also erstmal deutet Deine Beschreibung auf ein ganz anderes Problem hin, denn Deine Abfrage ist scheinbar schön offen für sql injection und dann noch register_globals = on???
jahlives 28-08-2008, 10:48 erweitern, so daß wenn jemand manuel im Adressleistenbereich was zufälliges id ID-Sektion eingibt, zB ?id=ABG123 oder ?id=-,123 ,, usw ,, sodann eine leere Seite zu sehen bekommt.
Also wenn die id existiert, dann kannst du nicht erkennen, dass sie manuell gesetzt wurde. Eine nicht-existierende id kriegst du raus indem du die Tabelle nach dieser id abfragst (MelloPies Sitchwort aber beachten!!) und wenn kein Treffer dann gibst du eine leere Seite aus.
//zum Prüfen ob eine GET Var ein Integer ist
if ((string)$_GET['id'] == (string)intval($_GET['id'])) {
echo 'Dies ist ein Integer';
} else {
echo 'halt keiner';
}
Gruss
tobi
@Mellopie werde nur noch mit $_GET & $_REQUEST arbeiten - schon allein weil ab php6 register_globals = on nicht mehr möglich sein soll.
@jahlives thx, war das was ich suchte ...
p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ...
jahlives 28-08-2008, 13:16 p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ...
Irgendwo in der URL muss der Wert stehen, sonst weisst du ja nicht welche Seite geladen werden soll. Die Werte einfach gut prüfen und auch auf SQL-Injections achten, dann kann eigentlich nicht viel passieren
p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ... Gedankenübertragung von Mensch zu Server... ;) Wobei, der Mensch soll die ID ja auch nicht kennen. Bring deinem Server das Raten bei... :D
Statt leere Seite würde man korrekter Weise übrigens einen 404er senden.
Original geschrieben von jahlives
//zum Prüfen ob eine GET Var ein Integer ist
if ((string)$_GET['id'] == (string)intval($_GET['id'])) {
echo 'Dies ist ein Integer';
} else {
echo 'halt keiner';
}
Gruss
tobi
kann mir jemand sagen wie man diesen codeschnippsel erweitert, so daß gleichzeitig geprüft wird, ob die 'id' in der db vorhanden ist?
mfg, Jan
Ähm SELECT Query an die Datenbank schicken und mit mysql_num_rows kontrollieren, ob ein Datensatz zurück kommt.
Original geschrieben von TobiaZ
Ähm SELECT Query an die Datenbank schicken und mit mysql_num_rows kontrollieren, ob ein Datensatz zurück kommt.
ja, weiß ich ... if (mysql_num_rows($field)==1) { }else{header( 'Location: ../home.php' ) ;}
aber jetzt habe ich 2 if Abfragen untereinander die beide nach 'else' identisch sind. Vielleicht könnte man diese irgendwie in eine verschachteln ?
;)
if(Bedingung A && Bedingung B)
GRUNDLAGEN!!! ;)
Payne_of_Death 16-09-2008, 18:04 Zunächst einmal sollte dir klar sein, egal ob $_GET['id'] ein String oder int wert ist der nicht in der DB ist wirst du immer 0 rows bei mysql_num_rows() erhalten...
Gesetzten Fall du unterbindest deine SQL Injection Anfälligkeit
Abgesehen davon, wenn du dir das PHP Manual anschaust wirst du unweigerlich auf
function.is-int
stossen die exakt das macht was du willst....
bzgl. Verschachtelung, denk doch mal logisch nach....
Stell dir mal die Fragen:
- Muss ich wenn $_GET['id'] kein int ist überhaupt die DB belästigen?
Nö, vollkommen unnötig
- Wenn ich ein integer wert habe was dann? ich frage die DB ob es die ID überhaupt gibt
- Wenn kein int oder id nicht existiert -> error
Das ergibt folgendes...
if( is_int() )
{
mysql_real_escape();
if(mysql_num_rows() != 1)
}
else
die("kein string");
Die Lücken darfst du selbst ausfüllen, zumindest sollte jetzt ein Gefühl dafür da sein
//edit
Original geschrieben von TobiaZ
if(Bedingung A && Bedingung B)
GRUNDLAGEN!!! ;)
Wie willst Bedingung B denn machen? Zu dem Zeitpunkt muss du bereits wissen was dir mysql_num_rows(); zurück geliefert. Wodurch auch die DB mit einem möglichen String unnötig abgefragt wurde....
die einzige Möglichkeit ist wohl spontan nur:
if(is_int() && checkID_AT_DB() )
echo "klatsch in die hände und lass uns fröhlich sein xD";
//edit 2:
vote 4 move to php gedöns
Jo, hatte nur die Frage gelesen - und das auch nur unvollständig...
Original geschrieben von Vestron
p.s ist es eig möglich den Teil ?id=XY im URL garnicht anzuzeigen? wäre Mir ehrlich gesagt wohler ...
Ja, in dem du Formulare mit "POST" und hidden Input verwendest. Manipulieren kann man es aber trotzdem.
jahlives 17-09-2008, 12:28 @Foltermeister ;)
is_int() bringt ned viel. Da is_int() keinen Type Cast macht und nur true zurückgibt, wenn es wirklich ein Integer ist. POST/GET-Werte sind aber immer Strings!
Hinweis: Um zu testen, ob eine Variable eine Zahl oder eine numerische Zeichenkette ist (wie zum Beispiel Formularangaben, die immer Zeichenketten sind), müssen Sie is_numeric() verwenden.
Gruss
tobi
|
|