(10-08-2013, 11:45 AM)Xenos a écrit :Citation :echo ${'$_GET["division_premiere_ligne_". $count .""]'}La chaine est entourée de guillemets simples ' ' et donc, au niveau de $count, ce doit être des guillemets simples, sinon, php ne fait rien du tout et affiche, tel quel " . $count . ".
Ensuite, ${...} va chercher la variable dont le nom est '...'. Ici, le nom utilisé à la place des ... est '$_POST[]', donc php cherche une variable dont le nom est $_POST[], autrement dit, il ne cherche pas $_POST[] (variable dont le nom est _POST[]) mais $$_POST[].
La syntaxe que tu cherchais est:
Code PHP :<?php
[quote='Xenos' pid='120782' dateline='1376127946']
echo $_POST["division_premiere_ligne_". $count]
Ici, PHP cherche bien la variable $_POST[] avec le nom de clef "division_premiere_ligne_". $count qui est une chaine de caractère composée d'une constante littérale (gauche) et de la valeur d'une variable (droite).Oki une erreur bête en somme ...
(10-08-2013, 11:45 AM)Xenos a écrit : Pour l'injection, le principe est simple:OK j'en avais entendu parler mais bon pour moi c'étais plus de l'optimisation...
OWASP a écrit :Avant de faire n'importe quel traitement à une donnée entrante, il faut la vérifier par le biais d'une "whitelist".
En d'autres mots, avant de faire le moindre test ou manipulation d'une entrée ($_POST, $_GET, $_COOKIE, $_FILE(S?), headers HTTP, voire même les données issues de ton propre SQL ...) il faut les vérifier en ayant une liste de valeurs autorisées. La donnée doit être sur la liste des valeurs autorisées, sinon, elle doit être refusée. L'approche "blacklist" (lister les valeurs interdites et autoriser tout le reste) est souvent source de failles, l'approche whitelist est plus sécurisée.
Dans l'exemple précédent, avec ${...}, la valeur de ... venait directement du client (c'était la valeur de ton $_POST), donc je pouvait mettre n'importe quoi à la place des ... et voir la valeur de n'importe quelle variable PHP du serveur.
Il te faut donc d'abord vérifier que les valeurs de ton $_POST['attack'] sont toutes recevables et valides avant de les traiter. Pour "target", je ne sais pas quelle est ta whitelist, mais pour les "lines", je pense que tu peux transformer chaque valeur en entier, avec un cast (int), puis vérifier qu'elle est positive strictement et qu'elle ne dépasse pas la borne maximale (3 dans l'exemple précédent). Tu peux aussi faire une liste brute (array(1,2,3)) et vérifier que chaque valeur est bien strictement dedans (attention, '3' !=== 3 à cause du typage différent).
Pour le texte j'ai cette fonction assez classique :
Code :
function form($valeur)
{
$valeur = (!get_magic_quotes_gpc()) ? addslashes($valeur) : $valeur;
$valeur=trim(htmlspecialchars($valeur));
return $valeur;
}
Pour la white list, il faut que je repense mon code mais logiquement je pense utiliser un ensemble de condition dans un if. Bon déja il faut que je réutilise ce que tu m'as donné pour hasher et vérifier : je peux vérifier s'il l'entré est un nombre strictement positif et ensuite s'il n'y a pas de doublon.
Re-merci en tout cas.
(10-08-2013, 11:05 AM)Sephi-Chan a écrit : Je pense que ce qu'il te faut c'est un formulaire comme ça :Haaaaaaaaaaaa pas bêteeeee !
<form action="..." method="POST">
<p>Cible : <input type="text" name="attack[target]" /></p>
<h2>Formation</h2>
<div>
<div>
Ligne 1 :
<select name="attack[lines][1]">
<option value="1">Lancier</option>
<option value="2">Épéiste</option>
<option value="3">Cavalier</option>
</select>
</div>
<div>
Ligne 1 :
<select name="attack[lines][2]">
<option value="1">Lancier</option>
<option value="2">Épéiste</option>
<option value="3">Cavalier</option>
</select>
</div>
</div>
<p><input type="submit" value="Attaquer !" /></p>
</form>
Et côté PHP, tu recevras dans$_POST['attack']
un hash de la forme suivante :
array(
'target' => 'Fooo',
'lines' => array(
'1' => '3',
'2' => '2'
)
);
C'est quand même bien plus pratique à traiter. Et pour savoir s'il y a un doublon, tu as juste à comparer la taille du tableau de toutes les divisions choisies ; dans mon cas 3 (en première ligne) et 2 (en deuxième ligne) à son équivalent dédoublonné : si ça ne correspond pas, c'est qu'il y avait des doublons.
Ça se fait simplement en faisant :
$selected_ids = array_values($_POST['attack']['lines']);
$hasDuplicates = count($selected_ids) != count(array_unique($selected_ids));
Me disait aussi qu'un array pouvait servir mais je ne voyais pas comment. Après coup c'est logique mais faut y penser.
Si je comprends bien tu compare la taille entre l'array que tu as et l'array dédoublonné, si c'est différent il y a des doublons, logique ...
Par contre comme je suis dans la logique de vérification je n'ai juste qu'a englober le post d'un int non ?