<?php
/********************************** Configuration **************************************/
$SQLKEY="randomkey";
/******************************** Fonctions locales ************************************/
function DB_connecter() {
/**
* Définition des paramètres de connexion
* Note :
* Comme il y a plusieurs bases (une par profil et une par groupe, on est obligé
* d'extérioriser la configuration du serveur et de la connexion, sinon tout le monde
* accéderait à la même base.
*/
/**
* Sous linux, ce fichier de config. est créé durant la création des profils utilisateurs.
* Sous easyPHP, en local, Il y aura autant de fichiers que de profils enregistrés.
* Il se trouve à la racine de public_html
* Sous wamp server, il se trouve dans le répertoire local de ce fichier.
*/
if (is_file("config.php")) include ("config.php");
else{$hote="localhost"; $login="root"; $mdp=""; $bd="cartes_rfid";} // parms/défaut
// connexion et contrôle, renvoi de l'identifiant de la connexion
if ($connexion=mysqli_connect($hote,$login,$mdp)) {
$query="SET CHARACTER SET utf-8"; // modif. du jeu de caractères de la connexion
$res=mysqli_query($connexion, $query);
@mysqli_select_db($connexion, $bd);
}
return $connexion;
}
// --------------------------------------------------------------------------------------
function savRequest($carteNum, $text, $id=0){
global $connexion;
if ($id==0) // ajout
$sql="INSERT INTO checkLog (carteNum, request, dateTime)
VALUES('$carteNum', '$text') ;";
else
$sql="UPDATE checkLog SET request=concat(request, '$text', now())
WHERE id=$id ;";
try { mysqli_query($connexion, $sql);}
catch (Exception $e) {echo mysqli_error($connexion)." <br>$sql";}
}
/****************************** Programme Principal ************************************/
$connexion=DB_connecter(); // Connexion au serveur et à la base de données. C partit
// --------------------------------------------------------------------------------------
// TEST1 : Vérif Connexion au serveur et à la base de données : ERR 500
// --------------------------------------------------------------------------------------
if (!$connexion) {
header("HTTP/1.0 500 Internal Server Error1"); // code erreur original=500
echo "ERR 500 Database Connection Failed"; // Internal Server Error
exit(0);
}
// --------------------------------------------------------------------------------------
// TEST2 Si on a les bons paramètres : key, request et carte // ERR 400
// --------------------------------------------------------------------------------------
// ...&&$error='key' permet de récupérer le champ qui serait en erreur
if(!isset($_POST['key'])&&$error='key'
|| !isset($_POST['request']) && $error='request'
|| !isset($_POST['carte']) && $error='carte'){
header("HTTP/1.0 400 Bad Request"); // code erreur original=401
echo "ERR 400 parm Bad Request $error"; // message à changer pour : Bad Request
savRequest('E401-1', "Erreur de paramètres : $error", 0);// sauvegarde
exit(0);
}// fi bon paramètres
// --------------------------------------------------------------------------------------
// TEST3 si la clé est correcte // ERR 401
// --------------------------------------------------------------------------------------
if($_POST['key']!=$SQLKEY ){ // vérif si on a la bonne clé
header("HTTP/1.0 401 Bad Request1"); // code erreur original=401
echo "ERR key Bad Request"; // message à changer pour : Bad Request
savRequest('E401-2', "Erreur de clé, key=".$_POST['key'].".", 0);
exit(0);
} // fi Clé correcte
// --------------------------------------------------------------------------------------
// TEST4 si la requête est correcte (non vide et conforme aux possibilités) // ERR 402
// note de rappel : request contient le type d'action à réaliser
// (actuellement : check ou test. A venir : lock et free pour bloquer ou libérer une carte.
// --------------------------------------------------------------------------------------
if(empty($_POST['request'])
|| ($_POST['request']!='check' && $_POST['request']!='test')){ // contrôler l'action demandée
header("HTTP/1.0 402 Bad Request2"); // code erreur original=400
echo("ERR request Bad Request"); // message à changer pour : Bad Request
echo ('ERR 400 Mauvaise "requete" : '.($_POST['request'] || "parm absent")); // Bad Request
savRequest("E400-3", "Erreur d'action, request=".$_POST['request'].".", 0);
exit(0);
} // fi requête correcte
// --------------------------------------------------------------------------------------
// TEST5 si la carte est correcte (existe et est non vide) // ERR 403
// note de rappel : query contient le type de lait demandé, pas une requête SQL
// --------------------------------------------------------------------------------------
if(empty($_POST['carte'])){ // vérif si on a une carte
// (faut-il vérifier si le n° est totalement numérique ?, oui pour la sécurité, +tard)
header("HTTP/1.0 403 Bad Request3"); // code erreur original=400
echo("ERR carte Bad Request"); // message à changer pour : Bad Request
savRequest("E400-4", "Erreur de carte, carte=".$_POST['carte'].".", 0);
exit();
} // fi requête correcte
// --------------------------------------------------------------------------------------
// 3) Construire la requête de sélection prédéfinie
// - récup du n° de carte & mise en minuscules
$carteNum=strtolower($_POST['carte']);
// - petite sécurité contre l'injection : on remplace les = et les ; par des espaces
// puis le mots clés du SQL interdits, seul SELECT est autorisé
$carteNum=str_replace(array("=", ";"), " ", $carteNum);
$carteNum=str_replace(array("insert", "update", "delete", "grant"), " ", $carteNum);
// - création de la requête brute
$queryBrute="SELECT count(*) FROM carte WHERE numCarte=\"".$carteNum."\" ;";
// - convertir la requête en chaîne correcte (élimine les éventuels "%20" qui sont des " ")
$query=urldecode($queryBrute);
// Et voilà
// --------------------------------------------------------------------------------------
// 4) Exécuter la requête
// ATTENTION, pour l'instant, (presque) AUCUNE protection contre l'injection !!! (= ni PDO, ni mysqli)
$query_id=mysqli_query($connexion, $query);
// --------------------------------------------------------------------------------------
// TEST6 : si la requête est correcte / ERR 500 : Internal Server Error
// --------------------------------------------------------------------------------------
if(!$query_id){ // Erreur mysql_query : plantage de la requête
header("HTTP/1.0 500 Internal Server Error2 "); // créer l'entête html
echo "ERR 500 SQL error : ".mysqli_error($connexion);
savRequest($carteNum, "E500-6 : ".$query, 0);
exit();
}
// --------------------------------------------------------------------------------------
// 5) Lecture de la requête
// --------------------------------------------------------------------------------------
// TEST7 HTTP/1.0 ERR 204 : No content ; si réponse vide
// TEST8 HTTP/1.0 ERR 204 : No content ; si erreur de lecture (fetch)
// TEST8 HTTP/1.0 ERR 250 : Multiple Result ; plus de réponses que prévu, injection ?
// --------------------------------------------------------------------------------------
if ($enreg = mysqli_fetch_array($query_id)) {
if ($enreg[0]==1) { // OK, code retour=200
savRequest($carteNum, "OK : ".$query, 0);
echo 'OK ';
}elseif ($enreg[0]<1) { // TEST7b pas de données // ERR 204
echo 'ERR 204 No Content';
savRequest($carteNum, "E204-8 : ".$query, 0); // schtite save ...
}else{ // TEST8 TROP de données // ERR 250
echo 'ERR 250 Multiple Result';
savRequest($carteNum, "E250-9 : ".$query, 0);
}
// Construction du reste du contenu de la réponse
echo "<div class=carteNum>0123456789abcdef</div>";
if (isset($_POST['request'])) echo "request=".$_POST['request'].",";
if (isset($_POST['carte'])) echo "carte=".$_POST['carte']."";
echo "<div onclick='history.back();'>retrun</div>"; // retour au formulaire de test
}else{
echo("ERR 204 No Content");
savRequest($carteNum, "E204-7 : ".$query, 0);
exit();
}
mysqli_close($connexion); // fini
// =====================================================================================
?>