¿Cuáles son las mejores prácticas de seguridad para plugins y temas de WordPress? [cerrado]

22

Como se sugiere en esta pregunta , estoy agregando este tema como una nueva pregunta, para la discusión / votación de la comunidad con respecto a las mejores prácticas para la seguridad de Complementos / Temas.

Aquí está la lista de verificación inicial, basada en mi configuración actual (trabajo en progreso) / lista de verificación de seguridad de datos utilizada para revisar Temas (los principios no deberían ser diferentes para Plugins de lo que son para Temas).

Si desea consultar un tema con una página de configuración de tema segura y sólidamente codificada, consulte este tema:
http://wordpress.org/extend/themes/coraline

Chip Bennett
fuente
¿Si a alguien con los privilegios apropiados no le importaría hacer de este un wiki comunitario?
Chip Bennett
Para conseguir una pregunta en el modo de wiki que necesita un mod etiquetar adecuadamente la cuestión , he señas para llamar la atención de la MOD, es un sólo una cuestión de tiempo .. :)
t31os
¿Qué tiene de especial la coralina? Imo todavía hay formas de entrar. Sugeriría vincular anons A insted: wordpress.stackexchange.com/questions/13539/…
kaiser
Puede que no haya nada particularmente especial sobre Coraline. Simplemente es el que actualmente señalamos a los desarrolladores de temas cuando revisamos temas, porque fue el ejemplo dado por Justin Tadlock, quien realizó muchas de las revisiones iniciales de temas específicos de seguridad. Ofrecería Oenology también como un buen ejemplo, pero no quiero darme cuenta de que estoy tratando de mejorar mi propio Tema. :)
Chip Bennett

Respuestas:

12

Desinfecte, valide y escape datos

¡Desinfecte todo lo que pueda entrar y salir de la base de datos (!) Tanto en el front-end como en el back-end!

Los complementos y temas deben realizar una validación de datos adecuada:

  1. Valide y desinfecte todos los datos no confiables antes de ingresar datos en la base de datos
  2. Escape todos los datos que no sean de confianza antes de enviarlos a los campos del formulario Configuración
  3. Escape de todos los datos que no sean de confianza antes de salir en los archivos de plantilla del tema

Los complementos y temas deben usarse esc_attr()para entradas de texto y / esc_html()o esc_textarea()para áreas de texto.

También disponible en la API de WordPress es esc_url(), esc_url_raw(), esc_js()y wp_filter_kses().

Mal ejemplo:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Buen ejemplo:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Aquí hay un gran video de Mark Jaquith explicando el uso de las funciones de escape:

Chris_O
fuente
3
Desinfecte al entrar, escape al salir .. :)
t31os
9

Solo use $ _GET / $ _POST / $ _REQUEST con cuidado y cuando no haya mejores API disponibles

Plugins y temas deben utilizar las API de configuración para obtener y guardar los datos del formulario de entrada en lugar de confiar en $_POSTy $_REQUESTdatos directamente.

Rarst
fuente
3
Siempre trate $ _POST, $ _REQUEST y $ _GET como inseguros. Desinfecte y ponga en la lista blanca los valores de esas matrices y colóquelos en sus propias variables. Nunca desinfecte los valores que provienen del usuario y vuelva a colocarlos en $ _POST.
goldenapples
2
Siempre verifique que la clave que necesita usar esté configurada en la matriz adecuada. isset () es tu amigo :)
mfields
9

Utilizar $wpdb->prepare

Al crear consultas personalizadas a través del $wpdbobjeto, use siempre $wpdb->preparepara llenar marcadores de posición con valores en lugar de escribir las consultas con datos mezclados con código SQL, ya que las mysql_*funciones de la familia han enseñado erróneamente a todos.

Matteo Riva
fuente
$wpdb->prepareno es lo mismo que las declaraciones preparadas.
Hakre
8

Tenga cuidado con las funciones de PHP que pueden usarse para ejecutar código malicioso

Una buena lectura para cualquiera que escriba PHP: Funciones PHP explotables en StackOverflow.

Usar API de modificación de tema

Los temas deben usar set_theme_mod()y funciones relacionadas, no un esquema de nombre inventado por uno mismo.
La API theme_mod es una capa especializada para la API de configuración; garantiza nombres únicos, inserta todas las opciones en una matriz y es, desde mi experiencia, mucho más fácil de manejar. Además, ofrece filtros estandarizados para complementos, lo que es bueno para la interoperabilidad.

Evitar habilitado register_globals

No confíe en register_globals = on. Un Pro Theme que compró mi último cliente hace exactamente esto. Podría hackear cualquier sitio usando este tema en 5 minutos ...
ThimbThumb también hizo esto (¿y todavía lo hace?).

No cree archivos con permisos de acceso amplio innecesarios

No cree archivos con permisos de acceso demasiado liberados.

Use SSL donde esté disponible

Apunte sus enlaces Compartir en Twitter / Facebook / Cualquier cosa al URI HTTPS si está disponible. La seguridad de su lector también es importante.

