Étapes à suivre pour masquer le fait qu'un site utilise WordPress?


142

J'ai un site Web pour lequel nous essayons d'être discret sur le fait que nous utilisons WordPress. Quelles mesures pouvons-nous prendre pour le rendre moins évident?

EDIT- Note de sécurité importante:

S'il vous plaît, comprenez qu'il est impossible de le faire parfaitement selon la réponse de Mark . Ne ​​vous fiez donc pas à cela comme mesure de sécurité.


7
Pourquoi voudriez-vous cacher que vous utilisez Wordpress?
Wadih M.

15
@Wadih: Parce qu'on m'a dit de le faire
Casebash le

5
C'est la sécurité par l'obscurité. S'ils le souhaitent vraiment, quelqu'un peut corréler le comportement des générations de pages et prouver qu'il fonctionne sur un moteur WordPress.
Wadih M.

28
@Wadih M. - "La sécurité par obscurité" n'est pas la seule raison à cela. Un de mes clients veut la même chose, mais ils le veulent parce qu'ils veulent pouvoir vendre leurs services hébergés à des clients qui hésiteraient à payer le prix fort s'ils pensaient «Heck, ils utilisent juste WordPress». Il s’agit donc d’un jeu d’image de marque / de perception, et non de sécurité, du moins pour mon client.
MikeSchinkel

2
Six années sur autant de sites utilisent WordPress, personne ne va vous croire de toute façon. ;-)
cjbj

Réponses:


128

Les plus gros cadeaux WordPress sont entre les <head> </head>balises.

Exemple de contenu de tête WordPress généré par The Twentyten Theme et comment le supprimer:

<link rel="profile" href="http://gmpg.org/xfn/11" /> 

Supprimer directement de header.php

 <link rel="stylesheet" type="text/css" media="all" href="http://example.com/wp-content/themes/twentyten/style.css" /> 

Cachez WordPress en appelant votre feuille de style à partir d'un autre emplacement et modifiez le répertoire wp-content. WordPress requiert que votre thème inclue des informations de base en haut de style.css (style.css doit se trouver dans le répertoire racine des thèmes). Vous devrez créer un autre CSS et l'appeler de votre tête. WordPress ne vous oblige pas à utiliser les thèmes style.css, il doit uniquement figurer dans le répertoire themes.

Supprimer directement de header.php

<link rel="alternate" type="application/rss+xml" title="Example Blog &raquo; Feed" href="http://example.com/feed/" /> 
<link rel="alternate" type="application/rss+xml" title="Example Blog &raquo; Comments Feed" href="http://example.com/comments/feed/" />    
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://example.com/xmlrpc.php?rsd" /> 
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://example.com/wp-includes/wlwmanifest.xml" /> 
<link rel='index' title='Example Blog' href='http://example.com/' /> 
<meta name="generator" content="WordPress 3.1-alpha" /> 

Pour supprimer ces liens supplémentaires, vous pouvez ajouter un filtre à functions.php

// remove junk from head
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'start_post_rel_link', 10, 0);
remove_action('wp_head', 'parent_post_rel_link', 10, 0);
remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0);

Vous pouvez modifier votre répertoire de plug-ins et votre répertoire wp-content dans votre fichier wp-config.php, mais vous pouvez rencontrer des problèmes si votre thème ou l'un de ses plugins n'utilise pas la méthode appropriée pour appeler des fichiers.

define( 'WP_CONTENT_DIR', $_SERVER['DOCUMENT_ROOT'] . '/new-wp-content' );

Définissez WP_CONTENT_URL sur l'URI complet de ce répertoire (sans barre oblique), par exemple

define( 'WP_CONTENT_URL', 'http://example/new-wp-content');

Définissez WP_PLUGIN_DIR sur le chemin complet de ce répertoire (sans barre oblique), par exemple:

define( 'WP_PLUGIN_DIR', $_SERVER['DOCUMENT_ROOT'] . '/new-wp-content/new-plugins' );

Définissez WP_PLUGIN_URL sur l’URI complet de ce répertoire (sans barre oblique), par exemple:

