Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment afficher une image GD sans devoiler l e parametre du script ?

12 réponses
Avatar
Jean-Francois Ortolo
Bonjour

J'aurais besoin d'afficher des données non copiables automatiquement,
donc ne figurant pas dans le source.

Je suis amené à générer une image en GD de manière automatique, ce
sont des pronostics, affichés sous forme d'image *.jpg par un script
recevant un identificateur aléatoire. Ce script rend donc un header
image/jpeg, et est appelé théoriquement par le script initial, par une
balise <img src="url_script?param=value"> , ou param est
l'identificateur aléatoire, et value sa valeur.

Le problème, c'est que cet identificateur sera visible dans le source
de la page appelante, et que je ne peux pas supprimer de la bdd le
pronostic, pour éviter que l'on appelle de nouveau ( de manière
automatique ) l'url "url_script?param=value" par exemple par curl, car
la balise <img ne charge la données qu'à partir du navigateur,
c'est-à-dire après que la page appelante ait été interprétée et envoyée
au navigateur.

J'aimerais bien pouvoir mettre dans un seul script, la génération de
l'image gd, et la balise <img qui l'affiche ( ou quoi que ce soit
d'équivalent qui affiche l'image ), mais je ne sais pas comment faire.

Si je pouvais faire cela, je pourrais appeler le script qui génère
l'image par curl, en masquant le paramètre identificateur dans le code
php. Mais comment faire ?

Merci beaucoup de vos réponses.

Amicalement.

Jean-François Ortolo


PS Je suis obligé d'utiliser un identificateur pour identifier le
pronostic. Le fait qu'il est aléatoire, signifie simplement qu'il est
généré de manière aléatoire dans le script appelant, qui met le
pronostic dans la bdd avec cet identificateur qui sert de clé d'accès.

10 réponses

1 2
Avatar
Olivier Miakinen
Bonjour,

Le 30/07/2010 00:58, Jean-Francois Ortolo a écrit :

J'aurais besoin d'afficher des données non copiables automatiquement,
donc ne figurant pas dans le source.



Gniii ?

Des données affichées par le navigateur de ton visiteur sont forcément,
par définition, copiables.

Je suis amené à générer une image en GD de manière automatique, ce
sont des pronostics, affichés sous forme d'image *.jpg par un script
recevant un identificateur aléatoire. Ce script rend donc un header
image/jpeg, et est appelé théoriquement par le script initial, par une
balise <img src="url_script?param=value"> , ou param est
l'identificateur aléatoire, et value sa valeur.

Le problème, c'est que cet identificateur sera visible dans le source
de la page appelante, et que je ne peux pas supprimer de la bdd le
pronostic, pour éviter que l'on appelle de nouveau ( de manière
automatique ) l'url "url_script?param=value" par exemple par curl, car
la balise <img ne charge la données qu'à partir du navigateur,
c'est-à-dire après que la page appelante ait été interprétée et envoyée
au navigateur.



Si tu veux éviter que l'image soit appelée de nouveau après le premier
chargement, il te suffit d'invalider l'identificateur aléatoire aussitôt
qu'il a été utilisé. Le risque est que les utilisateurs normaux perdent
éventuellement l'image si jamais leur navigateur (pour une raison ou une
autre) demande à la recharger. Je ne sais pas si le cas peut vraiment se
présenter, mais c'est à vérifier.

Et bien entendu, celui qui voudrait sauvegarder l'image pour la regarder
tous les jours pendant les années qu'il lui reste à vivre, il pourra le
faire sans que tu puisses l'en empêcher.

J'aimerais bien pouvoir mettre dans un seul script, la génération de
l'image gd, et la balise <img qui l'affiche ( ou quoi que ce soit
d'équivalent qui affiche l'image ), mais je ne sais pas comment faire.



Pour que tout soit fait en un seul script, il faut que tout soit dans un
seul fichier (le fichier HTML), ce qui est possible avec le schéma d'URI
« data » (RFC 2397). Une recherche rapide me donne même un résultat
spécifique à PHP : <http://php.net/manual/fr/wrappers.data.php>.

Note que cette technique est utilisée par le test Acid2 :
<http://www.webstandards.org/files/acid2/test.html>.

Bien entendu, l'image est tout autant copiable ainsi (voire plus si
c'était possible).


Cordialement,
--
Olivier Miakinen
Avatar
Denis Beauregard
Le 29 Jul 2010 22:58:00 GMT, Jean-Francois Ortolo
écrivait dans
fr.comp.lang.php:

