Seite 1 von 2

Externes Erstellen von Posts ungültig [RC7]

Verfasst: 16.10.2007 14:03
von KonKorT
Hallo,

beim Umstieg von RC5 auf RC7 ist mir aufgefallen, dass mein direktes Kommentieren unter News (Thread im Forum erstellt) nicht mehr funktioniert. Es kommt die Meldung, dass der Beitrag ungültig wäre.

Ich muss sagen, dass ich auf meiner Hauptseite folgenden Beispielcode habe:

Code: Alles auswählen

<form id="kommentarformular" method="post" action="/forum/posting.php?mode=reply&f=57&t=2019">
	  <input type="hidden" name="f" value="57" />
          <input type="hidden" name="t" value="2019" />
	  <input type="hidden" name="post" value="Submit" />

	  <input type="hidden" name="topic_cur_post_id" value="9808" />
	  <input type="hidden" name="lastclick" value="1192534656" />
	  <input type="hidden" name="subject" value="Re: Intel-Eaglelake-Chipsätze ab Q2 2008" />
	  <input type="hidden" name="attach_sig" value="on" />
	  <input type="hidden" name="icon" value="0" />
	  <input type="hidden" name="site" value="/news.php?news=1471" />
	  <textarea name="message" cols="67" rows="6"></textarea><br />
	  <input type="submit" value="Abschicken" />

          <input type="reset" name="reset" value="Zur&uuml;cksetzen" />
        </form>
In der posting.php habe ich dann bisher einfach folgendes zur Rückleitung eingesetzt:

Code: Alles auswählen

if(isset($_POST["site"]))
{
 header("Location: http://www.hardware-infos.com".$_POST["site"]."");
}
Dort taucht jetzt besagter Fehler auf beim Erstellen. Habe mich dann mal in die posting.php vertieft und bin auf folgende Codezeile gestoßen:

Code: Alles auswählen

// check form
 if (!check_form_key('posting', false, '', false, 2))
 {
  $error[] = $user->lang['FORM_INVALID'];
 }
Diese Codezeile verursacht, dass ich die "neue" Fehlermeldung bekomme. Entferne ich die fünf Zeilen, erstellt er wieder einen Beitrag.

Meine Frage: Wie kann ich meine Message valide machen, gibt es irgendwelche anderen Möglichkeiten als den Code schlichtweg herauszunehmen?

Vielen Dank!

Verfasst: 16.10.2007 14:06
von nickvergessen
Versuch:
find:

Code: Alles auswählen

</form>
ersetze mit:

Code: Alles auswählen

{S_FORM_TOKEN}</form>

Verfasst: 16.10.2007 14:18
von Dr.Death
Hier noch ein Auszug aus den neuesten Coding Guidelines:
Altering Operations:
For operations altering the state of the database, for instance posting, always verify the form token, unless you are already using confirm_box(). To do so, make use of the add_form_key() and check_form_key() functions.

Code: Alles auswählen

	add_form_key('my_form');

	if ($submit)
	{
		if (!check_form_key('my_form'))
		{
			trigger_error('FORM_INVALID');
		}
	}

The string passed to add_form_key() needs to match the string passed to check_form_key().

Another requirement for this to work correctly is that all forms include the {S_FORM_TOKEN} template variable.

Verfasst: 16.10.2007 18:53
von KonKorT
Das mit dem

Code: Alles auswählen

{S_FORM_TOKEN}

ist ja leider nicht möglich, da ich keine phpBB-Datei include, entsprechend auch nicht auf die Variablen zugreifen kann.

Kann ich denn nicht einfach auch ein

Code: Alles auswählen

add_form_key('news');


nehmen, denn meine Datei heißt ja news.php

Verfasst: 16.10.2007 18:56
von nickvergessen
Dann zeig doch mal die Exakte Fehlermeldung her!

Verfasst: 16.10.2007 18:59
von KonKorT
Das übermittelte Formular war ungültg. Versuche erneut, das Formular abzusenden.

Edit: Das mit dem add_form_key hat auch nicht funktioniert.

Verfasst: 16.10.2007 20:15
von Dr.Death
Damit es funktioniert musst Du alle benötigten Dateien für eine externe, eigene Seite einbinden. Ansonsten funktioniert es nicht. ( Dies ist ja gerade der neue "Schutz". Es verhindert Einträge in die Datenbank, wenn sie vorher nicht durch den Token bestätigt worden sind )

--> http://olympuswiki.naderman.de/Adding_pages

Verfasst: 17.10.2007 19:16
von KonKorT
Wo mein gravierenderes Problem nunmehr gelöst wäre, kann man sich ja wieder diesem zuwenden. ;)

@ Dr.Death

Ich bin mir bewusst, dass das Problem wahrscheinlich nicht aufträte, wenn ich die phpBB-Daten include, aber genau das will ich ja gerade vermeiden. Ich müsste dann nämlich nur für {S_FORM_TOKEN} die gesamte Funktionsbibliothek des Forums übernehmen - das steht absolut in keinem Verhältnis.

Es würde mir schon reichen, zu wissen, was in dieser Variable für ein Wert steht. Diesen könnte ich dann ja auch einfach manuell erzeugen. Trotzdem schon mal vielen Dank für die Bemühungen, die Ihr bisher auf Euch genommen habt!

Edit: Habe gerade mal in der functions.php gestöbert und dort die Funktion gefunden. Was mir zum Glück fehlt ist folgendes, weiteres Feld:

<input type="hidden" name="form_token" value="c86b3f04284c8a89df91f7516470843073fe9ddd" />

die Frage ist nur, wie ich diesen value selbst erzeugen kann ;)

Wäre nett, wenn es das irgendwo zum Nachlesen gäbe.

Verfasst: 17.10.2007 20:13
von KonKorT
Habe mir jetzt schon sowas in die Richtung gebastelt, funktioniert aber noch nicht: Würde mich über Hilfe freuen:

Code: Alles auswählen

$abfrage = mysql_query("SELECT user_form_salt FROM phpbb_users WHERE user_id = '$userid'");
$ds = mysql_fetch_array($abfrage);

$salt = $ds["user_form_salt"];
$datei = "posting";

$form_token = sha1(time().$salt.$datei.$userid);

Verfasst: 17.10.2007 21:32
von Mahony
Hallo KonKorT
Das hier sollte dir weiter helfen The submitted form was invalid. Try submitting again. - Fehlerbehebung für eigene Scripte




Grüße: Mahony