las urls se guardan tal cuál en la base de datos y a la hora de mostrarlas se meten en un enlace <a href="url">cualquier nombre</a>
he probado diferentes ataques y parece ser que funciona, aligual se me ha escapado algo y a alguien se le ocurre algún tipo de vulnerabilidad
Código:
//se le envía una cadena y devuelve true si es url válida o false en caso contrario
function url_valida($url){
static $urlregex = "^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$";
return eregi($urlregex, $url);
}
Código con colorines y paso a paso