2010-01-24 13 views
14

Estoy desarrollando una aplicación que usa Wordpress como CMS.Al usar Wordpress, ¿alguien puede decirme cuál es la mejor manera de desinfectar las entradas?

Tengo un formulario con muchos campos de entrada que deben desinfectarse antes de almacenarse en la base de datos.
Quiero evitar la inyección de SQL, tener javascript y código PHP inyectado y otro código dañino.

Actualmente estoy usando mis propios métodos para desinfectar los datos, pero creo que sería mejor usar las funciones que utiliza WP.

He consultado Data Validation en Wordpress, pero no estoy seguro de la cantidad de estas funciones que debo usar y en qué orden. ¿Alguien puede decir qué funciones de WP son las mejores para usar?

Actualmente estoy "higienización" mi entrada de la siguiente manera:

  1. Debido a que los caracteres con tilde (e, o, AE, o, a) quedarán almacenados de una manera divertida en la base de datos (aunque mis tablas están configuradas en ENGINE=InnoDB, DEFAULT CHARSET=utf8 y COLLATE=utf8_danish_ci), ahora estoy convirtiendo campos de entrada que pueden tener acentos, usando htmlentities().

  2. Al crear la cadena SQL para ingresar los datos, utilizo mysql_real_escape_string().

No creo que esto sea suficiente para evitar ataques. Así que las sugerencias para mejorar son muy apreciadas.

Respuesta

16

Entrada "sanitización" es falsa.

No intente protegerse de problemas de inyección filtrando (*) o escapando de la entrada, debe trabajar con cadenas sin procesar hasta el momento en que las ponga en otro contexto. En ese momento, necesita la función de escape correcta para ese contexto, que es mysql_real_escape_string para consultas MySQL y htmlspecialchars para salida HTML.

(WordPress añade sus propias funciones de escape como esc_html, que son, en principio, no es diferente.)

(*: bueno, excepto para los requisitos específicos de la aplicación, como el control de una dirección de correo electrónico es realmente un e- correo electrónico, lo que garantiza una contraseña es razonable, y así sucesivamente. también hay un argumento razonable para filtrar los caracteres de control en la etapa de entrada, aunque esto rara vez se hace realmente.)

ahora estoy conversión de los campos de entrada que puede tener acentos, usando htmlentities().

Recomiendo encarecidamente que no lo haga. Su base de datos debe contener texto sin formato; hace que sea mucho más difícil hacer operaciones de base de datos en las columnas si lo ha codificado como HTML. Está escapando caracteres como < y " al mismo tiempo que los caracteres que no son ASCII. Cuando obtienes datos de la base de datos y los utilizas por alguna otra razón que no sea copiarlos en la página, ahora tienes escapes esporádicos de HTML en los datos. No escape HTML hasta el último momento en que escriba texto en la página.

Si tiene problemas para obtener caracteres no ASCII en la base de datos, ese es un problema diferente que debe resolver primero en lugar de ir por soluciones alternativas insostenibles como almacenar datos codificados en HTML.Hay una cantidad de publicaciones aquí sobre cómo hacer que PHP y bases de datos hablen correctamente UTF-8, pero lo principal es asegurarse de que sus páginas de salida HTML se sirvan correctamente como UTF-8 usando el encabezado/meta Content-Type. Luego verifica que tu conexión MySQL esté configurada en UTF-8, por ejemplo, usando mysql_set_charset().

Al crear la cadena SQL para ingresar los datos, utilizo mysql_real_escape_string().

Sí, eso es correcto. Mientras lo haga, no es vulnerable a la inyección de SQL. Usted podría ser vulnerable a la inyección de HTML (causando XSS) si está escapando de HTML en el extremo de la base de datos en lugar del final de salida de la plantilla. Debido a que cualquier cadena que no ha pasado por en la base de datos (por ejemplo, que se haya obtenido directamente del $_GET) no habrá sido escapada en HTML.

+12

Para realizar consultas SQL en WP, debe usar el método $ wpdb-> prepare() en lugar de usar mysql_real_escape_string. Si quieres usar la API de WP de todos modos. – nickohrn

Cuestiones relacionadas