<?php

// Librairie de fonctions de sécurité de l'application web.
// Encryptage d'une chaîne de caractères
// Décalage 23
function strEncryption($valeurzchaine) {
    $retour = "";
    for ($x = 0;
            $x < strlen($valeurzchaine);
            $x++) {
        $valeurcible = chr(ord(substr($valeurzchaine, $x, 1)) + 23);
        $retour .= $valeurcible;
    }
    return $retour;
}

// Décryptage d'une chaîne de caractères
// Décalage 23
function strDecryption($valeurzchaine) {
    $retour = "";
    for ($x = 0;
            $x < strlen($valeurzchaine);
            $x++) {
        $valeurcible = chr(ord(substr($valeurzchaine, $x, 1)) - 23);
        $retour .= $valeurcible;
    }
    return $retour;
}

// Fonction pour recueillir les clefs et leur valeurs de la méthode POST
function getPostVars() {
    $queryString = "";
    if (filter_input_array(INPUT_POST)) {
        foreach (filter_input_array(INPUT_POST) as $clef => $valeur) {
            $kv[] = "r$clef=$valeur";
        }
        $queryString = join("&", $kv);
    } else {
        $queryString = filter_input(INPUT_SERVERm, 'QUERY_STRING', FILTER_SANITIZE_STRING);
    }
    return $queryString;
}

// Fonction de filtre pour les champs passés à une requête SQL (SQL injection)
function antiInjection($souschaine) {
    $banlist = array(
        "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "and",
        "handler", "like", "as", "or", "procedure", "limit", "order", "group", "asc", "outfile", "desc",
        "load_file", "exec", "||", "|", "&", "=", "--", "javascript"
    );

    $tablo = array();
    if (empty($souschaine)) {
        return null;
    }
    $souschaine2 = stripslashes($souschaine);

    if (is_array($souschaine2)) {
        return array_map(__METHOD__, $souschaine2);
    }

    if (!empty($souschaine2) && is_string($souschaine2)) {
        return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"),
                array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'),
                $souschaine2);
    }

    if (strpos($souschaine2, " ") === false) {
        $tablo[0] = $souschaine2;
    } else {
        $tablo = explode(" ", $souschaine2);
    }

    // TODO permettre les mots qui contiennent le mot banni 
    // ex: meteore contient le mot «or».
    // SG 2023-10-28
    foreach ($tablo as $cle => $element) {
        foreach ($banlist as $elementban) {
            $pos = strpos(trim($element), $elementban);
            if (!($pos === false) && strlen($element) == strlen($elementban)) {
                $cle = "";
            }
        }
    }

    $retourchaine = trim(implode(" ", $tablo));
    if (strlen($retourchaine) == 0) {
        return null;
    } else {
        //Remplacer l'apostrophe par son équivalent HTML
        return str_replace("'", "&apos;", trim($retourchaine));
    }
}