define( 'WP_PLUGIN_URL', 'http://example/new-wp-content/new-plugins');

PLUGINS

Sachez que certains plugins tels que Akismat, le référencement tout en un, le cache W3-Total, le super cache et bien d’autres ajoutent des commentaires à la sortie HTML. La plupart sont faciles à modifier pour supprimer les commentaires, mais vos modifications seront écrasées à chaque mise à jour des plugins.

wp-comprend

Le répertoire wp-includes contient jquery et divers autres fichiers js que des thèmes ou des plug-ins vont appeler à l’aide de wp_enqueue_script (). Pour changer cela, vous devrez annuler l'enregistrement des scripts WordPress par défaut et enregistrer le nouvel emplacement. Ajouter à functions.php:

function my_init() {
    if (!is_admin()) {
        // comment out the next two lines to load the local copy of jQuery
        wp_deregister_script('jquery');
        wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', false, '1.3.2');
        wp_enqueue_script('jquery');
    }
}
add_action('init', 'my_init');

Cela devra être fait avec chaque script utilisé par votre thème ou vos plugins.


Chris_O : Excellente réponse! Vous devriez probablement ajouter aussi que s'ils utilisent des plugins ou des thèmes, beaucoup d'entre eux sont faciles à identifier; Par exemple, si quelqu'un utilise le plugin akismet ou le référencement complet, c'est toujours un cadeau assez mort par quelqu'un qui sait ce qu'il cherche.
MikeSchinkel

@MikeSchinkel Certes, mais en même temps, wp-includes et wp-admin le sont aussi; à l'exception du fait que vous ne pouvez modifier ni l'un ni l'autre, ni les masquer sans limiter les fonctionnalités du site.
John P Bloch

@ John P Bloch: Bien sûr , je n'aurais pas dit mais j'aurais dit et . :)
MikeSchinkel le

3
@MikeSchinkel : pour wp-admin et wp-includes vous pouvez faire des choses via le contrôle d'accès apache, afin de rendre ces chemins pour les autres utilisateurs inexistants puis l'administrateur, conduisant par exemple à une norme 404.
hakre

@Chris_O: Checkout register_theme_directory(), je pense que c'est bien de cacher le répertoire theme dans le répertoire "wp-content".
hakre

45

Un bit qui manque souvent - supprimez-le readme.htmldans WordPress root. Il identifie non seulement l'installation en tant que WP mais possède également une version précise. Et n'oubliez pas de répéter les mises à jour.

Question connexe: interdire l'accès ou supprimer automatiquement le fichier readme.html, license.txt, wp-config-sample.php


5
Bon point - vous pouvez également utiliser votre fichier .htaccess pour toujours refuser l’accès à readme.html afin que vous n’ayez pas à vous soucier de le supprimer à nouveau.
Tim Malone


21

J'ai toujours utilisé la méthode du thème Roots .
Mais l’appliquer à ces ThemeJungle est généralement un gros casse-tête.

Alors, a commencé à jouer avec les WP_CONTENT_*constantes. Ce qui, à mon avis, est une méthode beaucoup moins sujette aux erreurs et voici ce que je travaille actuellement:

fenêtre d'activité de safari
/mest le uploadsdossier, /test le themesdossier et /t/test le dossier du thème actif. Le site n'est pas complexe, donc peu d'actifs chargés ...


WP_CONTENTLESS

wp-config.php

Paramétrage wp-contentà la racine ( /public_html/) du site.

/** 
 Inside WP_CONTENT, the following folders should exist: 
 /languages , /mu-plugins , /plugins , /themes , /upgrade , /uploads  

 The WP_CONTENT_* definitions bellow REMOVE the existence of the /wp-content folder 
 and makes its contents reside in the ROOT of your site

 UTTERMOST attention is necessary when doing file maintenance activities in the server (i.e.: WP upgrades, new Webmaster...), 
 as the Themes and Plugins folders are meant to be renamed to /t and /p (serious candidates for unthoughful removal)

 PLEASE note:
 - we change the Plugins folder in WP_PLUGIN_* definitions
 - the Themes folder is changed by a MustUse Plugin 
   (/mu-plugins/set-extra-themes-folder.php)
 - the Uploads folder is changed in WordPress settings page 
   (http://example.com/wp-admin/options-media.php)
 - the hardcode path to be used in WP_CONTENT_DIR and WP_PLUGIN_DIR can be checked using an action inside the set-extra-themes-folder Plugin (check the comments in this file)
*/
define( 'WP_CONTENT_DIR', '/www/htdocs/username/public_html' );
define( 'WP_CONTENT_URL', 'http://www.example.com' );

