Estoy tratando de validar la referencia en una página con una lista de fuentes permitidas. Extraje la parte de la URL de referencia después de la última "/" y ahora quiero compararla con una lista de fuentes válidas. Los fragmentos válidos tendrán el formato [nombre de archivo] [? Id = nnn] sin otros caracteres permitidos, por ejemplo, "view.php? Id = 1" está bien y "view.php? Id = 1 & nasty = 1" no es válido.

El método que estoy probando es:

$fragOK = preg_match('/'.implode('|', $okSrc).'\?id=[0-9]+$/', $frag);

Donde $ okSrc es la matriz de nombres de archivo de origen válidos y $ frag es la cadena extraída. Obviamente, algo está mal con esto porque $ fragOK === 1 con los dos ejemplos que di arriba. ¿Alguien puede explicar dónde me estoy equivocando, por favor?

Actualizando con var_dumps:

----------------------------------------------------
$okSrc
----------------------------------------------------
array(4) {
  [0]=>
  string(8) "view.php"
  [1]=>
  string(10) "detail.php"
  [2]=>
  string(11) "request.php"
  [3]=>
  string(12) "overview.php"
}

----------------------------------------------------
$frag
----------------------------------------------------
string(21) "view.php?id=1&nasty=1"
0
Dave The Butcher 27 ene. 2015 a las 13:13

2 respuestas

La mejor respuesta

Coloque los scripts dentro de un grupo:

$fragOK = preg_match('/(?:'.implode('|', $okSrc).')\?id=[0-9]+$/', $frag);
//              here __^^^                  and __^

Es posible que desee utilizar también preg_quote en $ okStr para escapar de los puntos.

0
Toto 27 ene. 2015 a las 10:37

El problema es que no tiene las cadenas entre paréntesis.

Ver esta demostración

Actualizar: '.' en view.php, por ejemplo, no afectará la coincidencia

0
karmendra 27 ene. 2015 a las 10:40