Définition
L’obfuscation des liens est une pratique qui vise à dissimuler la vraie destination d’un lien ou sa nature réelle. Cette technique peut être utilisée légitimement (protection contre le spam) ou de manière manipulatrice pour tromper les moteurs de recherche et contourner leurs guidelines.
Types d’obfuscation
Redirection JavaScript
// Obfuscation basique
function redirectTo() {
var dest = 'h' + 't' + 't' + 'p' + 's' + ':' + '//' +
'e' + 'x' + 'a' + 'm' + 'p' + 'l' + 'e' +
'.' + 'c' + 'o' + 'm';
window.location.href = dest;
}
// Encodage avancé
function obfuscatedLink() {
var encoded = "aHR0cHM6Ly9leGFtcGxlLmNvbQ==";
window.location.href = atob(encoded);
}
Liens dynamiques
<!-- Lien généré par JavaScript -->
<span onclick="buildLink()" class="fake-link">
Cliquez ici
</span>
<script>
function buildLink() {
var parts = ['https://', 'hidden-', 'destination.com'];
window.open(parts.join(''));
}
</script>
URL shorteners en cascade
Chaîne de redirections :
URL visible → bit.ly/xxx → t.co/yyy → destination-réelle.com
Objectif : Masquer destination finale
Techniques techniques
CSS masking
/* Lien invisible pour bots */
.hidden-link {
position: absolute;
left: -9999px;
color: transparent;
font-size: 0;
}
/* Lien visible différent pour users */
.visible-link {
display: block;
color: blue;
}
Base64 encoding
// Encodage destination
const encoded = btoa('https://real-destination.com');
// Result: aHR0cHM6Ly9yZWFsLWRlc3RpbmF0aW9uLmNvbQ==
// Décodage au clic
function decodeAndRedirect(encodedUrl) {
window.location.href = atob(encodedUrl);
}
Form submissions
<!-- Faux lien via formulaire -->
<form method="post" action="/redirect.php" style="display:inline">
<input type="hidden" name="dest" value="hidden-url.com">
<button type="submit" class="link-style">
Lien apparent
</button>
</form>
Motivations légitimes
Protection email
// Anti-spam email protection
function showEmail() {
var user = 'contact';
var domain = 'example.com';
var element = document.getElementById('email');
element.innerHTML = user + '@' + domain;
element.href = 'mailto:' + user + '@' + domain;
}
Tracking analytics
// Tracking sans affecter UX
function trackAndRedirect(destination, event) {
gtag('event', event, {
'event_category': 'outbound',
'event_label': destination
});
setTimeout(() => {
window.location.href = destination;
}, 100);
}
Affiliate link protection
<?php
// Masquer liens affiliés
$affiliate_links = [
'product1' => 'https://affiliate.com?id=123',
'product2' => 'https://affiliate.com?id=456'
];
if (isset($_GET['product']) && isset($affiliate_links[$_GET['product']])) {
header('Location: ' . $affiliate_links[$_GET['product']]);
exit;
}
?>
Risques et pénalités
Détection Google
Signaux d'alarme :
├── JavaScript execution required
├── Discordance anchor text/destination
├── Redirections suspectes
├── Patterns répétitifs
├── User experience dégradée
└── Cloaking détecté
Conséquences SEO
Pénalités possibles :
├── Dévaluation liens
├── Action manuelle
├── Désindexation pages
├── Perte rankings
└── Ban domaine complet
Détection et audit
Outils d’analyse
# Script détection obfuscation
import requests
from bs4 import BeautifulSoup
def detect_obfuscated_links(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# Liens JavaScript
js_links = soup.find_all(onclick=True)
# Liens avec redirections
suspicious_patterns = [
'javascript:',
'onclick=',
'window.location',
'setTimeout'
]
return analyze_patterns(js_links, suspicious_patterns)
Chrome DevTools
// Console commands pour audit
// Lister tous les event listeners
getEventListeners(document);
// Analyser liens suspects
document.querySelectorAll('a').forEach(link => {
if (link.onclick || link.getAttribute('onclick')) {
console.log('Suspicious link:', link);
}
});
Alternatives légitimes
URL shortening transparent
<!-- Avec preview destination -->
<a href="https://bit.ly/example"
title="Vers: https://destination.com"
rel="noopener">
Lien raccourci (→ destination.com)
</a>
Redirections 301 propres
# .htaccess redirect transparent
Redirect 301 /go/product1 https://affiliate.com/product1
Redirect 301 /go/product2 https://affiliate.com/product2
Pretty URLs
// Router transparent
Route::get('/recommandation/{product}', function($product) {
$affiliate_url = getAffiliateUrl($product);
// Log pour transparence
Log::info("Redirect to affiliate", [
'product' => $product,
'destination' => $affiliate_url
]);
return redirect($affiliate_url, 301);
});
Bonnes pratiques
Transparence utilisateur
<!-- Indication claire de redirection -->
<a href="/go/affiliate-product"
class="external-link"
title="Lien partenaire - sortie du site">
Voir le produit
<span class="external-icon">↗</span>
</a>
Documentation process
Guidelines internes :
├── Justification obfuscation
├── Méthodes autorisées
├── Review périodique
├── User experience priority
└── SEO compliance check
L’obfuscation des liens doit rester exceptionnelle et justifiée, privilégiant toujours la transparence et l’expérience utilisateur pour éviter les pénalités SEO.