Skip to content

Multiple security vulnerabilities due to unsanitized user input (XSS & Injection risks) #4

@Abderrahmane-MERSTANI

Description

@Abderrahmane-MERSTANI

Description
Ce script PHP affiche des informations de chaîne YouTube en utilisant directement des valeurs provenant de $_GET et de réponses API sans aucune validation ni échappement.
Cela expose l’application à plusieurs vulnérabilités de sécurité critiques, notamment XSS (Cross-Site Scripting) et des injections indirectes.

❌ Problèmes identifiés

  1. ❗ Utilisation directe de $_GET sans validation
    $_GET['channelid']
    $_GET['pageToken']

Aucune vérification de type ou de format

Peut être manipulé via l’URL

Utilisé dans :

appels PHP

requêtes AJAX

attributs HTML

URLs

➡️ Risque élevé de XSS et de requêtes malveillantes

  1. ❗ XSS via sorties HTML non échappées

Exemples :

Si l’API retourne du contenu contenant du HTML ou du JavaScript :

Script injecté dans la page

Exécution côté navigateur

➡️ Même si la source semble fiable (API YouTube), elle ne doit jamais être considérée comme sûre

  1. ❗ Injection JavaScript dans .load()
<script> $("#videocontent").load(''); </script>

Concaténation directe de paramètres utilisateur dans du JavaScript

Possibilité de casser la chaîne JS ou d’injecter du code

  1. ⚠️ Vérification incorrecte de $_GET
    if(!is_array($_GET)&&count($_GET)<=0){
    exit();
    }

$_GET est toujours un tableau

Cette condition est inutile et incorrecte

Le script peut continuer avec des paramètres invalides

  1. ⚠️ Manque de valeurs par défaut sûres
    $_GET['pageToken']

Peut générer des notices PHP si absent

Déjà géré partiellement mais réutilisé plus bas sans contrôle

📌 Comportement attendu

Toutes les entrées utilisateur doivent être :

validées

filtrées

Toutes les sorties HTML doivent être échappées

Le JavaScript doit être protégé contre les injections

Aucune dépendance à des données non fiables

📌 Comportement actuel

Failles XSS possibles

Risques de comportement inattendu

Code difficile à sécuriser et maintenir

🔧 Suggestions de correction

Valider les entrées :

$channelId = filter_input(INPUT_GET, 'channelid', FILTER_SANITIZE_SPECIAL_CHARS);
$pageToken = filter_input(INPUT_GET, 'pageToken', FILTER_SANITIZE_SPECIAL_CHARS) ?? '';

Échapper les sorties HTML :

echo htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

Éviter l’injection JS :

json_encode($url);

Corriger la condition initiale :

if (empty($_GET['channelid'])) {
exit();
}

ℹ️ Contexte

Langage : PHP

Type : Sécurité

Gravité : Élevée

Impact : XSS, injection JavaScript, compromission utilisateur

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions