PHP Datensatz einer Url in variale umwandeln?!

T

tender89

Gast
Hallo Leute .

Ich habe eine kurze frage an euch.

Also ich will eine ID an eine url weitergeben .
hier : "www.beispiel.de/main.php?ID=1".

Diese ID will ich nun abrufen . Also die nummer 1 und unten in meine $query funktion einbauen sodas alle daten des datensatzen ID=1 ausgelesen werden

PHP:
$query	=	"SELECT * FROM videos WHERE id=1";
    
$result	=	mysql_query( $query );
	
$datensatz	=	mysql_fetch_array( $result );

Ich weis das ich die ID so aus der URL so bekomme :
PHP:
<?php
echo $_GET["id"];
?>

Aber wie bekomme ich diese nummer jetzt dorthin wo die 1 steht ?! "SELECT * FROM videos WHERE id=1"

also da wo die ID im php code ist ?!

kann mir einer bitte weiter helfen??

mfg isi
 
Zuletzt bearbeitet:
Auf Daten die in der URL übergeben werden, kannst du über $_GET zugreifen.

Code:
<?php
echo $_GET["id"];
?>

Um das also quick and dirty in deine Query rein zubekommen mal dieses hier versuchen:

Code:
$query = "SELECT * FROM videos WHERE id=" . $_GET["id"]
 
Zuletzt bearbeitet:
Verwende bloß nicht die Variante von JP-M, denn dadurch gibts eine schöne SQL-Injection! Am besten fängst du somit gar nicht erst an, dann lernst du es gleich richtig.
Code:
$sql = 'SELECT * FROM xyz WHERE id = '.((int)$_GET['id']);
Trau niemals einem User und verwende ungefilterte Daten!
 
Yuuri schrieb:
Trau niemals einem User und verwende ungefilterte Daten!

Das ist richtig und wenn die variable nicht nur Zahlen enthält am besten

Code:
$sql = 'SELECT * FROM xyz WHERE datensatz = '.mysql_real_escape_string($_GET['whatever']);
 
wie wärs gleich mit nem Prepared Statement ? ;)
 
Prepared Statements zum Anfang sind wohl ein klein wenig übertrieben. Ein Cast bei Zahlen reicht vollkommen aus, bei Strings halt mysql_real_escape_string wie NoxPhasma schon schrieb.
 
also es handelt sich um die seite http://rofltube.de/ .
klar ist die seite noch noobisch aber wollte mal halt ausprobieren .
jeder fängt klein an :P!

wieso keinem user trauen? der macht doch nichts ?!
solage es funktioniert ??
Ergänzung ()

Mit dem user trauen meins du doch das dieser irgendeinen Datensatz in die id eintippt und somit alles sozusagen sehen und benutzen kann oder ? Aber solange ich keine persönlichen Sachen hinter den IDS absprichst ist das doch kein Thema oder ? Wie kann ich es denn so machen das nur ich die IDS zuweisen kann ? Also die IDS nicht über die URL weiter gebe ??
 
Caste bei Zahlen und sichere dich mittels oben genannter Funktion bei Strings ab (kannst du natürlich noch speziell validieren, wäre das Optimum).

Denk mal an Logins:
Code:
SELECT * FROM users where name = '.$name.' AND password = '.$password;
Funktioniert ja schön und gut, wenn es valide Daten sind. Aber wenn als "Passwort"
Code:
';DROP DATABASE xyz;
angegeben wird, bekommst du einen Query wie
Code:
SELECT * FROM users where name = 'lolz' AND password = '';DROP DATABASE xyz;
und schon ist deine gesamte Datenbank weg.
 
Aber mal ehrlich: Eigentlich werden auf einer Webseite ALLE Querys oft benutzt. Deshalb könnte man schon auf PreparedStatements zurückgreifen. Die beschleunigen ja auch die Zugriffe. Auf meinen Seiten hab ich eigentlich fast nur PreparedStatements. Ich glaub nicht, dass eine Datenbank mit 30-40 Stück überfordert ist. ;)

Man muss dazu aber auch sagen, dass es eigentlich nie so simple Anfragen sind :D Irgendwo versteckt sich immer ein JOIN ...
 
