2010-01-20 5 views
7

Utilizo un simple script PHP para ejecutar un comic en línea que básicamente usa un GET para tomar un valor entero n e inserto una etiqueta img para n .jpg. No realiza ningún control de desinfección o error más allá de asegurarse de que n .jpg existe. La única interacción del usuario con el script es a través de este GET, y otro que hace lo mismo con una cadena para mostrar manualmente una plantilla diferente para probar.¿Debería preocuparme por la inyección de PHP si no uso MySQL?

Mi pregunta es, ¿debería incluso preocuparme por la inyección? Y si es así, ¿qué debo hacer para prevenirlo? Todo lo que he encontrado hasta ahora solo se refiere a la inyección de MySQL, que no se aplica en este caso.

+0

PHP puede usar otras bases de datos que MySQL, y la inyección de código se puede hacer con cualquier (?) Base de datos SQL, o cualquier código que evalúe la entrada externa. – PhiLho

Respuesta

5

Si usted no está utilizando una base de datos, entonces, obviamente, la inyección SQL no es una preocupación para ti. Del mismo modo, si no almacena ningún dato enviado por el usuario para mostrar a otros usuarios, Cross-site-scripting no es una preocupación. Eso deja cosas como eval() o ejecuta procesos externos, que un atacante podría subvertir, pero tampoco parece que hagas nada de eso.

Probablemente esté seguro. Aún así, sería bueno tener una cantidad mínima de verificación de errores, solo para entrar en el hábito. Por ejemplo, dices que tienes un parámetro GET entero. No existe tal cosa: todos los parámetros HTTP son cadenas de implicidad. PHP difumina la distinción, pero definitivamente debe convertirlo a int explícitamente para asegurarse de que no se trata de una cadena destinada a explotar una vulnerabilidad XSS, inyección SQL o eval (incluso si no existe ninguna).

+0

Dado que el parámetro es parte de un nombre de archivo, en realidad es solo una cadena que consta de números. Y debido a que la existencia de dicho archivo está marcada, el casting sería superfluo. Pero normalmente sería una buena idea. Como se señala en la respuesta a continuación, 'ctype_digit' debería ser suficiente para garantizar una entrada válida. –

+0

@nikc el punto es que no puede evitar que alguien envíe una solicitud que contenga valores de parámetros manipulados arbitrariamente, por lo que generalmente no debe hacer suposiciones sobre qué parámetros de formulario pueden tomar. –

+0

XSS sigue siendo una preocupación, incluso si no está almacenando datos y mostrándole otros. mira la sección "No persistente" en la página de wikipedia que has vinculado al –

3

Siempre debe preocuparse por la seguridad. No cada agujero de seguridad está compuesta por el mal uso de MySQL :-)

1

Si se supone conseguir que quede únicamente un uso entero

$n = intval($_GET['n'])

2

La inyección SQL no es aplicable en su caso porque usted no están usando una base de datos para su sitio. Pero también debe considerar otros problemas de seguridad para su sitio, como cross site scripting.

Si está utilizando una variable de GET, considere a continuación url:

index.php?myvar=<script>alert(document.cookie);</script> 

Los piratas informáticos son capaces de proporcionar por encima de URL en un número hexadecimal maneras, UTF, etc.

Un chico malo puede modifique sus variables GET para realizar ataques XSS. XSS es la raíz de muchos agujeros de seguridad. Debes considerar eso también.

Si usted está esperando un tipo numérico de su GET var entonces considerar a continuación código:

$myvar = (int) $_GET['your_var']; 

que puedes usar htmlentities función para evitar los ataques XSS.

+0

Tenga en cuenta que XSS es irrelevante cuando la entrada posiblemente maliciosa se utiliza simplemente para construir una página para mostrar al mismo usuario. XSS es solo un problema cuando la entrada de un usuario se muestra a los demás. –

+1

@Michael: "XSS es solo un problema cuando la entrada de un usuario se muestra a los demás". ¿No sería posible engañar a otro usuario para que haga clic en un enlace malicioso que contenga algo de HTML para inyectar? Luego, el javascript inyectado, etc. se ejecuta en su navegador como ellos. –

+1

Totalmente de acuerdo con Tom Haigh. Es fácil engañar a otros para que hagan clic en su enlace. Si tienen una cuenta en el sitio, y el enlace permite la inyección de XSS, ya sea que no sea persistente, entonces puede ejecutar tomar el contenido de la página y enviarlo a su servidor, o llamar a funciones expuestas por la página que ejecutará como si fueran ejecutados a petición del usuario. ¿Por qué permitir XSS si puede evitarlo? –

0

Siempre revisan la entrada del usuario y los datos $ _GET y $ _POST en busca de contenido malicioso. Addslashes, ereg_match y intval son de su amigo ...

Si puede salirse con la suya, establezca la directiva

allow_url_fopen = Off 

en php.ini

+1

¿No debería deshabilitarse esta directiva en su lugar ...? –

+0

Whoops :) ¡Reparado! – Powertieke

1

Si está esperando un número, no desinfecte la entrada incorrecta, denegarla.

if (!ctype_digit($user_input)) { 
    header('Location: error.php'); // or whatever page 
    exit; 
} 
+0

O simplemente forzalo: 'printf ("% u ", $ _GET ['n']);' – Svish

+0

Supongo que es un gusto personal. Nunca permití una mala solicitud corrigiéndola: si es mala, debe generar un error. –

0

También me peticiones lleguen a su directorio de imágenes deseado también, ya que no quiere que la gente navegar por el servidor de archivos con peticiones como example.com/?q=../../.htaccess

No estoy seguro de cómo eso afecta a la salida, pero no puede ser bueno

0

No tiene que preocuparse por la inyección SQL. Pero debe verificar su entrada como se usa en el html que genera. Imagine que le doy este enlace http://www.example.com/viewComic.php?id="/><script type="text/javascript>alert("XSS");</script><img src="22 a alguien. Esta persona tendrá una pequeña ventana emergente procedente de su sitio web. Y muchas cosas malas se pueden hacer con javascript. Para obtener más información, puede comenzar a leer la página de wikipedia sobre XSS.

Por lo tanto, debe verificar que el número que espera sea un número. Por ejemplo, con is_numeric.

Cuestiones relacionadas