Espionnage
Objectifs pédagogiques
- Comprendre le principe d’un webhook.
- Manipuler les requêtes HTTP (GET/POST).
- Utiliser un service de notification (NTFY) comme endpoint.
- Utiliser des requêtes HTTP (POST, GET)
- Déclencher des traitements dans une application
- Automatiser l’envoi d’événements via Python et Bash.
- Mettre en place une supervision ou un échange inter-application simple.
- Communication entre applications
- Superviser un serveur ou service
- Détecter et transmettre une alerte automatiquement
I) Un objectif est de suivre la gestion de vos contacts d'entreprises pour la recherche d'un stage, nous allons pour cela survoler de nombreux points du programme de votre BTS.
- Espionnage en PHP pour votre recherche de stage ...
En quelques mots, l'objectif est de savoir lorsque votre lettre de motivation est lue et si suite à cette lecture le responsable va lire votre CV.
Plusieurs façons d'en être informé
- par un fichier qu'il faut aller consulter sur Internet ou sur votre téléphone.
- par un message envoyé dans une page spécifique via le service ntfy (identique dans l'esprit au cas précédent).
- Inscrire la visite dans une base de données, pour éventuellement en tirer des statistiques.
- Recevoir un SMS sur votre téléphone dés que la visite est réalisée.
Exemples de TP :
- Surveiller un service (Apache, nginx, MySQL) et envoyer une notification NTFY si le service tombe.
- Envoyer un message NTFY quand un script de sauvegarde se termine.
Les connaissances nécessaires :
- Vos connaissances en HTML.
- Vos connaissances du langage PHP et la création d'un script.
- Déterminer les variables à récupérer permettant d'identifier le client.
- Un enregistrement des données du client dans un fichier puis dans un second temps dans une base de données.
- Le langage SQL.
- En PHP rediriger le client vers un fichier pdf, par exemple votre CV { header('Content-Disposition: attachment; filename="document.pdf"'); }
- Les méthodes GET et POST.
- L'écriture et la lecture de fichier avec le langage PHP.
- L'utilisation d'une base de données pour mémoriser vos informations.
- Un service gratuit pour nous informer d'un évènement qui arrive sur votre serveur.
II) Les méthodes GET et POST
Vous avez vu comment saisir une information via la commande input avec Python
- nom = input ("Saisir votre nom : ")
- print("Bonjour " , nom)
Il existe la même chose en Java, que l'on verra prochainement.
Mais comment saisir une information dans une page Web, pour la transférer à une base de données et traiter l'information.
Je vous présente deux méthodes :
La première utilise la
méthode GET :
Cette méthode consiste à mettre des informations dans l'URL de la manière suivante :
Avec la page :
<?php
- echo ($_GET['var'] . "<BR>");
- echo $_GET['Nom'];
?>
La seconde méthode est la
méthode POST :
Voici la première page ne contenant que du HTML, par exemple post.htm :
- <form method="post" action="post.php">
- <input type="text" name="Nom" size="35" value="Dupond">
- <input type="submit" name="Envoi" value="Valider">
- <input name="reset" type="reset" value="Annuler">
- </FORM>
Vous obtenez un formulaire que vous devez remplir et votre saisie est récupérée par la méthode POST, la preuve validez le formulaire !
Il ne vous reste plus qu'à saisir
http://localhost/www/post.htm
<?php
- $Nom = $_POST['Nom'];
- echo ("Votre nom est " . $Nom . "." );
?>
Un exemple simple d'utilisation de la méthode POST
Le formulaire :
- <form method="post" action="hex-dec.php">
- <input type="text" name="Valeur" size="35" value="Valeur">
- <input type="submit" name="Envoi" value="Valider">
- <input name="reset" type="reset" value="Annuler">
- </FORM>
Le programme PHP :
<?php
- $Val = $_POST['Valeur'];
- echo ("la valeur hexadécimale " . $Val . " correspond à " . hexdec($Val) );
?>
A nous de tester (sur alwaysdata) !.
III) Le service NTFY
Il existe un service très simple que l'on va utiliser pour nos projets !
Mise en œuvre :
On va ouvrir
la page des notifications.
Choisir "Publier la notification" dans
https://ntfy.sh/btsio
Vous vous demandez sûrement à quoi cela peut bien servir.
On va le découvrir ensemble ...
Question --> Est-il possible d'envoyer une notification vers ntfy via un lien http par un navigateur, sans passer par curl (voir plus bas, dans quelques minutes) ?
- On ne peut pas envoyer une notification ntfy juste en cliquant sur un lien HTTP, car l’envoi d’un message vers ntfy nécessite une requête HTTP POST,
et un lien dans un navigateur ne peut exécuter qu’une requête GET.
On peut créer une
page web (avec github) qui permet d'envoyer un message vers le service.
Mettre dans Topic --> btsio
Tester sur alwaysdata.
T.D --> je vous invite à vous connecter sur l'une de ces pages avec vos téléphones si vous avez du réseau et
ainsi envoyer une notification.
Question ... pouvez-vous accéder au contenu de cette page ?
IV) Envoyer des notifications en :
- Python
- Javascript
- avec le bash
- en P.H.P.
Question --> Comment envoyer une notification en Python ?
Attention ! ne pas oublier d'installer le package
requests si nécessaire :
- D:\PythonPortable\python.exe -m ensurepip
- D:\PythonPortable\python.exe -m pip install requests
<?php
import requests
requests.post("https://ntfy.sh/btsio", data="1 - Sauvegarde terminée !!".encode(encoding='utf-8'))
resp = requests.post(
"https://ntfy.sh/btsio",
data="2 - Sauvegarde terminée seconde version !! ",
headers={"Content-Type": "text/plain; charset=utf-8"}
)
print(resp.status_code, resp.text)
topic="btsio"
requests.post("https://ntfy.sh/" + topic, data="3 - message de test".encode(encoding='utf-8'))
On peut également utiliser le langage Javascript (côté client).
- fetch('https://ntfy.sh/korben1234', { method: 'POST', // PUT works too body: 'Sauvegarde terminée !! 😀' })
Voici un exemple d'un tel script :
<?php
<!DOCTYPE html>
<html lang="fr">
<body>
<button onclick="send()">Envoyer notification</button>
<script>
function send() {
fetch("https://ntfy.sh/btsio", {
method: "POST",
body: "Hello depuis javascript !"
});
}
</script>
</body>
</html>
Avec le shell bash :
La commande curl dans un script bash.
En utilisant curl cela donne :
curl -H "Title: Test section SIO" -d "Message très important" https://ntfy.sh/btsio
Script bash :
#!/bin/bash
topic="
https://ntfy.sh/sio2025-groupeX"
message="Notification envoyée depuis Bash !"
echo "$message" | curl -d @- "$topic"
echo "Notification envoyée."
Alerte si un site ne répond pas
#!/bin/bash
URL="
http://a1b2.com"
TOPIC="
https://ntfy.sh/btsio"
if ! curl -s --head "$URL" >/dev/null; then
- curl -d "Le site $URL ne répond plus !" "$TOPIC"
else
- curl -d "Tout est Ok" "$TOPIC"
fi
Remarque :
Ce que fait curl -s
N’affiche pas la barre de progression
N'affiche pas les messages d'erreur ou d'information
N'affiche que la sortie “pure” retournée par la requête (le contenu).
Exemple
- curl -s https://example.com
Affiche uniquement le contenu HTML de la page, sans aucune information supplémentaire.
Si on souhaite le mode silencieux mais quand même voir les erreurs, il faut utiliser :
- curl -sS https://example.com
On termine avec P.H.P. où l'on utilise la fonction curl_xxxx ...
<?php
$topic = "btsio";
$message = "Hello depuis PHP !";
$ch = curl_init("https://ntfy.sh/$topic");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
Pour installer curl sur php sous Linux (si non présent) :
- sudo apt-get install php5-curl # pour PHP 5.x
- sudo service apache2 restart
Idem mais pour windows :
Il faut activer l’extension dans php.ini : extension=php_curl.dll
Puis redémarrer Apache/IIS
V) Envoyer un SMS lors d'un évènement sur votre serveur.
- On peut également envoyer un SMS dans le cas d'un évènement qui arrive sur votre serveur.
Voici un exemple avec Free.fr je vous laisse découvrir le fonctionnement sur les autres opérateurs.
Informations -->
https://mobile.free.fr/account/mes-options/notifications-sms
Envoyer un SMS sur votre téléphone -->
https://smsapi.free-mobile.fr/sendmsg?user=N°D'utilisateur&pass=VotreCodeScret&msg=Hello%20World%20!
ATTENTION à ne pas utiliser ce service pour inonder vos correspondants ! (et pensez aux contraintes imposées par la CNIL).
Il est temps de passer à la pratique dans un premier T.P.
On va découvrir ce qu'il est possible de tirer de ces différents outils.
VI) Un serveur web, le langage PHP avec une sauvegarde dans un fichier
Revenons au début :
Tout d'abord on va étudier d'un peu plus près la page PHP infos.php :
<?php phpinfo() ; ?>
On va y trouver le nom de certaines variables qui vont nous être bien utiles.
Faisons un test sur alwaysdata.
Je vous propose de nous intéresser à la variable php --> $_SERVER|'REMOTE_ADDR']
Je vous laisse chercher et découvrir d'autres variables qui peuvent vous informer sur le client ...
Application :
<?php
date_default_timezone_set("Europe/Paris");
$IP_client = $_SERVER['REMOTE_ADDR'];
$Client = gethostbyaddr($IP_client);
echo ($IP_client . "<BR><BR>");
echo ($Client . "<BR>");
$date = date("d-m-Y");
$heure = date("H:i");
$dateheure = " - Nous sommes le $date et il est $heure";
echo ("<BR>" . $dateheure);
?>
Voir le résultat avec
ce lien sur alwaysdata.
Vous pourrez utiliser nslookup (server).
Un exemple avec l'envoi d'une notification sur ntfy puis une redirection vers la page du site btsio.net
<?php
$topic = "btsio";
$message = "Hello depuis PHP avec redirection vers un pdf ou un site web quelconque !";
$ch = curl_init("https://ntfy.sh/$topic");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
# echo $response;
header('Location: https://www.osureunion.fr/wp-content/uploads/2022/03/pdf-exemple.pdf');
# header('Location: http://btsio.net/');
?>
Compléments sur la fonction curl de PHP
Pour commencer on peut lire et écrire dans un fichier :
Travaux pratiques fichiers et langage PHP.
<?php
# Chemin vers fichier texte
$file ="file/file.txt";
# Ouverture en mode écriture
$fileopen=(fopen("$file",'a'));
# Ecriture de "Début du fichier" dansle fichier texte
fwrite($fileopen,"Début du fichier");
# On ferme le fichier proprement
fclose($fileopen);
# Appliqué à notre contexte cela donne :
# Chemin vers fichier texte
$file ="file.txt";
# Ouverture en mode écriture
$fileopen=(fopen("$file",'a'));
# Ecriture de "Début du fichier" dansle fichier texte
fwrite($fileopen, $Client . " \n " . $dateheure . " \n " . $IP_client . "\n\n");
# On ferme le fichier proprement
fclose($fileopen);
?>
Compléments - $fileopen=(fopen("$file",'a')); :
Voici une liste des différents modes utiles qu'il est possible d'utiliser :
r : Ouverture en lecture seule, le pointeur sera au début
r+: Ouverture en lecture et écriture, le pointeur sera au début
w : Ouverture en écriture seule, crée le fichier ou le vide avant écriture, pointeur au début
w+: Ouverture en rw, crée le fichier ou le vide avant écriture, pointeur au début
a : Ouverture en écriture seule, crée le fichier si n'existe pas, pointeur à la fin si existe
a+: Ouverture en lecture et écriture, crée le fichier si n'existe pas, pointeur à la fin (écrit à la suite du fichier)
x : Ouverture en lecture seule, crée le fichier et ne fonctionne pas si le fichier existe déjà.
x+: Ouverture en lecture et écriture, crée le fichier et ne fonctionne pas si le fichier existe déjà.
c : Ouverture en écriture seule, crée le fichier si il n'existe pas, ne vide pas le fichier comme w, pointeur au début (écrit par au dessus de ce qui existe déja)
c+: Ouverture en lecture et écriture, pareil que pour c