J'aurais besoin d'afficher des données non copiables automatiquement,
donc ne figurant pas dans le source.



D'un côté, je sais que le code de certains sites est à peu près
illisible. On a beaucoup de javascript, des variables avec 1 seul
caractère, des instructions sous forme de chaînes, genre
a="eygvqewugcdasilb238dg9vbf9b" et le script construit le résultat
à partir de cette chaîne. Il me semble avoir vu des trucs de la
sorte chez Yahoo (dans le processus de création d'un compte), l'idée
étant pour eux de se protéger contre les robots).

D'un autre côté, tu peux représenter ton image sous forme d'une série
d'images de 1 pixel de haut, images nommées aléatoirement et dont
l'ordre est donné par le script ci-dessus.

Comme on utilise du javascript pour voir le résultat, tu peux
désactiver certaines fonctions du navigateur. Par contre, le
bouton "imprimer écran" ne peut pas être désactivé. Au mieux, tu
diminueras le nombre d'utilisateurs pouvant recopier le contenu mais
ce ne sera jamais "aucun" et rien n'empêche un débutant d'apprendre
à utiliser le bouton du clavier pour imprimer l'écran !

Ceci dit, je sais qu'on peut utiliser Flash pour remplir l'écran au
complet, donc il ne reste plus de bouton sur le navigateur. Mais
Flash est installé dans le navigateur et pour obtenir le même
résultat en bloquant un bouton du clavier, il faudrait d'un côté
avoir beaucoup de connaissances en programmation, et de l'autre,
obliger l'utilisateur à installer un tel plug-in.

De toutes façons, ces idées sont indépendantes du PHP et devraient
être étudiées dans les forums appropriés.


Denis
Avatar
Yop
pour éviter que l'on appelle de nouveau ( de manière > automatique )
l'url "url_script?param=value" par exemple par curl,

Peut être en limitant l'appel au script en controlant le contenu de la
variable
$_SERVER['HTTP_REFERER']
Avatar
Olivier Miakinen
Le 30/07/2010 10:00, Yop répondait à Jean-François Ortolo :
pour éviter que l'on appelle de nouveau ( de manière > automatique )
l'url "url_script?param=value" par exemple par curl,

Peut être en limitant l'appel au script en controlant le contenu de la
variable
$_SERVER['HTTP_REFERER']



À mon avis, c'est une mauvaise idée pour trois raisons :
1) le HTTP_REFERER peut n'être pas transmis en utilisation normale (ce
qui fera donc échouer la requête alors qu'elle devrait réussir) ;
2) le HTTP_REFERER peut être forgé en utilisation frauduleuse (ce qui
fera donc réussir la requête quand Jean-François voudrait qu'elle
échoue) ;
3) une copie d'écran de la requête qui a réussi suffit à conserver
l'image /ad vitam aeternam/.

Cordialement,
--
Olivier Miakinen
Avatar
Jean-Francois Ortolo
Bonjour

Finalement... Le seul problème pour moi, est que l'affichage soit
fait de telle manière, que l'identificateur ( aléatoire ) du script
d'affichage, ne soit pas visible dans le source.

Pour celà, il me suffit tout simplement, au lieu d'utiliser une
balise <im src="url_script?param=value" /> dans le script appelant, de
simplement positionner dans le script d'affichage, l'instruction php :
imagejpeg($img) , qui enverra l'image directement au navigateur.

Le contenu de l'image étant donc fixé au départ, je peux d'une part,
appeler dans le script initial, le script d'affichage par curl, et
d'autre part, après cet appel, supprimer l'enregistrement de cette
image, dans la base de données.

Chaque pronostic est généré juste avant son affichage, puis envoyé au
navigateur, puis effacé. Donc il est incopiable.

Le seul moyen de le copier, dans ce cas, est d'utiliser un navigateur
ou à la rigueur un sniffeur de site. Mais... Comment sélectionner la
partie purement image dans un affichage, dans le contenu rendu par un
sniffeur ( wget, ou curl, ou... ), sans que cet affichage n'ait aucun
correspondant textuel ?

Merci beaucoup de vos réponses.

Amicalement.

Jean-François Ortolo
Avatar
Olivier Miakinen
Le 30/07/2010 10:00, Denis Beauregard répondait à Jean-François Ortolo :

D'un autre côté, tu peux représenter ton image sous forme d'une série
d'images de 1 pixel de haut, images nommées aléatoirement et dont
l'ordre est donné par le script ci-dessus.



:-D

