Bonjour,
j’ai lu ça : zeste de savoir xss/sql injection
et je viens avec des question parce que je n’ai toujours rien compris et je ne suis jamais sur de moi de ce coté, pour moi ce qui est encore logique c’est je nettoie l’entrée en bdd comme strip_tags etc… et mon text envoyez dans le formulaire sera de facto nettoyer et pourra être afficher sans mettre des htmlspecial partout.
et c’est ce que l’on voit dans pleins de tuto youtube etc… là où je pourrai me dire "il faut que je protège ça" c’est les input eux même
par exemple (c’est brouillon)
public function input(string $id,string $type,string $PlaceHolder=null,string $required=null,string $sql=null)
{
$req = isset($sql) && !empty($sql) ? $sql : null ;
//stocke la req si elle existe sinon met $_POST
$value = isset($_POST[$id]) && !empty($_POST[$id]) ? strip_tags($_POST[$id]) : $req ;
return "<input type=\"$type\" class=\"form-control\" id=\"$id\" name=\"$id\" placeholder=\"$PlaceHolder\" value=\"$value\" $required>";
}
et là votre article déconstruit tout ce que l’ont vois sur des tuto youtube pourtant la plupart sont bien des développeur formé contrairement a moi et disent que avant d’entré en base de donnée faite htmlspeacialchars en plus de la validation.
Et il y a aussi est-ce que ça attrait a la sécurité du code php ou du serveur ? par exemple si je met un scrip js dans la bar d’adresse donc avec mon vhost je met http://cms/forum(script)alert('hello')(/script)
ça me redirige ver un fobidden et a mon niveau je ne sais pas si c’est une réaction normal ?
et niveau requête j’ai pondu ça et ça couvre presque tout car j’aime pas me prendre la tête, et je vois certain mettre des bindParam etc… et sa casse forcément le dynamisme de cette partie de code, on m’a toujours dit que prepare suffisait et que c’est en amont qu’il faut nettoyé.
/**
* Request
*
* @param mixed $statement
* @param array $attrs
* @param int $one
* @return mixed
*/
public function Request(string $statement,?array $attrs=null,?int $one=null)
{
if(!is_null($attrs))
{
$req = $this->getPDO()->prepare($statement);
$req->execute($attrs);
if(!is_null($one)){
//retour 1 result
return $req->fetch();
}else{
//return all result
return $req->fetchAll();
}
}else{
$req = $this->getPDO()->query($statement);
if(!is_null($one)){
//retour 1 result
return $req->fetch();
}else{
//return all result
return $req->fetchAll();
}
}
return null;
}
Et donc en amont avec mon validator de titre j’ai ça, mais ça ne protège pas de l’injection c’est que de la validation.
/**
* validTtitle validation pour les titre
*
* @param mixed $key
* @return self
*/
public function validTtitle(string $key, ?string $name = null): self
{
if(!preg_match('/^[a-zA-Z0-9ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïñòóôõöøùúûüý\-\'\,.!?\s]{5,50}$/',$key))
{
$this->errors[] = "Le $name dois contenir 5|50 caractère (accent compris et espaces) et des (,|.|!|?)";
}
return $this;
}
Donc bref voici a quoi tout cela me mène jusque ici même moi je sais que c’est un bordel et que c’est pas propre, mais que faire de plus ? sachant que même si je parse du markdown a l’affichage je dois protégé les données.
/**
* creatTopic permet de créer un topic
*
* @return self
*/
public function creatTopic(): self
{
$this->app->isNotConnect('forum');
if(isset($_POST['topics']))
{
$this->validator->methodPostValid('POST');
$this->session->checkCsrf();
$topic_name = strip_tags(trim($_POST['f_topic_name']));
$content = strip_tags(trim($_POST['f_topic_content']));
$userid = (int) $_SESSION['auth']->id;
$tags = isset($_POST['tags']) ? $_POST['tags'] : ['empty'] ; /* entre 1 et 4 tags requis Choices */
$sticky = isset($_POST['sticky']) ? (int) trim($_POST['sticky']) : 0 ;
$this->validator->minLength($content, 100,'topic contenu')
->itemsCountArray($tags, 4 ,'tags')
->optionValidation($sticky,'1|0','sticky')
->betweenLength($topic_name, 6,50,'topic name')
->validTtitle($topic_name, 'topic name')
->postExistTags($tags,'tags');
if($this->validator->isValid())
{
$this->cnx->Request("INSERT
INTO f_topics SET f_topic_name = ?, f_user_id = ?, f_topic_content = ?, sticky = ?, f_topic_date = NOW()",[$topic_name, $userid ,$content,$sticky]);
$lastid = $this->cnx->lastInsertId();
sleep(1);
$this->tagsAction->insertTagsOnNewTopic($tags,$lastid);
$this->app->setFlash('Votre topic a bien étais poster');
$this->app->redirect($this->router->routeGenerate('viewtopic', ['id' => $lastid.'#topic-'.$lastid]));
}
$this->errors = $this->validator->getErrors();
}
return $this;
}
En finalité doit on nettoyé l’insertion ou sécurisé l’affichage ou faire l’un pour évité de faire l’autre ?