Con checkdate() no validas del todo que sean números. Te pongo un ejemplo:
Código PHP:
$mes = "12' inyecto comillas y codigo";
$dia = 31;
$anyo = 2007;
if( checkdate($mes, $dia, $anyo) ){
echo "CORRECTO";
}else{
echo "INCORRECTO";
}
Como verás, en $mes he puesto una cadena que, al iniciar con un valor numérico, pasa la validación del checkdate() cuando, en teoría, no debería.
Ahora, tú pensarás que es imposible que $mes llegue a tener ese valor, debido a que controlas la entrada con un select. Pero no te confíes tanto. Si alguien quisiera atacarte aprovechando esa vulnerabilidad, enviaría directamente las variables que quiera a través del método POST sin utilizar tu formulario.
Conclusión:
Cuando manejemos datos de formulario (sobretodo si son sensibles):
1.- Controlar entradas vía formulario (como lo haces con el select).
2.- Validar entrada vía JavaScript.
3.- Validar en el servidor vía PHP.
Las dos primeras no garantizan seguridad. Simplemente te ayudan a minimizar los errores que pueda cometer el usuario. La tercera sí te da una capa de seguridad.
Saludos,