Par curiosité, j'aimerais bien voir le résultat en grandeur nature pour
compter par combien d'ordre de grandeurs ça multiplie la taille de
l'image (et le temps de transfert) !

Comme on utilise du javascript pour voir le résultat, tu peux
désactiver certaines fonctions du navigateur. Par contre, le
bouton "imprimer écran" ne peut pas être désactivé. Au mieux, tu
diminueras le nombre d'utilisateurs pouvant recopier le contenu mais
ce ne sera jamais "aucun" et rien n'empêche un débutant d'apprendre
à utiliser le bouton du clavier pour imprimer l'écran !



Oui. D'autant plus que la fonction de copie d'écran existe en dehors
même du navigateur.

Ceci dit, je sais qu'on peut utiliser Flash pour remplir l'écran au
complet,



Aaaargh ! Et tu crois qu'un tel site peut conserver des visiteurs ?

donc il ne reste plus de bouton sur le navigateur. Mais
Flash est installé dans le navigateur et pour obtenir le même
résultat en bloquant un bouton du clavier, il faudrait d'un côté
avoir beaucoup de connaissances en programmation, et de l'autre,
obliger l'utilisateur à installer un tel plug-in.



Encore une fois, puisque Flash ne peut pas contrôler ce qui se passe en
dehors du navigateur, il ne peut pas bloquer la copie d'écran.

De toutes façons, ces idées sont indépendantes du PHP et devraient
être étudiées dans les forums appropriés.



ÀMHA, il n'y a rien qui mérite d'être étudié dans cette direction
puisque toute idée est forcée d'échouer. Autant rester ici jusqu'à
l'épuisement du fil qui ne devrait pas tarder.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Bonjour,

Le 30/07/2010 12:45, Jean-Francois Ortolo a écrit :

Finalement... Le seul problème pour moi, est que l'affichage soit
fait de telle manière, que l'identificateur ( aléatoire ) du script
d'affichage, ne soit pas visible dans le source.



Si ce n'est que ça, tu peux toujours y mettre un identificateur non
aléatoire (incrémenté de 1 à chaque fois) et garder sur le serveur une
liste de correspondance entre les deux. ;-)

Pour celà, il me suffit tout simplement, au lieu d'utiliser une
balise <im src="url_script?param=value" /> dans le script appelant, de
simplement positionner dans le script d'affichage, l'instruction php :
imagejpeg($img) , qui enverra l'image directement au navigateur.



Tiens, voici un essai : <http://www.miakinen.net/tmp/data_uri/>.
Regarde à quoi ressemble le code HTML généré (Ctrl+U avec les
navigateurs Gecko sur Windows).

Tu peux voir le code source PHP en rajoutant le paramètre show=source :
<http://www.miakinen.net/tmp/data_uri/?show=source>. Comme tu peux le
constater, l'image est bien générée à la volée par imagejpeg().

Le contenu de l'image étant donc fixé au départ, je peux d'une part,
appeler dans le script initial, le script d'affichage par curl, et
d'autre part, après cet appel, supprimer l'enregistrement de cette
image, dans la base de données.



Pas de problème pour supprimer l'image juste après génération, même
avant de l'encoder en Base64.

Chaque pronostic est généré juste avant son affichage, puis envoyé au
navigateur, puis effacé. Donc il est incopiable.



On ne doit pas avoir la même définition d'« incopiable », mais peu importe.

Le seul moyen de le copier, dans ce cas, est d'utiliser un navigateur



Gniii ? Tes visiteurs n'utilisent pas un navigateur ?

ou à la rigueur un sniffeur de site. Mais... Comment sélectionner la
partie purement image dans un affichage, dans le contenu rendu par un
sniffeur ( wget, ou curl, ou... ), sans que cet affichage n'ait aucun
correspondant textuel ?



Là je n'ai strictement rien compris. Je soupçonne que ce soit toi qui
n'aies pas une idée très claire des mécanismes mis en jeu lors de
l'affichage d'une page HTML qui contient des images, mais je me trompe
peut-être et je te présente mes excuses si ce n'est pas le cas.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 30/07/2010 15:22, je répondais à Jean-François Ortolo :

Tiens, voici un essai : <http://www.miakinen.net/tmp/data_uri/>.
Regarde à quoi ressemble le code HTML généré (Ctrl+U avec les
navigateurs Gecko sur Windows).

Tu peux voir le code source PHP en rajoutant le paramètre show=source :
<http://www.miakinen.net/tmp/data_uri/?show=source>. Comme tu peux le
constater, l'image est bien générée à la volée par imagejpeg().



