Le script PHP tant attendu : protection des images

  • Auteur de la discussion Auteur de la discussion aladdin
  • Date de début Date de début
WRInaute passionné
bon voilà, j'ai netoyé mon code et tout et tout
et puis comme vous le savez (ou pas) le script n'est pas infaible ;)
Code:
<?php
/*
Auteur : Alaa-eddine KADDOURI (alaa.eddine[AT]gmail[d0T]com)
Ce script est inspiré du travail de Ladislav Soukup, [root@soundboss.cz]
(pour pas réecrire toute la partie qui fait le watermark, l'encodage ...etc :p)
///////////////////////////////////////////////////////////////
// ** Licence
// ce script est soumis à la licence gnu GPL ...etc ..etc je le connais pas par coeur
// mais vous connaissez la signification ... enfin j'espère
//
// Si vous utilisez ce scipt vous devez tout d'abord m'écrire un mail et choisir une option:
// - m'envoyer 2000euros pour m'acheter une nouvelle machine (je vous contacterez mon addresse :) )
// - faire un ptit lien vers ma page perso http://www.wonderworlds.net
///////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////
 ** Utilisation
 
Tout d'abord il faut désactiver le cache de la page avec les meta tags ...etc (consulter la partie failles connues)

puis en haut de votre page ajoutez
<?
session_start();
?>
...<votre code html ici>...
<? 
$_SESSION["img_path"]="rep/dans/lequel/se/trouve/l'image/";
$_SESSION["img"]="nom_de_votre_image";
?>
<img src="bg.php" />

...<suite de votre code html ici>...

pour leurrer un peut les utilisateurs novices, vous pouvez par exemple
afficher la vrai image (bg.php) en arrière plan d'un objet, et afficher dessus
une image transparante.

///////////////////////////////////////////////////////////////
 ** failles connues
 
* ce script n'est pas parfait (héé oui) mais on peut dire qu'il protège 
de 99% des tentatives voir plus et voici une liste des failles découvertes à ce jours (merci à tout les webmasters de WRI)

  - l'image peut etre récuperrer pendant un certain moment à partir du cache Internet explorer (car ce stupide navigateur ne respecte pas les entete no-cache ..etc)
  - les images peuvent etre récuperrés à l'aide du plugin webdevelopper de firefox
  - les images peuvent etre récuperré avec l'utilisation de la librairie curl (cf manuel php) (c'est la faille que je ne pourrai jamais corriger à mon avis)
  - le print screen, toute fois vous pouvez utilise ce petit script pour l'éviter (marche sous IE seulement):  
      entre <head></head> ajouteé
      		function ccb(){
				if(clipboardData){
				clipboardData.clearData();
				}}
				setInterval("ccb();", 20);

	  puis : 
	  		<body onLoad="ccb()">

	Attention, ce script empeche les utilisateur de faire les copier/coller aussi tan que la page contenant ce script est ouverte
	
vos remarques suggestions etc sont les bienvenus (alaa.eddine[AT]gmail[d0T]com)
///////////////////////////////////////////////////////////////////////////////
*/



/*Configuration*/
session_start();
$image_quality="100";
$image_path=$_SESSION["img_path"];
$logo_path="./logo.png";
$logo_pos_x="right";
$logo_pos_y="top";

// si l'image est introuvable on affiche ce texte
$error_not_found="Ouuups!!!";

global $Copyrights;
$Copyrights="Copyright tfosorcim à l'envers :p";

$error_not_supported="ce format d'image n'est pas supporté";


// couleur d'arrière plan de l'image generré en cas d'erreur
$error_bg_color=array(255,255,255);
// couleur du text
$error_text_color=array(255,0,0);



/*Rien à voir en bas de cette ligne*/
///////////////////////////////////////////////////////////////////////////////////////////////////////

function NewImage($width,$height,$text=""){
	global $error_bg_color,$error_text_color;
	if (function_exists("imagecreatetruecolor")){
		if (!@$img=imagecreatetruecolor($width,$height)){
			$img=imagecreate($width,$height);
		}
	} else {
		$img=imagecreate($width,$height);
	}
	$imgbgcolor=ImageColorAllocate($img,$error_bg_color[0],$error_bg_color[1],$error_bg_color[2]);
	$imgtextcolor=ImageColorAllocate($img,$error_text_color[0],$error_text_color[1],$error_text_color[2]);
	imagefilledrectangle($img,0,0,$width,$height,$imgbgcolor);
	imagestring($img,5,10,10,$text,$imgtextcolor);
	imagestring($img,5,10,30,"Copyright OujdaCity", 0);
	return($img);
}
header("Content-type: image/jpeg");

// Date du passé
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// toujours modifié
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Cache-Control : max-age=A1");
// HTTP/1.0
header("Pragma: no-cache");


$rep_from=array("./","../");
$rep_to=array("","",);

$_GET["img"]=str_replace($rep_from,$rep_to,$_SESSION["img"]);

