Información adicional de casting básico:
http://php.net/manual/es/language.types.type-juggling.php
http://foro.elhacker.net/nivel_web/como_evitar_la_inyeccion_sql-t252384.0.html
A veces necesitamos llamar a un archivo desde peticiones get o post y debemos evitar LFI, una forma es haciendo un file_exists() y preg match de esta forma:
Código
<?php include($file); ?>
El problema es que siempre queda la posibilidad de bypasear los strings o meterse donde uno no debe, talves un archivo restringido como llamar al index.php principal, por eso desde hace algún tiempo estoy utilizando algo muchisimo mas limpio y efectivo y evita el 100% de los ataques LFI y RFI:
Código
<?php include($file); ?>
De esta forma la función glob() nos dará un array con todas las rutas que contengan un archivo php dentro del directorio módulos, asi que si tratamos de hacer un LFI nos dará negativo siempre:
Código
<?php echo './module/'.$_GET['file'].'.php es igual a '.$files[0].' ???'; ?>
Citar
./module/../../../../config/config.php es igual a ./module/main.php ???
Siempre he visto en varios post dentro del foro sobre como saber si un string es una dirección e-mail o no, pues fácil:
Código
Debuelve true o false.
Alguna ves has necesitado ingresar una string dentro de un tag <script> sin que te salga un xss?
Digamos que tengo esto:
Código
<script> </script>
Dejemne decirles que los que utilizan addslashes o htmlspecialchars están expuestos a un xss o a que simplemente no funcione siempre bién ya que addslashes y htmlspecialchars no filtran cosas como saltos de linea, parentesis y comentarios, por lo tanto con un simple %0a%0d puedes comenzar a inyectar código arbitrario.
Que hacemos en este caso?
Lo que google hace es pasar todo a unicode y los carácteres especiales quedan algo así: \u0010, pero yo lo hago de una forma mucho mas efectiva, limpia y con menos bites:
Código
<script> var test = '<?php echo str_replace(array('+', '%'), array(' ', '\x'), urlencode($_GET['test'])); ?>'; </script>
De esta forma todos los carácteres especiales incluyendo saltos de linea quedarán así:
Código
<script> var test = '\x0a\x0cprueba de caracteres\x3c\x22'; alert(test); </script>
La ventaja es que javascript interpreta de forma nativa los valores hexadecimales los pases a comillas simples o a comillas dobles asi que podrás seguirlo usando tan normal como siempre:
Código
<div></div> <script> var test = '\x0a\x0cprueba de caracteres\x3c\x22'; $('div').text(test); </script>