define( 'WP_PLUGIN_DIR', '/www/htdocs/username/public_html/p' );
define( 'WP_PLUGIN_URL', 'http://www.example.com/p' );

J'ai demandé à ce sujet dans [wp-hackers] - Des inconvénients à ce que WP_CONTENT_DIR (et son URL) soient définis sur DOCUMENT_ROOT? , où John Blackbourn 1 , Mike Little 2 et Otto 3 ont eu la gentillesse de conseiller:

1
Cette structure est active sur un site depuis 18 mois et je n’ai rencontré aucun problème. Comme pour toute modification de l'emplacement du répertoire de contenu, vous devez vérifier que les plugins que vous ajoutez au site ne supposent pas que le répertoire de contenu se trouve àwp-content.

2
Il existe des discussions sur le réseau qui$_SERVER['DOCUMENT_ROOT']pourraient être piratées. Dans ce cas, cela est extrêmement dangereux car il y a beaucoup d'endroits quirequire()ouinclude() WP_CONTENT_DIR. 'quelque chose';

3
Il existe des cas où le contenu$_SERVERpeut être parfaitement sécurisé, mais pour des raisons de sécurité, il est préférable de toujours le traiter comme des données non fiables. Pour ce cas spécifique, coder en dur le répertoire.


Un nouveau dossier de thèmes

/mu-plugins/set-extra-themes-folder.php