Un nouvel essai, où l'on voir que pour une image simple comme celle-ci
le format PNG est six fois plus efficace que le format JPEG :
<http://www.miakinen.net/tmp/data_uri/index2>
<http://www.miakinen.net/tmp/data_uri/index2?show=source>

Tu devrais faire l'essai toi aussi, surtout si tu veux intégrer l'image
dans le code HTML (ce qui multiplie sa taille par 4/3).

Cordialement,
--
Olivier Miakinen
Avatar
Mickael Wolff
Le 30/07/2010 09:00, Denis Beauregard a écrit :

D'un côté, je sais que le code de certains sites est à peu près
illisible. On a beaucoup de javascript, des variables avec 1 seul
caractère, des instructions sous forme de chaînes, genre
a="eygvqewugcdasilb238dg9vbf9b" et le script construit le résultat
à partir de cette chaîne. Il me semble avoir vu des trucs de la
sorte chez Yahoo (dans le processus de création d'un compte), l'idée
étant pour eux de se protéger contre les robots).



Le but recherché n'est pas de se protéger des robots. Le but est
d'économiser de la bande passante, et de réduire le temps d'exécution
côté client. Ceci dit, ls scripts ne sont pas directement codés dans
leur version « compressée ». Un bon exemple est
<http://code.jquery.com/jquery-1.4.2.js> qui devient
<http://code.jquery.com/jquery-1.4.2.min.js> (plus lisible-- mais si :o) ).

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Jean-Francois Ortolo
Le 30/07/2010 15:22, Olivier Miakinen a écrit :
Bonjour,


Si ce n'est que ça, tu peux toujours y mettre un identificateur non
aléatoire (incrémenté de 1 à chaque fois) et garder sur le serveur une
liste de correspondance entre les deux. ;-)






Bonjour Monsieur

Je désirerais déclencher ce script d'affichage par Javascript, qu'il
donne le pronostic comme image ou bien contenu textuel.

Si le paramètre est incrémenté de 1 à chaque fois ( à chaque
lancement de la page initiale ), comment faire pour que le paramètre
n'ait pas besoin d'être transmis dans l'url de lancement ( par
Javascript, donc dans le source ), au script d'affichage, tout en
faisant en sorte, que ce script d'affichage connaisse la valeur de ce
paramètre incrémenté, pour qu'il puisse sélectionner le pronostic dans
la bdd ?

Je pourrais envisager un sémaphore, mais je ne sais faire de
sémaphore qu'avec un fichier verrou, et un fichier sémaphore, sémaphore
dont voici le shéma :


- Verrouillage en écriture du fichier de verrou ( toujours le même
fichier ).
- Attendre tant que fichier sémaphore existe.
- Ecriture du fichier sémaphore, avec l'identificateur incrémenté.
- Déverrouillage du fichier verrou.
- Déclenchement du script Javascript lançant le script d'affichage.
- Le script d'affichage à la fin, supprime le fichier sémaphore.

Problème : Supprimer le fichier sémaphore dans tous les cas ( si
le lancement du script d'affichage échoue, ou si Javascript n'est pas
activé sur le navigateur ), et avaec un timing adéquat pour qu'il n'y
ait pas trop de délais d'attente entre processus concurrents.

Autre problème : Il est possible de lancer à distance le script
d'affichage connaissant l'identificateur, juste au moment où il devrait
être lancé en javascript.


Conclusion : Il faudrait pouvoir savoir en php, si Javascript est
activé ou non sur le poste client, sans possibilité pour fausser le
résultat de ce test par le poste client. Bien entendu c'est impossible.


Le problème du sémaphore, serait de pouvoir enregistrer la valeur de
l'identificateur de manière non visible ( dans la bdd mettons ) avec le
pronostic, et adopter un type de sémaphore qui permette de désactiver le
sémaphore en amont si Javascript n'est pas activé sur le poste client.

A ce moment-là, le sémaphore ne serait activé que si Javascript est
activé sur le poste client, et aussi l'enregistrement du pronostic avec
l'identificateur incrémenté dans la bdd, n'aurait lieu que si Javascript
est activé.

Dans ces conditions, il suffirait que le script d'affichage
sélectionne dans la bdd, le pronostic d'identificateur maximal, il n'y
aurait pas besoin de transmettre cet identificateur à ce script, il
resterait inconnu du poste client ( pas dans le source ), et il serait
impossible de sniffer le pronostic, si Javascript n'est pas activé..

Merci beaucoup de vos réponses.

Amicalement.

Jean-François Ortolo
1 2