Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
manuelle Eingaben unterbinden [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
manuelle Eingaben unterbinden


 
Vestron
28-08-2008, 10:34 
 
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

 
Vestron
28-08-2008, 12:54 
 
@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

 
TobiaZ
28-08-2008, 21:49 
 
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.

 
Vestron
16-09-2008, 11:58 
 
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

 
TobiaZ
16-09-2008, 14:56 
 
Ähm SELECT Query an die Datenbank schicken und mit mysql_num_rows kontrollieren, ob ein Datensatz zurück kommt.

 
Vestron
16-09-2008, 17:19 
 
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 ?
;)

 
TobiaZ
16-09-2008, 18:00 
 
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

 
TobiaZ
16-09-2008, 18:13 
 
Jo, hatte nur die Frage gelesen - und das auch nur unvollständig...

 
marc75
17-09-2008, 10:38 
 
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


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:11 Uhr.