Datenbankbefehl nach Linkklick

Layer-ADS.net

502 Bad Gateway
20 Juni 2009
2.065
28
Hi,

ich suche eine "Verlinkung", bzw. wenn man auf das Wort oder den Button "Löschen" klickt, soll folgender MySQL-Befehl ausgeführt werden:

db_query("DELETE FROM vms_webseiten WHERE sid='".$_POST['sid']."'");
db_query("DELETE FROM vms_besucher WHERE sid='".$_POST['sid']."'");

Wie ist das möglich?

Gruß
Julian
 
Öh...

Sorry, kann mir einer´n Beispiel schicken?
Bin da echt ohne Plan. ^^

Also man muss eine extra Datei anfertigen und diese dann nach Buttonklick "action=..." ausführen?

Gruß
Julian
 
Wie du deine Dateien verwaltest, is dein Bier. Du kannst jede Codezeile in ne extra Datei packen oder ne Webseite von der Größenordnung microsoft.com in eine riesige Tebibyte große (wenns das Dateisystem aushält) Einzeldatei stecken.
 
Ja, aber ich meine, wie definiere ich die andere Datei, die er ausführen muss?

Reicht dies?
<? php

db_query("DELETE FROM vms_webseiten WHERE sid='".$_POST['sid']."'");
db_query("DELETE FROM vms_besucher WHERE sid='".$_POST['sid']."'");

?>
 
Wenn du provozieren willst, dass sich der Parser über eine unbekannte Funktion db_query() beschwert, dann ja.

Die Sicherheitslücke is btw immer noch drinnen ;)
 
Verstehe nicht was du meinst.

Jedenfalls wären paar Funktionen oder wie er weiter vorgehen sollte hilfreicher, als von HTTP-Post-Request, Sicherheitslücke oder Validierung zu reden.
 
Verstehe nicht was du meinst.
Guck dir die Abfrage doch an. Der erwartete Wert in $_POST['sid'] ist ein String. is_numeric() liefert dir da immer false zurück ;)
Jedenfalls wären paar Funktionen oder wie er weiter vorgehen sollte hilfreicher, als von HTTP-Post-Request, Sicherheitslücke oder Validierung zu reden.
SQL-Injection is der Begriff. Man sollte das Konzept verstanden haben. Einfach nur irgendwelche Funktionen hinwerfen bringt da gar nix. Siehe dein Beispiel: Würde man nur stupide deinem Rat mit is_numeric() verfolgen, wundert man sich am Ende, warum nix mehr geht.

Klar, wenn du wirklich ne Zahl erwartest, is dein Rat absolut richtig. Hier würde es aber mehr Verwirrung stiften.
 
PHP:
<?php
if($_POST["delete"])
{
    $sid = mysql_real_escape_string($_POST["sid"]);
    // Der Wert sollte hier noch validiert werden!

    mysql_query("DELETE FROM vms_besucher WHERE sid='".$sid."'"); 
}
?>

<form method="post">
  <input type="hidden" name="sid" value="abc" />
  <input type="submit" name="delete" value="Diesen Wert löschen!" />
</form>

Klickst du auf deinen Submit-Button, werden (unter anderem) die Daten aus dem Hiddenfield per POST Request an die selbe Datei verschickt. Im Oberen Teil wird abgefragt ob Daten vorliegen, ist dies der Fall, wird die sid aus dem Hiddenfield (in diesem Fall "abc") genommen, und für deine Zwecke benutzt.

Vorher solltest du aber auf jeden Fall noch mal schauen, ob auch ein erwarteter Wert reinkommt. ;)
 
Es is sicher keine Zahl, sondern würde kein String-Vergleich in der Datenbank gemacht werden ;) Setzt du also is_numeric() ein, geht am Ende gar nix mehr :ugly:

Würde man nur stupide deinem Rat mit is_numeric() verfolgen, wundert man sich am Ende, warum nix mehr geht.


Du weißt genau, dass viele auch Zahlen bei Datenbanken wie Strings behandeln.. Von daher kann es gut sein, dass $_POST['sid'] eine Zahl enthalten soll..
Dazu kommt, dass der Threadersteller (wie man es hier bemerkt [find ich auch nicht schlimm, jeder fängt mal an]) noch nicht so weitreichende Ahnung von dem Ganzen hat, da ist die Chance also noch viel höher, dass man keinen Unterschied zwischen Zahlen und Strings macht.. Oder seh ich das falsch!?


