Question de sécurité client/serveur

a marqué ce sujet comme résolu.

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 ?

Salut,

tu dois sécuriser l’insertion pour te prémunir des injections SQL et sécuriser l’affichage pour te prémunir des injections de HTML / Javascript. Ni plus ni moins.

Pour reprendre tes termes, oui, prepare suffit mais il ne faut pas concaténer des valeurs manipulables par l’utilisateur dans ta requête. Tu dois à la place utiliser des placeholders, donc soit des ?, soit des labels que tu vas associer avec bindParams.

À cette étape, pas de filtrage HTML. C’est à l’affichage que cela se fait.

J’espère que cela t’aura apporté des clarifications.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte