Wenn aber jemand "www.example.com/verzeichnis/beitrag.php?ident=344&name=alert('XSS')" abfragt, feuert die Umleitung nicht und die Parameter werden direkt an dein Skript weitergegeben.
Ist ja nicht so, dass ich alles der htaccess überlassen würde. Würde PHP im ersten Schritt schon nicht ausliefern, sondern in $var_name= "alertXSS" verwandeln.
PHP:
if (isset($_GET["ident"]) and $_GET["ident"] > 0 and isset($_GET["name"]) and !empty($_GET["name"])) {
$var_ident = $_GET["ident"];
$var_ident = preg_replace("/[^0-9]/", "", $var_ident);
$var_name = $_GET["name"];
$var_name = preg_replace("/[^a-z-]/", "", $var_name);
}
else {header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.example.com/einstieg/web.php");
exit;
}
Im zweiten Schritt erst recht, da ja im SQL-Query gefragt wird, ob der Name der Seite und die Id vorhanden sind und übereinstimmen. Und da dieser Seitenname "alert('XSS')" und dieser "alertXSS" in der DB nicht vorhanden sind, würde PHP nichts ausliefern.
PS: warum holst du dir die globale Variable $wp_rewrite in den Scope der Funktion, wenn du sie gar nicht benutzt?
Begründete Frage, komme aber gerade selbst ins Schleudern und zu wenig kopiert. Um beim Testen mit
PHP:
$wp_rewrite->flush_rules();
ein internes Cachen zu verhindern und mit
PHP:
print_r($wp_rewrite->rules);
zu arbeiten. Nur die Beispiele und die Beschreibung habe ich immer noch nicht fertig, weil ich da den einen oder anderen Punkt noch nicht richtig verstanden hatte. Aber im Zusammenhang wird daraus dann eher ein Schuh erst werden:
Die WP Rewrite API: Eine kleine Einführung | Coder-Welten.com
PPS: das "schleife=no" ist komplett überflüssig, da mod_rewrite nicht rekursiv arbeitet.
Einfacheres Beispiel,
"www.example.com/themen-34.html"
soll im Hintergrund auslösen, nicht weiterleiten
"www.example.com/themen.php?thema=$1"
mit
Code:
RewriteRule ^themen-([0-9]+)\.html$ /themen.php?thema=$1 [L]
Aufrufen lässt sich aber nun
"www.example.com/themen-34.html"
und
"www.example.com/themen.php?thema=34"
Damit sich diese
"www.example.com/themen.php?thema=34"
nicht aufrufen lässt, erfolgt bei Eingabe dieser URL eine Weiterleitung auf
"www.example.com/themen-34.html"
doch diese Weiterleitung erfolgt nur wenn im QueryString kein anderer oder zusätzlicher Parameter enthalten ist:
Code:
RewriteCond %{QUERY_STRING} ^thema=([0-9]+)$
RewriteRule ^themen\.php$ /themen-%1.html? [L,R=301]
Was herauskommt wäre eine Endlosschleife, diese sorgt erst dafür,
Code:
RewriteRule ^themen-([0-9]+)\.html$ /themen.php?thema=$1&nur=so [QSA,L]
das sich die einmal ausgelöste
"www.example.com/themen.php?thema=34"
nicht noch einmal weiterleiten lässt, da mit nur=so die Regel mit ^thema=([0-9]+)$ nicht mehr passt.
Alles zusammen sieht dann so aus:
Code:
RewriteCond %{QUERY_STRING} ^thema=([0-9]+)$
RewriteRule ^themen\.php$ /themen-%1.html? [L,R=301]
RewriteRule ^themen-([0-9]+)\.html$ /themen.php?thema=$1&nur=so [QSA,L]
Eine erste Bedingung mit
Code:
RewriteCond %{QUERY_STRING} !^.*nur=so$
wäre nicht unbedingt mehr erforderlich, schadet jedoch auch nicht.
Gelernt hatte ich das von dieser Seite aus den Beispielen "Dynamische URL umleiten Variante 5 und 6", wobei die Variante 5 übersichtlicher ist als meine:
Tipps und Tricks mit mod_rewrite - praktische Beispiele - Suchmaschinenoptimierung sterreich suchmaschinentricks.at