has_cap( Validafirma_Permisos::CAPACIDAD ) ) { Validafirma_Permisos::asegurar_capacidad_de_administradores(); } } /** * Carga los adaptadores de plugins de terceros, si el registro existe. * * @return void */ public static function iniciar_adaptadores() { if ( class_exists( 'Validafirma_Registro_Adaptadores' ) ) { Validafirma_Registro_Adaptadores::iniciar(); } } /** * Suma la prueba de «Salud del sitio» sobre el almacén privado. * * @param array $pruebas Pruebas existentes. * @return array */ public static function agregar_prueba_de_salud( $pruebas ) { $pruebas['direct']['validafirma_almacen_privado'] = array( 'label' => __( 'Los PDF de ValidaFirma no se pueden bajar por internet', 'validafirma' ), 'test' => array( __CLASS__, 'probar_almacen_privado' ), ); return $pruebas; } /** * Comprueba que la carpeta privada no se sirva por HTTP. * * @return array Resultado en el formato de Salud del sitio. */ public static function probar_almacen_privado() { $resultado = array( 'label' => __( 'Los PDF de ValidaFirma no se pueden bajar por internet', 'validafirma' ), 'status' => 'good', 'badge' => array( 'label' => __( 'Seguridad', 'validafirma' ), 'color' => 'blue', ), 'description' => '
' . esc_html__( 'Los PDF originales y firmados se guardan en una carpeta que el servidor no entrega por su dirección.', 'validafirma' ) . '
', 'actions' => '', 'test' => 'validafirma_almacen_privado', ); $url_base = Validafirma_Almacen_Privado::url_publica_hipotetica(); if ( '' === $url_base || ! Validafirma_Almacen_Privado::asegurar() ) { // Fuera de las subidas: la carpeta no tiene dirección propia. return $resultado; } $token = bin2hex( random_bytes( 8 ) ); $archivo = Validafirma_Almacen_Privado::directorio() . '/salud-' . $token . '.txt'; file_put_contents( $archivo, $token ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents $respuesta = wp_remote_get( $url_base . '/salud-' . $token . '.txt', array( 'timeout' => 8, 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- filtro del núcleo de WordPress para peticiones al propio sitio. ) ); wp_delete_file( $archivo ); if ( ! is_wp_error( $respuesta ) && 200 === (int) wp_remote_retrieve_response_code( $respuesta ) && trim( (string) wp_remote_retrieve_body( $respuesta ) ) === $token ) { $resultado['status'] = 'critical'; $resultado['label'] = __( 'Los PDF de ValidaFirma se pueden bajar por internet', 'validafirma' ); $resultado['description'] = '' . esc_html__( 'Tu servidor no respeta el archivo .htaccess de la carpeta privada del plugin (es lo habitual en nginx), así que cualquiera con la dirección de un PDF lo podría bajar.', 'validafirma' ) . '
' . '' . esc_html__( 'Define en wp-config.php la constante VALIDAFIRMA_DIRECTORIO_PRIVADO con una carpeta fuera de la raíz web, o bloquea en el servidor la carpeta validafirma-privado-* de wp-content/uploads.', 'validafirma' ) . '
'; } return $resultado; } }