Bonsoir à tous,

techniquement je n'ai pas de soucis, mon progamme fonctionne. Mais j'ai l'impression d'avoir fait un 777 avec ce formulaire.

son rôle est simple, générer un fichier batch en fonction des chemins d'accés qu'il reçoit.

lors de la saise, une prévisualisation s'affiche.

un bouton télécharger permet de récupérer le programme formater

formulaire

<?php
require_once("./class2.php");
$sql = e107::getDb();
$mes = e107::getMessage();
require_once(HEADERF);
?>
<script type="text/javascript">
    document.title = "Générateur de sauvegarde";
</script>

<link rel="stylesheet"
      href="/e107_plugins/sc_tools/page/highlightjs/styles/dark.min.css">

<
<script defer="" src="https://highlightjs.org/static/highlight.min.js"></script>

<script defer="" src="https://highlightjs.org/static/demo/demo.js"></script>

<div>
    <form method="post" action="........./e107_plugins/sc_tools/page/request/autosav.php">

    <span class="element_form">
        <span style="color:white">Adresse du Launcher<br></span>
            <input type="text" name="launcher" id="launcher" style="width: 280px;" class="input_form"
                   placeholder="Où se trouve le launcher">
            <span class="glyphicon glyphicon-home glyphicon_form" aria-hidden="true"></span>
        <button type="button" data-toggle="modal" data-target="#launcher_box">?</button><br>
        <span style="color:#e0def4">ex: C:\Program Files\Roberts Space Industries\RSI Launcher</span>

        </span>

        <span class="element_form">
        <span style="color:white">Lieux de sauvegarde<br></span>
            <input type="text" id="sav" name="sav" style="width: 280px;" class="input_form"
                   placeholder="Où se trouve votre lieux de sauvegarde">
            <span class="glyphicon glyphicon-floppy-save glyphicon_form" aria-hidden="true"></span><button type="button"
                                                                                                           data-toggle="modal"
                                                                                                           data-target="#sav_box">?</button>
        <br>
        <span style="color:#e0def4">ex: c:\Users\moi\OneDrive\Bureau</span>

        </span>

        <span class="element_form">
            <span style="color:white">Adresse du jeux<br></span>
            <input type="text" id="game" name="game" style="width: 280px;" class="input_form"
                   placeholder="Où se trouve le live en lui même">
            <span class="glyphicon glyphicon-send glyphicon_form" aria-hidden="true"></span>
        <button type="button" data-toggle="modal" data-target="#game_box">?</button>
        <br>
        <span style="color:#e0def4">ex: I:\Starcitizen\StarCitizen</span>
        </span>

        <h3>Prévisuel du fichier</h3>

        <div id="req_result"></div>
        <input type="submit" value="Récupérer le fichie">
    </form>
</div>
<script>
    var launcher = "";
    var sav = "";
    var game = "";
     $('#launcher').keyup(delay(function (e) {
        // if(this.value =! "")
        // {
        launcher = (this.value);
        // }
        request();
    }, 1000));
    $('#sav').keyup(delay(function (e) {
        // if(this.value =! "")
        //  {
        sav = (this.value);
        //  }
        request();
    }, 1000));
    $('#game').keyup(delay(function (e) {
        //if(this.value =! "")
        //  {
        game = (this.value);
        console.log(this.value);
        //  }
        request();
    }, 1000));

    function delay(callback, ms) {
        var timer = 0;
        return function () {
            var context = this, args = arguments;
            clearTimeout(timer);
            timer = setTimeout(function () {
                callback.apply(context, args);
            }, ms || 0);
        };
    }

    function request() {
        var xmlhttp = new XMLHttpRequest();

        xmlhttp.open("POST", "......../e107_plugins/sc_tools/page/request/autosav.php", true);
        xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        data = [];
        data['launcher'] = launcher;
        data['sav'] = sav;
        data['game'] = game;
        console.log(data);

        xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlhttp.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
                //console.log(this.responseText);
                document.getElementById("req_result").innerHTML = '<pre style="max-height: 400px"><div class="code language-dos" id="prg">' + this.responseText + '</div></pre>';
                document.querySelectorAll('div.code').forEach(el => {
                    // then highlight each
                    hljs.highlightElement(el);
                });

            }
        };
        xmlhttp.send("action=read&launcher=" + launcher + "&sav=" + sav + "&game=" + game);
    };