Comme il n'y a pas de WP_THEMES_*constantes, nous avons besoin de la fonction register_theme_directory () pour " Enregistrer un répertoire contenant des thèmes " . Nous avons
essayé de définir le répertoire supplémentaire à la racine, mais les résultats sont amusants (c'est-à-dire que cela ne fonctionne pas).

<?php
/*
    Plugin Name: Set Extra Themes Folder
    Version: 1.0
    Description: Allows the directory - http://example.com/t - to be used as an extra theme's directory
    Plugin URI: http://wordpress.stackexchange.com/questions/1507
    Author: brasofilo
    Author URI: http://rodbuaiz.com
*/


/**
 * Remove the comment from the following line to know the correct path to put in register_theme_diretory()
*/
//add_action( 'admin_head', 'brsfl_alert_directory_path' );

function brsfl_alert_directory_path()
{
    echo '<script type="text/javascript">
        alert("Directory: '.$_SERVER['DOCUMENT_ROOT'].'");
    </script>';
}


/**
 * The following will enable the directory "t" to be used as an EXTRA Themes directory
*/
register_theme_directory( '/www/htdocs/username/public_html/t' );


/**
 * De-registering default scripts in wp-includes for CDN ones
*/
add_action('init', 'brsfl_init_scripts');

function brsfl_init_scripts() 
{
    if ( !is_admin() ) 
    {
        wp_deregister_script( 'jquery' );
        wp_deregister_script( 'swfobject' );
        wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', false, '1.7.1' );
        wp_register_script( 'swfobject', 'https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js', false, null, true );
        wp_enqueue_script( 'jquery' );
        wp_enqueue_script( 'swfobject' );
    }
}

Dossier de téléchargements

/wp-admin/options-media.php

Au lieu de http://example.com/uploads, ça va être http://example.com/m.
Décocher Organize my uploads into...donnera une apparence sans WP aux URL des actifs.
Si le site est en ligne, une recherche / remplacement doit être effectué dans la base de données et les fichiers doivent être déplacés.
télécharge les paramètres du dossier


Plugins et contenu principal

Reportez-vous à la section Cris_ORéponse à la présente question.


Lisezmoi.html

Reportez-vous à la section RarstRéponse à la présente question.


Autres étapes

Comme d’habitude, les thèmes ThemeJungle peuvent provoquer des hacks spécifiques dans le thème.
Comme ... TimThumb ne fonctionne pas (!!! lol !!!).


1
Désolé, ThemeForest, vous semblez avoir pris des mesures pour résoudre ce problème . Et avec de belles mains secourables !
brasofilo

13

La seule réponse valable: IMPOSSIBLE

Il y a tellement de réponses très votées… Il est temps de mettre les choses au clair. Eh bien, la vérité est que c'est virtuellement impossible et même si c'est le cas, la vie est probablement trop courte pour y consacrer des efforts. Toute réponse, qui favorise les étapes pour cacher WP est juste une perte de temps et vous induira en erreur en pensant que vous cachez votre WP (c'est absurde).

1) Le problème ne réside pas dans les wp-*URL évidentes , ni dans la méta du générateur, etc. Les problèmes difficiles concernent les modèles associés à WordPress qu’un système développé localement ne se donnera pas la peine d’implémenter comme des pages d’auteurs, des pages d’années, des mois, des pages de jours, utilisez En tant que paramètre valide, nnn a un formulaire de commentaire avec la classe de commentaires wordpress, la structure et les noms de liens, puis il y a la promotion automatique des plugins de mise en cache et yoast SEO et probablement de nombreux autres plugins que vous voyez uniquement lorsque vous inspectez le code HTML lui-même.

2) Il existe d'autres méthodes non dénombrées qui montrent l'existence de WP (et vous ne pouvez pas battre ça):

  • Même l'en-tête de réponse php (comme noté par Dan Gayle en dessous de ma réponse) renvoie l'en-tête WP spécifique.

  • Tout le monde peut simplement interroger l’un des fichiers .php: site.com/wp-cron.phpou site.com/xmlrpc.php(ou etc, que vous ne pouvez pas cacher) et la réponse de l’en-tête sera à la 200place 404 not found.

  • n'importe qui peut vérifier ses points de terminaison json pour obtenir une réponse spécifique à WP.

  • Dans la page HTML, de nombreux mots .cssou .jsfichiers contiennent des phrases spécifiques qui font clairement référence à WP.

  • Dans la page HTML, il est facile de trouver les éléments / les classes CSS, comme <div class="entry-content post-14"...ou etc. (ce qui indique directement que la structure utilisée est celle de WP).

  • Dans la page HTML, vous verrez facilement le uploadsdossier, ou même si vous le renommez avec le codage en dur, la partie de date comme uploads/2018/05/image.jpg(ou même image-315x225.jpg) montre la structure typique de WP.

  • comme de nombreux sites sont maintenant construits avec MultiSite, il utilise par exemple des /site/2liens ...

  • ping vers tous les fichiers Lisezmoi des plugins / thèmes (qu’ils contiennent), comme le plugin-name/readme.txtstatut de retour 200.

  • et de nombreuses autres choses que vous (ou même des professionnels) serez incapables de cacher et perdront vos journées!


conclusion

Et même si vous vous efforcez de tout nettoyer en indiquant qu'il s'agit d'une wordpress, vous devrez peut-être refaire ou au moins revérifier après chaque plugin ou mise à niveau principale. La vie est trop courte pour cela.

Vous pouvez induire en erreur certains diluants, mais vous ne pouvez vous cacher d’un bon inspecteur. Si cela est fait en tant que mesure de sécurité, alors c’est toujours la sécurité par l’obscurité qui est fausse, et si vous avez simplement honte d’utiliser Wordpress, laissez-moi vous dire quelque chose - personne ne se soucie de vous, et même le très petit nombre qui ne le fera probablement pas. savoir comment le résoudre par lui-même.

La seule chose qui compte, c’est de protéger le plus possible WP et de surveiller ses mises à jour régulières.


la seule réponse correcte, je voulais poster cela. J'ai voté contre toutes les autres réponses, car elles ne sont que des essais trompeurs et fastidieux pour atteindre l'objectif impossible et absurde. Si vous me le permettez, j'ajouterai 2 centimes dans votre réponse.
T.Todua