fuxia
fuente
2
¿Puede explicar set_theme_mod(), especialmente, cómo combinarlo correctamente con el uso de la API de configuración?
Chip Bennett
@Chip Bennett He agregado información a mi respuesta.
fuxia
¿Puedes desglosar esta mini-lista en respuestas más pequeñas y específicas? Wiki de la comunidad más fácil de administrar en trozos más pequeños. TIA
Rarst
3
Chip: el sistema de modulación Theme no se integra muy bien con la API de configuración. Escribiré una publicación explicando cómo hacerlo bien pronto.
Otto
7

Guardar datos en una sola matriz

Los complementos y temas deben guardar las opciones en una sola matriz, en lugar de crear múltiples opciones para la página de configuración. El uso de la API de configuración manejaría esto.

Chip Bennett
fuente
6

Verifique la capacidad adecuada al agregar y generar páginas de configuración

Los complementos deben usar una capacidad adecuada (por ejemplo manage_options) para agregar la página de configuración.

Los temas deben usarse edit_theme_optionscomo la capacidad adecuada para agregar la página de configuración.

Rarst
fuente
1
Nota pequeña pero importante: sin edit_theme_optionsembargo, no se puede usar con la API de configuración, el envío de opciones está codificado para requerir el manage_optionsenvío de actualizaciones. Puede encontrar el boleto de Trac relacionado aquí .
t31os
Es cierto, pero 1) eso solo afectará a los Editores, no a los Administradores; y 2) espero que se aborde pronto, a través del boleto de Trac vinculado.
Chip Bennett
Siempre existe la posibilidad de que se otorgue un edit_theme_optionslímite a un rol personalizado o un rol regular , pensé que podría ser útil señalar que la API de configuración en su estado actual solo es utilizable por roles con la manage_optionscapacidad.
t31os
5

Use tutoriales e información actualizados

Los complementos y temas deben implementar las páginas de opciones y configuraciones de manera deliberada y no depender de tutoriales de sitios web de copiar y pegar que están desactualizados y no incluyen la seguridad de datos adecuada, como los que se enumeran a continuación.

Ejemplos de qué no hacer :

t31os
fuente
1
Agregué un poco de texto enfatizado para indicar que los enlaces son ejemplos de lo que no se debe hacer, ya que es fácil leer la información y hacer clic en los enlaces sin leer el párrafo que los precede. También hizo la respuesta un poco más bonita mientras
estuve
2
Esto podría explicar un poco qué están haciendo exactamente los tutoriales de ejemplo de una manera incorrecta y / o antigua.
Rarst
4

Usar API de configuración

Los complementos y temas deben usar la API de configuración, que es más fácil de usar, más segura y se encarga del trabajo arduo de las páginas de configuración:

Para obtener buenos tutoriales sobre el uso de la API de configuración, consulte:

Chip Bennett
fuente
Vea mi comentario sobre esta respuesta con respecto a la configuración de API y las opciones de tema.
t31os
1

Para las casillas de verificación y las opciones de selección, los complementos y temas deben usar las funciones checked()y selected()para la salida checked="checked"y selected="selected", respectivamente.

Chip Bennett
fuente
No es realmente una cuestión de seguridad, a menos que me falte algo. Sigue siendo muy conveniente y bueno de usar. :)
Rarst
Bueno, tal vez y tal vez no. He visto MUCHO código personalizado para lograr lo mismo. Más código de espagueti = más oportunidades para introducir riesgos de seguridad. :)
Chip Bennett
Bennet, de haber enviado correos electrónicos con toscho hace unos días, creo que puedo decirlo por los dos, la mayoría de las funciones simples son mucho más fáciles de leer y comprender que esas funciones. No estoy deprimido, pero tampoco estoy votando esto. Imo, esto no debería ser parte del núcleo, ya que no agrega ningún valor.
kaiser
2
Tengo curiosidad por lo que se les ocurrió, eso es más fácil que checked( $theme_options['whatever_option'] )o checked( 'some_value' == $theme_options['whatever_option'] ). No sé cómo se vuelve más sucinto que eso?
Chip Bennett
1

Función de prefijo y nombres de variables

Los complementos deben prefijar todas las opciones, funciones personalizadas, variables personalizadas y constantes personalizadas con plugin-slug.

Los temas deben anteponer todas las opciones, funciones personalizadas, variables personalizadas y constantes personalizadas con theme-slug.

Chip Bennett
fuente
Extendería esto a todos los nombres de clase, así como a nombres de objetos personalizados como post_types y taxonomías.
mfields
1

Use wp_safe_redirect () en lugar de llamar a la función de encabezado () de php directamente al dirigirse a una página en el mismo dominio.

revs mfields
fuente
0

Agregue páginas de configuración a las secciones apropiadas del menú de administración

Los complementos deben usar la add_options_page()función para agregar la página de configuración de complementos al Settingsmenú, en lugar de usar add_menu_page()para agregar un menú de nivel superior.

Los temas deben usar la add_theme_page()función para agregar la página de configuración del tema al Appearancemenú, en lugar de usar add_menu_page()para agregar un menú de nivel superior.

Chip Bennett
fuente