</script>

<?php
require_once(FOOTERF);
exit;
?>

traitement

<?php

$prg= "
echo off
::pensez à télécharger nircmd https://www.nirsoft.net/utils/nircmd.html
::https://www.nirsoft.net/utils/nircmd.zip

nircmd exec show " . $_POST['launcher'] . "\RSI Launcher.exe
timeout 5 > nul
cd " . $_POST['sav'] . "\
mkdir keybinding
cd " . $_POST['sav'] . "\keybinding

set /A run=2

:start

tasklist /fi \"ImageName eq RSI Launcher.exe\" /fo csv 2>NUL | find /I \"RSI Launcher.exe\">NUL
::echo etat de error level:%ERRORLEVEL%
if \"%ERRORLEVEL%\"==\"1\" (goto exit)
...";
if(!empty($_POST) and $_POST['sav']=!"" and $_POST['game']=!"" and $_POST['launcher']=!"" and $_POST['action'] !="")
    {
        if ($_POST['action'] === "read")
        {
                echo $prg;
        }
        else{
            header("Content-type: text/plain");
            header("Content-Disposition: attachment; filename=autosav.bat");

            // do your Db stuff here to get the content into $content
            print $prg;
            print $content;
        }
    }
else{

}

Je souhaitearai être que des injections soient impossible
n'appellant pas de BD ici, ça devrait être limité, mais...

pourriez vous me guider

Merci d'avance pour votre aide

4 réponses


bonjour.
je vois un Chevron qui se balade tout seul
cest != et =!
la construction du string devrait se faire après le if
il n'y aurait pas des vérifications à faire sur les inputs ? url valide ? taille ? caractères interdits ?

cest != et =!

oups

la construction du string devrait se faire après le if

J'ai écris le fichier à l'envers et tu as parfairement raison

il n'y aurait pas des vérifications à faire sur les inputs ? url valide ? taille ? caractères interdits ?

c'est là que je seche, je suis pas sur des urls, mais des paths windows, donc les htmls encode.... me pose des soucis, je pourrais utiliser des regex.
Le contenu des inputs peut évoluer en fonction de de comment chacun utilise son pc.

c'est pour celà que je vous demande conseille

d'après tes exemples pour tes inputs, l'utilisateur donne une adresse donc c'est à toi de vérifier que c'est bien le cas.
en vérifiant la présence de / par exemple
qu'il n'y ait pas de caractère accentué ou d'espace qui pourrait faire bugger le programme
avoir une longueur minimum de caractère car rare son les dossiers de moins de 3 caractères
si j'écris autre chose qu'une adresse, que va t il se passer ?

voici la version corrigé et protégé, je pense que c'est pas trop mal

<?php
error_reporting(0);

$error_match=array();
$error_match['test']=false;
if(!empty($_POST) and $_POST['sav'] !="" and $_POST['game'] != "" and $_POST['launcher']!="" and $_POST['action'] !="")
    {
        $re = '/^([a-z]:)[\\\\ ^\\\\\\\\](?:[.\\\\ ](?![.\/\\\\\n])|[^<>:"|?*.\/\\\\ \n $@!.%])+$/mi';

        preg_match_all($re, $_POST['launcher'], $matches, PREG_SET_ORDER, 0);
        if(empty($matches))
        {
            $error_match['test']=true;
            $error_match['launcher']="le chemin du launcher n'est pas valide";
        }
        preg_match_all($re, $_POST['sav'], $matches, PREG_SET_ORDER, 0);
        if(empty($matches))
        {
            $error_match['test']=true;
            $error_match['sav']="le chemin pour la sauvegarde n'est pas valide";
        }
        preg_match_all($re, $_POST['game'], $matches, PREG_SET_ORDER, 0);
        if(empty($matches))
        {
            $error_match['test']=true;
            $error_match['game']="le chemin du jeux n'est pas valide";
        }
        if($error_match['test']===true)
        {
            print_r($error_match);
        }
        else
        {
            $prg= ".....";
            if ($_POST['action'] === "read")
            {
                echo $prg;
            }
            else{
                header("Content-type: text/plain");
                header("Content-Disposition: attachment; filename=autosav.bat");

                // do your Db stuff here to get the content into $content
                print $prg;
                print $content;
            }
        }

    }
else{

}