bien sûr vas y.
Mark Kaplun

J'ai aussi voté ceci. Cela gaspille du temps à cacher des wp juste pour la sécurité par l'obscurité. Non seulement cela ne fonctionnera pas, mais cela pourrait aussi potentiellement casser une fonctionnalité mal faite.
Remzi Cavdar

10

Vous pouvez avoir WordPress sur un serveur et extraire votre contenu d'un autre uniquement en incluant le contenu dont vous avez besoin.

Si vous avez besoin de RSS, vous devrez faire de même avec cela.

Effectivement, ce serait comme si vous serviez des pages statiques à partir d’un proxy ou d’un CDN, mais uniquement les bits que vous voulez servir. Vous pouvez également simplement utiliser un système de commentaires basé sur JavaScript, tel que Disqus.

Utilisation vraiment faible des ressources, car il n’existe aucune base de données sur le serveur servant le contenu.


@ AndyBeard - C'est une idée très intéressante, mais il faudrait beaucoup de temps de développement pour obtenir quelque chose de fonctionnel. Ou connaissez-vous un projet open source où quelqu'un l'a déjà fait?
MikeSchinkel

4
Voici une solution wordpress.org/extend/plugins/really-static - il y en a quelques autres
AndyBeard

7

Vous pouvez créer votre adresse personnalisée pour vous connecter à votre blog. En n'utilisant pas le chemin classique «myblog.com/wp-admin» pour accéder à votre tableau de bord Cette page vous aidera à créer des connexions furtives. Ceci est également utile pour les mesures de sécurité.

Donc, le ppl qui ajoute wp-admin à votre blog ne pourra pas deviner :)


Le lien est obsolète et le plugin est supprimé.
Kaiser

2
@kaiser: l' Internet Archive Wayback Machine l' a (et, étonnamment, même le zip);)
brasofilo


1
@ kaiser brasofilo - merci à vous d'avoir suivi la réponse :) je garde cela aussi
mireille raad

5

En plus de ce qui précède, vous devez verrouiller l'accès aux différents wp*fichiers et répertoires. Si quelqu'un voulait savoir si vous utilisiez WP, il pourrait deviner si vous le pouviez wp-settings.phpou s'il pouvait accéder à un répertoire. Renvoyer un 403 n'est pas suffisant car il indique à l'utilisateur que la ressource existe. ils n'y ont tout simplement pas accès.

Je ne suis pas un expert Apache, j'ai donc posé cette question sur serverfault.


3

N'oubliez pas qu'un grand nombre d'informations d'en-tête http envoyées avec votre demande peuvent identifier votre site comme étant en cours d'exécution sur WordPress. Par exemple, si vous vérifiez les en-têtes sur les sites suivants, c'est évident:

$ curl -I http://www.rollingstones.com/
Server: WP Engine/5.0

$ curl -I http://www.mattcutts.com
X-Powered-By: W3 Total Cache/0.9.1.3

$ curl -I http://blogs.reuters.com/us/
WP-Super-Cache: Served supercache file from PHP

Certaines d'entre elles sont définies par le serveur, d'autres par des plugins. Il n'y a donc aucun moyen pour moi de dire comment supprimer 100% d'entre eux. Toutefois, si vous utilisez PHP 5.3, vous pouvez utiliser

