
Alternative auto-hébergée à 12ft.io. et 1ft.io. Proxy pour supprimer les en-têtes CORS et modifier le HTML.
<p align="center">
<img src="https://raw.githubusercontent.com/everywall/ladder/HEAD/assets/pigeon.svg" width="100px">
</p>
<h1 align="center">Ladder</h1>
<div><img alt="License" src="https://img.shields.io/github/license/everywall/ladder"> <img alt="go.mod Go version " src="https://img.shields.io/github/go-mod/go-version/everywall/ladder"> <img alt="GitHub tag (with filter)" src="https://img.shields.io/github/v/tag/everywall/ladder"> <img alt="GitHub (Pre-)Release Date" src="https://img.shields.io/github/release-date-pre/everywall/ladder"> <img alt="GitHub Downloads all releases" src="https://img.shields.io/github/downloads/everywall/ladder/total"> <img alt="GitHub Build Status (with event)" src="https://img.shields.io/github/actions/workflow/status/everywall/ladder/release-binaries.yaml"></div>
*Ladder est un proxy web HTTP.*
[简体中文](https://github.com/everywall/ladder/blob/main/README.zh-CN.md)
Ladder est un outil pour développeurs permettant de tester et d'analyser les implémentations de paywall et le comportement de distribution de contenu sur les sites web modernes.
Il permet aux développeurs, chercheurs et éditeurs de simuler différents environnements clients (tels que les navigateurs et les robots d'exploration) et d'observer comment le contenu est servi dans des conditions variées. Il est donc utile pour déboguer les configurations de paywall, vérifier les contrôles d'accès, les en-têtes HTTP et garantir un comportement cohérent entre différents agents utilisateur.
Ladder est destiné uniquement à des fins légitimes de test, de recherche et d'assurance qualité. Il ne doit être utilisé qu'en conformité avec les lois applicables et les conditions d'utilisation du site web cible.

### Comment ça fonctionne
```mermaid
sequenceDiagram
client->>+ladder: GET
ladder-->>ladder: apply RequestModifications
ladder->>+website: GET
website->>-ladder: 200 OK
ladder-->>ladder: apply ResultModifications
ladder->>-client: 200 OK
```
### Fonctionnalités
- [x] Supprimer/modifier les en-têtes CORS des réponses, ressources et images ...
- [x] Supprimer/modifier d'autres en-têtes (par ex. Content-Security-Policy)
- [x] Supprimer/injecter du code personnalisé (HTML, CSS, JavaScript) dans la page
- [x] Appliquer un ensemble de règles/code basé sur le domaine pour modifier la réponse / l'URL demandée
- [x] Garder le site navigable
- [x] API
- [x] Récupérer le HTML brut
- [x] User-Agent personnalisé
- [x] IP X-Forwarded-For personnalisée
- [x] [Conteneur Docker](https://github.com/everywall/ladder/pkgs/container/ladder) (amd64, arm64)
- [x] Binaire Linux
- [x] Binaire Mac OS
- [x] Binaire Windows (non testé)
- [x] Authentification de base
- [x] Journaux d'accès
- [x] Peut casser le suivi, les publicités et autres contenus tiers
- [x] Limiter le proxy à une liste de domaines
- [x] Exposer le ruleset à d'autres instances de Ladder
- [ ] Test de robots.txt
- [ ] Proxy TOR optionnel
- [ ] Une clé pour partager une URL proxifiée
### Limites
Certains sites web fournissent un contenu différent (cloaking) selon le type de client qui y accède (par exemple, les robots de moteurs de recherche par rapport aux navigateurs web standard). Ladder peut être configuré pour émuler différents types de clients afin de récupérer du contenu accessible au public à des fins de test, d'automatisation ou de recherche.
Cependant, de nombreux sites web mettent en œuvre des mécanismes avancés pour restreindre l'accès automatisé, tels que l'empreinte numérique (fingerprinting), la limitation de débit (rate limiting) ou l'analyse comportementale. Ladder ne contourne pas ces protections et peut ne pas fonctionner correctement sur les services qui restreignent ou contrôlent activement l'accès.
Des outils tiers tels que FlareSolverr existent et peuvent être utilisés indépendamment pour restituer des pages web dans un environnement de navigateur sans tête (headless browser). Ces outils ne font pas partie de Ladder et leur utilisation peut être soumise à des restrictions légales et contractuelles. Les utilisateurs sont seuls responsables de veiller à ce que leur utilisation respecte toutes les réglementations applicables.
## Installation
> **Avertissement :** Si votre instance est accessible publiquement, assurez-vous d'activer l'authentification de base. Cela empêchera les utilisateurs non autorisés d'utiliser votre proxy. Si vous n'activez pas l'authentification de base, n'importe qui peut utiliser votre proxy pour naviguer sur des contenus choquants/illégaux. Et vous en serez tenu responsable.
### Binaire
1) Téléchargez le binaire [ici](https://github.com/everywall/ladder/releases/latest)
2) Décompressez et exécutez le binaire `./ladder -r https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml`
3) Ouvrez le navigateur (par défaut : http://localhost:8080)
### Docker
```bash
docker run -p 8080:8080 -d --env RULESET=https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml --name ladder ghcr.io/everywall/ladder:latest
```
### Docker Compose
```bash
curl https://raw.githubusercontent.com/everywall/ladder/main/docker-compose.yaml --output docker-compose.yaml
docker-compose up -d
```
### Helm
Voir [README.md](https://github.com/everywall/ladder/blob/main/helm-chart/README.md) dans le sous-répertoire helm-chart pour plus d'informations.
## Utilisation
### Navigateur
1) Ouvrez le navigateur (par défaut : http://localhost:8080)
2) Saisissez l'URL
3) Appuyez sur Entrée
Ou directement en ajoutant l'URL à la fin de l'URL du proxy :
http://localhost:8080/https://www.example.com
Ou créez un favori avec l'URL suivante :
```javascript
javascript:window.location.href="http://localhost:8080/"+location.href
```
### API
```bash
curl -X GET "http://localhost:8080/api/https://www.example.com"
```
### RAW
http://localhost:8080/raw/https://www.example.com
### Exécution du ruleset
http://localhost:8080/ruleset
## Configuration
### Variables d'environnement
| Variable | Description | Valeur |
| --- | --- | --- |
| `PORT` | Port à écouter | `8080` |
| `PREFORK` | Générer plusieurs instances du serveur | `false` |
| `USER_AGENT` | User agent à émuler | `Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)` |
| `X_FORWARDED_FOR` | Adresse IP de transfert | `66.249.66.1` |
| `USERPASS` | Active l'authentification de base, format `admin:123456` | `` |
| `LOG_URLS` | Journalise les URL récupérées | `true` |
| `DISABLE_FORM` | Désactive le formulaire d'URL sur la page d'accueil | `false` |
| `FORM_PATH` | Chemin vers le HTML du formulaire personnalisé | `` |
| `RULESET` | Chemin ou URL vers un fichier de règles, accepte les répertoires locaux | `https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml` ou `/path/to/my/rules.yaml` ou `/path/to/my/rules/` |
| `EXPOSE_RULESET` | Rendre votre ruleset disponible aux autres instances de Ladder | `true` |
| `ALLOWED_DOMAINS` | Liste de domaines autorisés séparés par des virgules. Vide = aucune limitation | `` |
| `ALLOWED_DOMAINS_RULESET` | Autoriser les domaines du ruleset. false = aucune limitation | `false` |
| `FLARESOLVERR_HOST` | URL du service FlareSolverr pour contourner Cloudflare (optionnel) | `http://localhost:8191` |
`ALLOWED_DOMAINS` et `ALLOWED_DOMAINS_RULESET` sont combinés. Si les deux sont vides, aucune limitation n'est appliquée.
| `BASE_PATH` | Chemin de base du proxy, utile si vous souhaitez exécuter le proxy sur un sous-chemin (par ex. http://localhost:8080/proxy/) | `` |
### Ruleset
Il est possible d'appliquer des règles personnalisées pour modifier la réponse ou l'URL demandée. Cela peut être utilisé pour supprimer ou modifier des éléments indésirables de la page. Le ruleset est un fichier YAML, un répertoire contenant des fichiers YAML, ou une URL vers un fichier YAML qui contient une liste de règles pour chaque domaine. Ces règles sont chargées au démarrage.
Un ruleset de base est disponible dans un dépôt séparé [ruleset.yaml](https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml). N'hésitez pas à ajouter vos propres règles et à créer une pull request.
```yaml
- domain: example.com # Includes all subdomains
domains: # Additional domains to apply the rule
- www.example.de
- www.beispiel.de
headers:
x-forwarded-for: none # override X-Forwarded-For header or delete with none
referer: none # override Referer header or delete with none
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
content-security-policy: script-src 'self'; # override response header
cookie: privacy=1
regexRules:
- match: <script\s+([^>]*\s+)?src="(/)([^"]*)"
replace: <script $1 script="/https://www.example.com/$3"
injections:
- position: head # Position where to inject the code
append: | # possible keys: append, prepend, replace
<script>
window.localStorage.clear();
console.log("test");
alert("Hello!");
</script>
- domain: www.anotherdomain.com # Domain where the rule applies
useFlareSolverr: false # Use FlareSolverr for Cloudflare bypass (optional, default: false)
paths: # Paths where the rule applies
- /article
googleCache: false # Use Google Cache to fetch the content
regexRules: # Regex rules to apply
- match: <script\s+([^>]*\s+)?src="(/)([^"]*)"
replace: <script $1 script="/https://www.example.com/$3"
injections:
- position: .left-content article .post-title # Position where to inject the code into DOM
replace: |
<h1>My Custom Title</h1>
- position: .left-content article # Position where to inject the code into DOM
prepend: |
<h2>Subtitle</h2>
- domain: demo.com
headers:
content-security-policy: script-src 'self';
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
urlMods: # Modify the URL
query:
- key: amp # (this will append ?amp=1 to the URL)
value: 1
domain:
- match: www # regex to match part of domain
replace: amp # (this would modify the domain from www.demo.de to amp.demo.de)
path:
- match: ^ # regex to match part of path
replace: /amp/ # (modify the url from https://www.demo.com/article/ to https://www.demo.de/amp/article/)
```
## Intégration de FlareSolverr
Ladder prend désormais en charge l'intégration avec [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) pour contourner la protection Cloudflare et d'autres défis anti-bot. Cela est particulièrement utile pour les sites qui utilisent des mécanismes sophistiqués de détection de robots.
### Configuration de FlareSolverr
1. **Utilisation de Docker Compose (recommandé) :**
```yaml
# docker-compose.yaml
services:
ladder:
image: ghcr.io/everywall/ladder:latest
ports:
- "8080:8080"
environment:
- RULESET=https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml
# - FLARESOLVERR_HOST=http://flaresolverr:8191
depends_on:
- flaresolverr
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
ports:
- "8191:8191"
environment:
- LOG_LEVEL=info
```
2. **Exécution de FlareSolverr séparément :**
```bash
docker run -d \
--name flaresolverr \
-p 8191:8191 \
ghcr.io/flaresolverr/flaresolverr:latest
```
Ensuite, démarrez Ladder avec l'URL de FlareSolverr :
```bash
FLARESOLVERR_HOST=http://localhost:8191 ./ladder
```
### Configuration des règles pour FlareSolverr
Pour utiliser FlareSolverr pour des domaines spécifiques, ajoutez l'option `useFlareSolverr: true` dans votre ruleset :
```yaml
# Example ruleset with FlareSolverr
- domain: cloudflare-protected-site.com
useFlareSolverr: true # Enable FlareSolverr for this domain
headers:
user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
# Regular site without FlareSolverr
- domain: regular-site.com
headers:
user-agent: "Custom User Agent 1.0"
```
### Cas d'utilisation
L'intégration de FlareSolverr est particulièrement utile pour :
- **Sites protégés par Cloudflare** : sites utilisant les défis anti-bot de Cloudflare
- **Sites avec défis JavaScript** : pages nécessitant l'exécution de JavaScript pour accéder au contenu
- **Chargement dynamique de contenu** : sites qui chargent le contenu dynamiquement via JavaScript
- **Détection avancée de robots** : sites utilisant des techniques sophistiquées d'empreinte numérique et de détection de robots
### Notes importantes
- FlareSolverr ajoute une latence supplémentaire aux requêtes car il doit résoudre les défis
- N'activez `useFlareSolverr` que pour les domaines qui en ont réellement besoin afin de préserver les performances
- FlareSolverr nécessite plus de ressources car il exécute un navigateur sans tête
- Assurez-vous que FlareSolverr est en cours d'exécution et accessible avant de l'activer dans votre ruleset
## Développement
Pour exécuter un serveur de développement sur http://localhost:8080 :
```bash
echo "dev" > handlers/VERSION
RULESET="./ruleset.yaml" go run cmd/main.go
```
### Optionnel : serveur de développement avec rechargement à chaud avec [cosmtrek/air](https://github.com/cosmtrek/air)
Installez air conformément aux [instructions d'installation](https://github.com/cosmtrek/air#installation).
Exécutez un serveur de développement sur http://localhost:8080 :
```bash
air # or the path to air if you haven't added a path alias to your .bashrc or .zshrc
```
Ce projet utilise [pnpm](https://pnpm.io/) pour générer une feuille de style avec les classes [Tailwind CSS](https://tailwindcss.com/). Pour le développement local, si vous modifiez les styles dans `form.html`, exécutez `pnpm build` pour générer une nouvelle feuille de style.