$file=$image_path . $_GET["img"];
if (file_exists($file) && strcmp($_SESSION["generated"], "true") ){
	$info=getimagesize($file);
	$width=$info[0];
	$height=$info[1];
	if ($info[2]==1){
		$img=@imagecreatefromgif($file);
	} else if ($info[2]==2){
		$img=@imagecreatefromjpeg($file);
	} else if ($info[2]==3){
		$img=@imagecreatefrompng($file);
	} else {
		$width=640;
		$height=480;
		$img=NewImage($width,$height,$error_not_supported);
	}
} else {
	$width=640;
	$height=480;
	$img=NewImage($width,$height,$error_not_found);
}
if (file_exists($logo_path)){
	$info=getimagesize($logo_path);
	$logo_width=$info[0];
	$logo_height=$info[1];
	if ($info[2]==1){
		$img_logo=imagecreatefromgif($logo_path);
	} else if ($info[2]==2){
		$img_logo=imagecreatefromjpeg($logo_path);
	} else if ($info[2]==3){
		$img_logo=imagecreatefrompng($logo_path);
	} else {
		$logo_width=120;
		$logo_height=20;
		$img=NewImage($logo_width,$logo_height,$error_not_supported);
	}
	// positioning - X
	if ($logo_pos_x=="left"){
		$dst_x=10;
	} else if ($logo_pos_x=="center"){
		$dst_x=round(($width-$logo_width)/2);
	} else if ($logo_pos_x=="right"){
		$dst_x=$width-10-$logo_width;
	} else {
		$dst_x=round(($width-$logo_width)/2);
	}
	// positioning - Y
	if ($logo_pos_y=="top"){
		$dst_y=5;
	} else if ($logo_pos_y=="middle"){
		$dst_y=round(($height-($logo_height/2))/2);
	} else if ($logo_pos_y=="bottom"){
		$dst_y=$height-5-$logo_height;
	} else {
		$dst_y=round(($height-($logo_height/2))/2);
	}
	imagecopy($img,$img_logo,$dst_x,$dst_y,0,0,$logo_width,$logo_height);
}



session_write_close();
ImageJpeg($img,"",$image_quality);
?>


donc voilà, si vous avez des remarques ou des améliorations possible n'hésitez surtout pas
 
WRInaute passionné
heuuu .... je me suis peut etre trompé sur le titre ... il etait pas si attendu que ça :lol:

allez y dites moi qu'il pue mon code :cry: ....


MAIS REAGISSEZ KOA :evil:
 
WRInaute occasionnel
Ah tiens, sinon, un méthode qu'elle marche bien avec des gens qui ne connaissent pas trop le web (et qui est bonne pour le référencement) :

Code:
<h1><span>Descriptif de l'image</span></h1>

dans ta feuille de style :
Code:
h1 {width:XXXpx; height:ZZZpx; background:transparent url(/dossier/image.jpg) no-repeat top left;}
h1 span {display:none;}

C'est moins chiant qu'un script anti click droit et je t'assure que 80% des gens ne sauront pas la récupérer.

En plus tu optimises tes mots clé d'image :)

++
 
WRInaute passionné
c'est pas un script anti click droit que je présente là ;)
le code source reste claire, mais on ne peut pas récuperrer l'image meme si on tape son url dans le navigateur ;)



pour un petit aperçu vas ici http://www.oujdacity.net/pt, affiche une image en grand puis essai de la récuperrer ;)
 
WRInaute discret
En effet ça marche bien... mais c'est un peu trop compliqué pour moi et puis un imprim écran et l'affaire est réglée...
 
WRInaute occasionnel
En fait, y a 3 choses :

1- tu empêches la mise en cache.

2- tu empêches la fonction "enregistrer sous" en disposant une image transparente avec un z-index supérieur

3- tu fais un script serveur pour empêcher le téléchargement direct.

C'est pas mal

++
 
WRInaute passionné
pour empecher le impr écrant il faut faire ça (marche sous IE seulement) :
ce code
Code:
function ccb(){ 
            if(clipboardData){ 
            clipboardData.clearData(); 
            }} 
            setInterval("ccb();", 20);

dans le head

puis dans body
Code:
 <body onload="cbb()"> 
     ...

mais ça marche qu'avec IE, et qu'avec le impr écran (pas avec les autres logiciels de capture)
 
WRInaute passionné
herveG a dit:
Question : en empêchant la mise en cache, est ce que cela a des répercussions sur le réf ?


la mise en cache dont je parle ici et celle du navigateur, donc coté client, donc elle n'a aucune répercution sur le réferencement
 
WRInaute occasionnel
C'est bien mais... et le referencement dans tout ça?

Si tu as une galerie de photos avec le meme nom et quasi tout le temps les memes dimensions -> duplicate content - meme en generant des alt differents ca risque d'etre chaud

En plus si tu ouvres une session tous tes liens auront des ids de sessions ce qui va decourager le moteur pour indexer ton site (cette partie là est facile à corriger mais pas la premiere)
 
Discussions similaires
Haut