Hola,
No es que tengas que filtrar esas palabras "peligrosas", solo tienes que hacer que todo lo que metas en la consulta sea "inofensivo".
Por ejemplo, si un campo de texto lo tienes que usar en una consulta, asegurate de meterlo como una cadena de texto valida para sql. Todas las bases de datos tienen reglas de validacion para sus tipos de datos en sus consultas. Por ejemplo, en MySQL el caracter "peligroso" es ':
SELECT * FROM usuarios WHERE usuario='$_POST[usuario]' AND clave='$_POST[clave]'
Parece seguro, ¿verdad? Pero si $_POST[clave]=' OR '1'='1 , tendriamos
SELECT * FROM usuarios WHERE usuario='usuario' AND clave='' OR '1'='1'
Si la validacion de usuario se basa en que esa consulta devuelva un numero de registros distinto de 0, pues ya la hemos liado.
El "truco" es "desactivar" las ' del contenido de $_POST[clave] con mysql_escape_string() (
www.php.net/mysql_escape_string).
Y la maxima siempre es nunca fiarse de lo que llega al script desde el lado del cliente. Ni las cabeceras HTTP, ni los datos de un formulario validado con javascript, ni el ID de sesion, ni el contenido de un fichero, ni unas cookies, nada absolutamente nada del lado del cliente esta a salvo de una simple manipulacion.
Y otro consejo: al enemigo ni agua. Traduccion: en entorno de produccion, nada de mensajes de error que muestren las "tripas" de la aplicacion. Asi que error_reporting a cero, el mysql_error() nada en el navegador. Nada que sirva de pista al enemigo.
Saludos.