Was DaxDony geschrieben hat, wäre auf jeden Fall etwas brauchbares..
Wenn ich es richtig in Erinnerung habe wird db_query() beim VMS 1 (/2?) benutzt, da dies hier auf Klamm verbreitet ist kommt das dann auch hin und man kann es anstatt mysql_query() benutzen.


Alternativvorschlag wenn du alles über einen Link machen willst:

PHP:
<?php
if(isset($_GET["sid"]))
{
    $sid = mysql_real_escape_string($_GET["sid"]);
    // Der Wert sollte hier noch validiert werden! D.h. falls es eine Zahl sein muss is_numeric() z.B. benutzen.. oder was eigenes benutzen um es auf Gueltigkeit zu ueberpruefen (Falls feste Laenge strlen() usw usf)

    mysql_query("DELETE FROM vms_besucher WHERE sid='".$sid."'"); 
}
?>

<a href="dieseDatei.php?sid=abc">Diesen Wert löschen!</a>
(Habe mich mal an DaxDony's-Code gehalten)
 
Zuletzt bearbeitet:
Du weißt genau, dass viele auch Zahlen bei Datenbanken wie Strings behandeln..
... und sich dann wundern, wenn plötzlich '11' < '2' is :LOL:
Von daher kann es gut sein, dass $_POST['sid'] eine Zahl enthalten soll..
Bei einer SID geh ich normal von einem 32-Hexziffern-großen Hash aus ;) - Das is der Standard, wenn man sich nicht selber ne SID generiert oder PHP umgestellt halt.
 
... und sich dann wundern, wenn plötzlich '11' < '2' is :LOL:

Wenn man dann auch die Spalte auf VARCHAR o.ä. eingestellt hat.. auf jeden Fall :biggrin:

Bei einer SID geh ich normal von einem 32-Hexziffern großen Hash aus ;) - Das is der Standard, wenn man sich nicht selber ne SID generiert oder PHP umgestellt halt.

Wenn er mit "sid" die Session-ID von der Standard-Sessionverwaltung (oder wie man das nennen soll^^) in PHP meint völlig korrekt. Könnte allerdings auch eine andere ID sein. (Wobei anhand des Tabellennamens wäre es schon logisch wenn es wirklich die Standard Session-ID ist, da muss ich dir recht geben.. soweit hatte ich nicht geguckt/gedacht)
 
Er hat vergessen die obere If-Schleife anzupassen. Unten stimmt es ja - alles halb so wild. ;)

So schaut es aus ;)
(wenn wir schon dabei sind mag ich bei so etwas auch lieber isset(). Ich weiß nicht ob es so ist, aber bei PHP nehme ich an, dass bei der aktuellen Methodik die Variable als boolsche Variable behandelt wird.. und weil es ein nicht leerer String ist, wird beim Casten nach Boolean 'true' herauskommen und die Bedingung wahr)
 
(wenn wir schon dabei sind mag ich bei so etwas auch lieber isset(). Ich weiß nicht ob es so ist, aber bei PHP nehme ich an, dass bei der aktuellen Methodik die Variable als boolsche Variable behandelt wird.. und weil es ein nicht leerer String ist, wird beim Casten nach Boolean 'true' herauskommen und die Bedingung wahr)

PHP:
<?php
$a[1] = NULL;
$a[2] = "";
$a[3] = "1";
$a[4] = 0;
$a[5] = " ";
$a[6] = true;
$a[7] = false;

foreach($a as $key=>$value)
{
	echo ($key).". Durchlauf: <br />";
	
	if($value)
		echo "o";
	if(isset($value))
		echo "i";
	if(!empty($value))
		echo "v";
	
	echo "<br />";
}

?>


Ergebnis wäre hier:
1. Durchlauf:

2. Durchlauf:
i
3. Durchlauf:
oiv
4. Durchlauf:
i
5. Durchlauf:
oiv
6. Durchlauf:
oiv
7. Durchlauf:
i
 
Guck dir die Abfrage doch an. Der erwartete Wert in $_POST['sid'] ist ein String. is_numeric() liefert dir da immer false zurück ;)


Ach jetzt hab ich es verstanden.
Naja, seit wann übergibt man eine Session-ID per POST? Kann man doch jederzeit faken.
Hab bei SID an eine normale ID, also nur Zahlen, gedacht.

Und wie ist es mit mysql_real_escape_string() und Magic Quotes?
Hab schon oft Loseseiten gesehen, die dann etliche Backslashes hatten, weil die alle möglichen Maskierungen nutzen.