header_remove("X-Foo");( http://www.php.net/manual/en/function.header-remove.php )

pour supprimer un en-tête PHP connu avant que votre contenu ne soit expulsé. Je ne peux pas dire avec certitude où placer ceci (peut-être que quelqu'un d'autre peut apporter cette information), mais il est probablement prudent de le placer tout en haut de votre index.php AVANT tout contenu envoyé au navigateur.


3

Cela peut être difficile à atteindre si vous êtes nouveau sur php et mod_rewrite. Je vous suggère donc de vérifier avec la section de ma réponse. Ou essayez vous-même, vous pouvez utiliser quelque chose comme ceci pour masquer la structure de chemin d'accès wp-content / plugins:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^modules/(.*) /wp-content/plugins/$1 [L,QSA]
</IfModule>

Cela changera le chemin vers / modules. Utilisez quelque chose de similaire pour une autre structure, vous aurez peut-être besoin de quelques réécritures avancées, voir http://httpd.apache.org/docs/current/mod/mod_rewrite.html pour plus d'informations sur mod_rewrite.

Si vous préférez quelque chose hors de la boîte, il y a quelques bons plugins, certains commerciaux, également gratuits sur le référentiel WordPress, je suggère d'essayer WP Hide & Security Enhancer . Cela inclut beaucoup de choses et aide à changer à peu près tout pour rendre votre WordPress méconnaissable. Voici quelques caractéristiques du code:

  • URL personnalisée de l'administrateur
  • URL personnalisée de l'administrateur
  • Bloquer l'URL d'administration par défaut
  • Bloquer tout accès direct au dossier pour masquer complètement la structure
  • Nom de fichier wp-login.php personnalisé
  • Bloquer les wp-login.php par défaut
  • Bloquer les wp-signup.php par défaut
  • Bloquer l'API XML-RPC
  • Nouveau chemin XML-RPC
  • URL de thème réglable
  • Nouveau thème url enfant
  • Changer le nom du fichier de style de thème
  • Wp-include personnalisé
  • Bloquer les chemins d'accès wp-include par défaut
  • Bloquer le contenu de wp-defalt
  • URL de plugins personnalisés
  • Changement d'URL de plugin individuel
  • Bloquer les chemins de plugins par défaut
  • Nouvelle URL de téléchargement
  • Bloquer les URL de téléchargement par défaut
  • Supprimer la version wordpress
  • Bloc méta-générateur
  • Disble the emoji et le code javascript requis
  • Supprimer la balise pingback
  • Supprimer wlwmanifest Meta
  • Supprimer rsd_link Meta
  • Supprimer wpemoji

et beaucoup plus..


2

Je ne veux pas répéter les options de codage puisqu'elles ont été couvertes de manière exhaustive. L'autre option qui fonctionne est l'utilisation d'un plug-in qui cache wp. J'ai utilisé ce plugin auparavant à des normes satisfaisantes. Son appelé cacher mon WordPress.


2

La plupart des réponses se concentrent sur l’obscurcissement de WordPress dans le code source d’une page, mais même avant cela, WP s’était déjà révélé dans l’en-tête http d’une installation standard. Essayez simplement votre propre site sur un site comme Web-sniffer (prétendez être IE 6 et demandez un en-tête http 1.0) et vous verrez que parmi les retours figurent:

<http://www.example.com/wp-json/>; rel="https://api.w.org/"

Ce dernier est un lien vers l' API Wordpress.org . C'est là depuis que l'API REST a été incluse dans WP 4.4. Vous pouvez l'enlever avec cette ligne au tout début de votre functions.php:

remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );

De nombreux plugins, comme Jetpack pour ses liens courts, peuvent également insérer des liens dans l'en-tête http. Ils peuvent le faire, car WP a une API HTTP , qui vous permet de manipuler les en-têtes. Vous pouvez utiliser cette interface pour supprimer tous les paramètres d'en-tête des plug-in si vous ajoutez votre action assez tard dans le processus.

Enfin, vous pouvez utiliser l' interface d'en-tête .htaccess pour intercepter tout ce que WP fait. Par exemple, vous pouvez empêcher l’envoi d’en-têtes de lien en incluant cette ligne:

<IfModule mod_headers.c>
Header unset Link
</IfModule>

0

Vous pouvez personnaliser un thème pour exclure toutes les informations WordPress. Supprimez également les méta-widgets et tous les widgets générant des informations sur la plateforme.

Personnellement, je préfère montrer ma gratitude en montrant que j'utilise WordPress.


17
La gratitude est agréable, mais elle ne répond pas à la question centrale.
ZaMoose

-1

Vous pouvez utiliser le plugin WPS Hide Login .
Vous vous connectez à votre wordpress en utilisant wp-admin. Mais vous pouvez changer wp-adminpour personnaliser en utilisant ce plugin.

Exemple:

Avant: http://example.com/wp-admin
Après: http://example.com/custom-text-to-login

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.