register_globals und mod_search

Fragen und Diskussionen zu laufenden ConPresso 4.x Projekten werden in diesem Forum diskutiert.
Antworten
itst
ConPresso-Newbie
Beiträge: 3
Registriert: 10.04.2007 15:34

register_globals und mod_search

Beitrag von itst »

Hallo zusammen :D

Für einen Kunden mit Conpresso 4.0.7 sollten wir einen "Bug" in der Suche fixen: gibt man mehrere Suchbegriffe ein, wird in der Ergebnisseite nur der letzte Begriff wieder angezeigt - gesucht wird aber nach allen.

Nach etwas Testing und einem phpinfo() zur Klärung des Verdachts bestätigte sich, dass register_globals aktiv war und das eben das zu dem beschriebenen Fehler führte.

Das Suchfeld selbst wird per $_REQUEST['q'] angesprochen; dank register_globals steht der Inhalt aber auch als $q bereit.

Innerhalb des Such-Moduls gibt es zwei foreach-Schleifen, die über $q_array gehen und die einzelenen Elemente von $q_array als $q ansprechen.

Somit steht am Ende der letzten foreach-Schleife das letzte Wort aus dem Suchfeld in $q und damit, dank register_globals, auch in $_REQUEST['q'].

Ich habe das für unseren Kunden gefixt, in dem ich in den foreach-Schleifen $_q statt $q benutze. register_globals auszuschalten ist leider nicht möglich - der Hoster verbietet das... Ohne Worte ;)
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Das klingt sehr interessant und im Grunde kann ich der Argumentation auch folgen.
Aber ich kann es weder auf einem System mit noch ohne register_globals nachvollziehen...?
Bei Dir überschreibt ein
$q = 'test';
den Array-Eintrag $_REQUEST['q'] tatsächlich mit 'test' ?

Kann das noch irgendjemand beobachten?

( das einfachste wäre natürlich gewesen im parser die Zeile
$page_string = str_replace("### SEARCH_PHRASE ###", $_REQUEST['q'], $page_string);
dadurch anzupassen, daß statt
$_REQUEST['q']
dort
implode(" ", $q_array)
benutzt wird. Dann muß man nicht Dutzende von Abfragen anpassen... )

Aber auf jeden Fall Danke für das Feedback und den Lösungsvorschlag!
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
itst
ConPresso-Newbie
Beiträge: 3
Registriert: 10.04.2007 15:34

Beitrag von itst »

Hi Markus,

ich habe das ganze mittels var_dumps() auf $_REQUEST['q'] bis auf die foreachs eingegrenzt. Vor den foreachs (actions.inc.php und parser.inc.php) stimmt der Wert, nach den foreachs steht nur noch das letzte Wort drin.

So kam ich ja erst auf die Idee, dass es an register_globals liegen könnte. phpinfo() bestätigte dann, das es aktiviert ist, und mit der Umbenennung der $q in $_q war der "Fehler" behoben.

In unseren lokalen Testsystem taucht der Fehler erst gar nicht auf - dort ist register_globals deaktiviert.

Zu Deiner Lösung: Na komm, so ein bisschen Suchen&Ersetzen ist doch kein Aufwand. Auf jeden Fall aus Sicht von PHP ;)

Dabei fällt mir ein, dass ich in der actions.inc.php in der großen foreach-Schleife 14 addslashes($q) gesehen habe. Wie wärs, das einmal zu Beginn zu machen und sich so 13 addslashes() zu sparen?

Soooo....

Bin eben nochmal durch den gesamten Code. Allein das register_globals ist nicht schuld - es braucht die "Hilfe" von import_request_variables(). Siehe common.inc.php.

Mein Test-Skript sieht so aus (register_globals sind on):

Code: Alles auswählen

<html>
<head>
<title>bnla</title>
</head>
<body>
<?php

echo "<h1>\$q === \$_REQUEST['q']</h1>";
echo "\$q = " . $q . ".<br />";
echo "\$_REQUEST['q'] = " . $_REQUEST['q'] . ".<br />";
echo ($q === $_REQUEST['q']) . "<br />";

// @import_request_variables('cgp');

echo "<h1>exploding and foreach over the whole array:</h1>";
$q_array = explode(' ', trim($_REQUEST['q']));
foreach($q_array as $q)
{
	$suchmuster[] = '@('.quotemeta($q).')@si';
	$query = "\$test = " . addslashes($q) . "<br />";
	$zusatzurl  = 'q='.urlencode($_REQUEST['q']).$zusatzurl;
	$dummy = strpos(strtolower($v['result']), strtolower($q));
	preg_match('/(.*?)('.preg_quote($q).')(.*)/smi', $v['result'], $matches);
}

echo "<h1>\$q === \$_REQUEST['q']</h1>";
echo "\$_REQUEST['q'] = " . $_REQUEST['q'] . ".<br />";
echo "\$q = " . $q . ".<br />";
echo ($q === $_REQUEST['q']) . "<br />";
?>
</body>
</html>
Ruft man es auf, z. B. mit http://localhost/_test.php?q=adler%20fliegen gibt es zurück:

Code: Alles auswählen

$q = auto cad.
$_REQUEST['q'] = auto cad.
$q === $_REQUEST['q']

exploding and foreach over the whole array...

$_REQUEST['q'] = auto cad.
$q = cad.
$q != $_REQUEST['q']
Alles in Ordnung also. Entfernt man jetzt den Kommentar vor import_request_variables() gibt es folgendes zurück:

Code: Alles auswählen

$q = auto cad.
$_REQUEST['q'] = auto cad.
$q === $_REQUEST['q']

exploding and foreach over the whole array...

$_REQUEST['q'] = cad.
$q = cad.
$q === $_REQUEST['q']
Siehe auch http://www.php.net/import_request_variables und vor allem http://www.wisec.it/vulns.php?id=10

Hoffe, das hilft etwas mehr als mein erster Beitrag. Sorry, musste schnell gehen.
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 01:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Beitrag von balu »

Danke auch von mir.

Ich koennte mir vorstellen, dass das Verhalten auch abhaengig von der PHP-Version ist. Die Versionen scheinen import_request_variables() unterschiedlich zu handhaben. Wenn ich mich richtig erinnere, habe ich je nach Version sowohl "Kopien" als auch "Referenzen" der Variablen wiedergefunden.

Bei einer Kopie (wenn $q nur denselben Wert wie $_REQUEST['q'] hat) tritt dann das Problem nicht auf. Ist es aber eine Referenz (also $q entspricht $_REQUEST['q']) hakt es dann natuerlich wie beschrieben.

Balu
itst
ConPresso-Newbie
Beiträge: 3
Registriert: 10.04.2007 15:34

Beitrag von itst »

Change-Request für die nächste Version: Läuft mit register_globals off und ohne import_request_variables() ;)
Antworten