Discussion:
Comment afficher une image GD sans devoiler l e parametre du script ?
(trop ancien pour répondre)
Jean-Francois Ortolo
2010-07-29 22:58:00 UTC
Permalink
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.
Olivier Miakinen
2010-07-29 23:18:23 UTC
Permalink
Bonjour,
Post by Jean-Francois Ortolo
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.
Post by Jean-Francois Ortolo
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.
Post by Jean-Francois Ortolo
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
Denis Beauregard
2010-07-30 08:00:07 UTC
Permalink
Le 29 Jul 2010 22:58:00 GMT, Jean-Francois Ortolo
Post by Jean-Francois Ortolo
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
Olivier Miakinen
2010-07-30 10:45:38 UTC
Permalink
Post by Denis Beauregard
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) !
Post by Denis Beauregard
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.
Post by Denis Beauregard
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 ?
Post by Denis Beauregard
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.
Post by Denis Beauregard
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
Mickael Wolff
2010-07-31 19:08:16 UTC
Permalink
Post by Denis Beauregard
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
Yop
2010-07-30 08:00:07 UTC
Permalink
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']
Olivier Miakinen
2010-07-30 10:45:38 UTC
Permalink
Post by 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']
À 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
Jean-Francois Ortolo
2010-07-30 10:45:38 UTC
Permalink
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
Olivier Miakinen
2010-07-30 13:22:07 UTC
Permalink
Bonjour,
Post by Jean-Francois Ortolo
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. ;-)
Post by Jean-Francois Ortolo
Pour celà, il me suffit tout simplement, au lieu d'utiliser une
balise <im src="url_script?param=value" /> dans le script appelant, de
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().
Post by Jean-Francois Ortolo
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.
Post by Jean-Francois Ortolo
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.
Post by Jean-Francois Ortolo
Le seul moyen de le copier, dans ce cas, est d'utiliser un navigateur
Gniii ? Tes visiteurs n'utilisent pas un navigateur ?
Post by Jean-Francois Ortolo
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
Olivier Miakinen
2010-07-30 15:03:27 UTC
Permalink
Post by Olivier Miakinen
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).
<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
Jean-Francois Ortolo
2010-07-31 19:08:16 UTC
Permalink
Post by Olivier Miakinen
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
paskal
2010-08-12 20:08:08 UTC
Permalink
Post by Jean-Francois Ortolo
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.
Bonjour

Sauf si j'ai mal compris...tu pourrais passer ton identifacteur par une
variable de session entre la page qui affichera l'image et la page qui crée
l'image avec GD.

pascal
John GALLET
2010-08-13 16:39:43 UTC
Permalink
Bonjour,
Post by Jean-Francois Ortolo
J'aurais besoin d'afficher des données non copiables automatiquement,
Outre ce qui a déjà été dit, sur lequel je ne reviendrai pas, tout
dépend du niveau d'automatisation. Si les paramètres passés pour générer
l'image sont liés à une session elle même valable uniquement avec
login/pass, et donc qu'ils expirent avec la session mais qu'il faut
fournir les infos de login/pass pour l'avoir, ça réduit l'action
automatique de personnes extérieures, ça la trace, et ça peut même
rendre l'appel unique (jeton unique d'accès associé à une session
pouvant elle même être de jeton changeant rapidement).

En gros, il est totalement impossible d'empêcher quelqu'un de déterminé
de récupérer manuellement une information quelle qu'elle soit, mais on
peut lui mettre suffisamment de bâtons dans les roues pour dissuader et
le fliquer.

a++;
JG

Continuer la lecture sur narkive:
Loading...