WordPress: "noopener" y "noreferrer” como solución a una vulnerabilidad

Como ya sabréis, WordPress usa el editor TinyMCE que, a partir de su versión 4.5.0, añade rel="noopener noreferrer" cuando el enlace tiene el atributo target="_blank". El motivo de tal adición es solucionar una vulnerabilidad que se produce cuando abrimos un enlace en una nueva ventana. Fernando lo ha explicado muy bien en ayudawp.com y os invito a leerlo antes de seguir con lo que aquí expongo.

La solución adoptada por WordPress a partir de la versión 4.7.4 presenta, a mi modo de ver, dos inconvenientes:

  1. La adición solo se lleva a cabo en las nuevas entradas a partir de que actualicemos a la mencionada versión. Las entradas antiguas no sufren ninguna modificación salvo que las editemos. Eso significa que la vulnerabilidad seguirá presente en nuestros sitios salvo que editemos todas nuestras antiguas entradas.
  2. La adición se lleva cabo tanto si el atributo "abrir en una nueva ventana" se aplica a un enlace externo como a uno interno. Esta circunstancia puede afectar a cualquier plugin que use el campo "rel". Por ejemplo, los que manejan imágenes.

Para evitar estos inconvenientes, propongo

  1. Desactivar la adición automática.
  2. Interceptar la salida mediante plugin de forma que la adición solo se aplique a los enlaces externos. Como es obvio, los enlaces a entradas de nuestro propio sitio no están afectadas por la vulnerabilidad aunque las abramos en una nueva ventana.

Para ello, haremos lo siguiente:

1) Desactivar esta funcionalidad añadiendo el siguiente código a tu plugin de funciones o al archivo functions.php del tema:

1a) Versión de WordPress 5.0 o anterior con el editor Gutenberg desactivado:

add_filter('tiny_mce_before_init','tinymce_allow_unsafe_link_target');
function tinymce_allow_unsafe_link_target( $mceInit ) {
$mceInit['allow_unsafe_link_target']=true;
return $mceInit;
}

1b) Versión de WordPress 5.1 con el editor Gutenberg desactivado. A lo anterior hay que añadir una instrucción para deshabilitar la nueva función incluida en WP.

add_action( 'wp_loaded', 'wp_remove_targeted_link_rel_filters' );

add_filter('tiny_mce_before_init','tinymce_allow_unsafe_link_target');
function tinymce_allow_unsafe_link_target( $mceInit ) {
$mceInit['allow_unsafe_link_target']=true;
return $mceInit;
}

1c) Versión de WordPress 5.1 con el editor Gutenberg activado: de momento sin solución.

NOTA FEBRERO 2019: de las tres posibilidades, la solución para 1b y la constatación de la 1c es mérito de https://dsergio.com/.

2) Usar un plugin que cumpla la misma función, es decir, que añada "noopener" y "noreferrer” pero solo a los enlaces externos.  Yo utilizo SEO Nofollow External, un plugin que ya tiene cuatro años pero tan sencillo que funciona perfectamente incluso con PHP 7. No obstante, hay que corregir un par de cosas para adaptarlo. Editamos el archivo "nofollow-external.php" y

Línea 22: if (strpos($link, 'rel') === false){. Sustituimos rel por rel= (es decir, añadimos un igual al témino "rel"). Si lo dejáramos como está el original, el plugin no realizaría su cometido cuando la URL del enlace contuviera el término "rel" (por ejemplo, que contuviera la palabra "release"). Con este cambio evitamos ese error.

Línea 40: if (strpos($link, 'target') === false){. Sustituimos target por target= (añadimos un igual al témino "target"). Si lo dejáramos como está el original, el plugin no realizaría su cometido cuando la URL del enlace contuviera el término "target". Con este cambio evitamos ese error.

Por último, sustituimos nofollow por nofollow noopener noreferrer en las dos ocasiones que aparece aquél (líneas 23 y 25).

Si pincháis en cualquier enlace de los aquí puestos, podréis comprobar que el plugin funciona perfectamente pues todos los externos se abren en una nueva ventana. Si miráis el código fuente, también podréis comprobar que a dichos enlaces se les ha añadido rel="nofollow noopener noreferrer".


De todas formas, ya comienzan a salir plugins que realizan este cometido como por ejemplo WP External Links (nofollow new tab seo).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *