Tutoriels

[PHP] Prédire à l’avance les nombres aléatoires !

Salut la compagnie,

 

Oui je sais, je viens encore vous montrer du Dev … et j’en suis totalement désolé pour vous, m’enfin en ce moment c’est mon truc 😉 si vous êtes sages on verra des sujets un peu plus accessibles très bientôt !

Alors aujourd’hui, je vais probablement déterrer de vieux os, mais j’avais envie de vous faire part de ma découverte du jour !

Si je vous présente ce code php:

print rand(1, 100);

Vous me direz … que j’affiche ici un nombre aléatoire entre 1 et 100 !
Et vous aurez très probablement raison !

 

Ici, je récupère 67, 11, 74, 22, 98, … etc
C’est là, que vous vous demandez très probablement, comment il est possible de deviner à l’avance, quelque chose qui est « 
aléatoire« 

 

L’aléatoire

Tout d’abord, il est important de rappeler que l’aléatoire n’existe pas …
La plupart des fonctions censées retourner une valeur aléatoire, vont s’appuyer sur des données changeantes d’un environnement à un autre :

<![if !supportLists]>§  <![endif]>La date

<![if !supportLists]>§  <![endif]>L’heure

<![if !supportLists]>§  <![endif]>Le pourcentage de CPU utilisés

<![if !supportLists]>§  <![endif]>Le pourcentage de la Ram Utilisée

<![if !supportLists]>§  <![endif]>Le nombre de fichier créés dans l’heure 

<![if !supportLists]>§  <![endif]>L’id du processus

<![if !supportLists]>§  <![endif]>etc

Aussi, normalement il est très difficile de prédire à un instant T, la valeur retournée par une fonction qui calcule de l’aléatoire !

Un petit exemple simple pour calculer un nombre aléatoire

« Donnes moi un chiffre entre 1 et 50″

Si je prends l’année (2017), le jour (20), le mois (11), l’heure (19), les minutes (42) et les secondes (52).

Si je les multiplie tous ensemble :
2017 x 20 x 11 x 19 x 42 x 52
J’obtiens : 18 413 435 040

Que je multiplie ensuite par le % d’utilisation de mon processeur, de ma mémoire vive

soit 18413435040 x 8% x 25% = 3682687008000

 

Comme je cherche un chiffre entre 1 et 50, je vais prendre mes 3682687008000 Je vais extraire les chiffres ou les nombres qui sont compris entre 1 et 50:
3682687008000  => 36 26 008 000

Je supprime tous les « doublons » : 36 8 26 8 7 008 000

J’additionne le tout : 36 + 27 + 7 = 69
Et je le divise autant de fois par 2 qu’il n’en faut pour être en à la fois en dessous du maximum et au-dessus du minimum : 69 / 2 : 34.5

Si je ne parviens pas à un nombre en dessous du maximum ou du minimum (ce qui n’est pas le cas dans mon exemple), je retourne au choix le maximum ou le minimum 😉

 

Les cas d’utilisation de l’aléatoire

Nous utilisons l’aléatoire un peu partout sans nous en rendre compte …

Pouvoir faire du prédictif est sans intérêt dans des cas comme :

<![if !supportLists]>§  <![endif]>Les fonds d’écrans qui changent

<![if !supportLists]>§  <![endif]>Les intelligences artificielles que nous essayons de rendre plus humaines !

Mais aussi, sur des sujets un peu plus … hard !

<![if !supportLists]>§  <![endif]>Une loterie en ligne … connaitre un instant gagnant n’est pas mal non ?

<![if !supportLists]>§  <![endif]>La génération d’un mot de passe temporaire ?
Ba oui tant qu’à faire … si l’on ne connaît pas le mot de passe d’une personne … mais qu’on peut générer un mot de passe temporaire ce n’est pas mal non plus 😉

Rand et SRand

la fonction PHP n’a pas été correctement construite … aussi en appelant la fonction « srand() », vous aurez la possibilité de connaitre par avance les prochaines valeurs aléatoires …

 

J’ai ici volontairement, réalisé 2 exemples d’appel de la fonction « rand » de PHP …
Pour chacun de mes exemples, j’ai appelé la fonction « srand » …
Vous remarquerez ainsi que chaque fois que j’appelle « srand« , les nombres aléatoires récupérés reviennent !

Qu’est-ce que fait cette fameuse fonction « srand » :
http://php.net/manual/fr/function.srand.php

Celle-ci initialise, le générateur de nombre aléatoires !
Un générateur suivant toujours la même logique … renverra toujours les mêmes nombres à chaque remise à 0 !

Conclusion :

La fonction rand suit toujours la même logique … à chaque réinitialisation via srand, nous obtenons les mêmes nombres, et dans le même ordre !
Je vous recommande donc d’éviter d’utiliser srand et rand dans vos scripts !
Côté sécu :
Il suffit pour un pirate de dissimuler dans script php un srand, et hop le pirate pourra lire dans l’avenir !

Comment here

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

fr_FRFrench
en_USEnglish fr_FRFrench