Ja theoretisch hätte ich ja auch gleich wordprEss benutzen können ^^ . aber bringt mir ja nichts ... Dadurch lern ich nichts draus . Gut ich probier's mal heute Mittag mit beiden Vorschlägen :) gut Nacht allerseits :)
Ergänzung ()

Ps um den Drop Database query zu benutzen müsste man doch aber erst wissen wie die Datenbank/Tabelle heisst oder?! Reicht doch wenn man ne gute Kombi aus zahlen und Buchstaben hat oder?
 
Zuletzt bearbeitet:
Es geht ja nicht nur um den DROP DATABASE Befehl, sondern um die Möglichkeit, dass der Benutzer auf deine Datenbank Zugriff erlangt, an sich.
Verwende einfach die von Yuuri oder NoXPhasma vorgeschlagenen Lösungen.
 
sobald jemand es schafft eine sql injektion einzuschmuggeln kann auch denn namen von tables etc. rausfinden.

Und ein einfach schützen mit JS, z.b. durch prüfen der eingaben oder erstellen des request nützten nix, den in nahezu jeder sprache kann man einen HTTP REUQEST ausführen und so an deiner seite vorbei mit dem script kommunizieren das mit der DB interagiert.

Gleiches gilt übrigens auch, wenn du user eingaben wieder ausgeben willst, das öffnet Tür und Tor für Cross Site Scripting!

eine einfache lösung ist einfach alles was per post und get kommt escapen zu lassen:

PHP:
function escape_get_daten() {
 // DB connection aufbauen, oder sichergehen das sie vorhanden ist
 $ret = array();
 foreach($_GET as $key => $value) {
     $ret[$key] = mysql_real_escape_string($value);
 }
return $ret;
}

für post daten eben mit $_POST, kann man auch in einer einzigen schleife verbinden.

Ich weiß jetzt auch gar nicht in wie weit man per $_GET und $_POST als key eine injektion übertragen könnte, habe jedenfalls schon oft gesehen das in scripten von (nicht böse gemeint) Anfängern die keys der arrays als felder namen genutzt wurden.
 
tender89 schrieb:
um den Drop Database query zu benutzen müsste man doch aber erst wissen wie die Datenbank/Tabelle heisst oder?! Reicht doch wenn man ne gute Kombi aus zahlen und Buchstaben hat oder?
Security by obscurity solltest du genauso gleich vergessen. Fang bei der Sicherheit an und nirgends sonst. Irgendwann fliegt dir alles um die Ohren, denn Script-Kiddys gibts heutzutage genug.
 
benneque schrieb:
Aber mal ehrlich: Eigentlich werden auf einer Webseite ALLE Querys oft benutzt. Deshalb könnte man schon auf PreparedStatements zurückgreifen. Die beschleunigen ja auch die Zugriffe.
In MySQL werden PreparedStatements nur pro Verbindung gecacht, wenn du also einen Statement mit einer MySQL-Verbindung nicht mehrmals ausführst ist es sogar langsamer, da erst das Query-Template durch den Server verarbeitet wird, und danach in einem extra Request die Daten, aber das hat zeitlich wirklich keine Relevanz.

Mercsen schrieb:
eine einfache lösung ist einfach alles was per post und get kommt escapen zu lassen:

PHP:
function escape_get_daten() {
 // DB connection aufbauen, oder sichergehen das sie vorhanden ist
 $ret = array();
 foreach($_GET as $key => $value) {
     $ret[$key] = mysql_real_escape_string($value);
 }
return $ret;
}
Bitte nicht immer diese dämlichen Holzhammer-Methoden empfehlen ....
Dann kommen Daten mal nicht aus $_GET und ein "dämlicher" Entwickler verlässt sich auf diesen "Schutz" und hat gleich die nächste Sicherheitslücke eingebaut.
 
so habs nun umgebaut.

ist es so in ordnung ??

PHP:
// Update der Tabelle
		$do = mysql_query('update xyx set hits = hits+1 where id = '.mysql_real_escape_string($_GET['IDT']));  	
	
// Datensätze holen
	$query = 'SELECT * FROM xyx WHERE id = '.mysql_real_escape_string($_GET['IDT']);
 
Zurück
Oben