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, <script>alert(document.cookie)</script>
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