proteggere foto con watermark da accessi tramite $_GET['']

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Salve,

Sono nuovo del forum e vorrei un aiuto; mi sono imbattuto in un problema serio, nel senso che mettendo un watermark su delle immagini contenute in una cartella "immagini", ecco che però poi passando il file .php che fa questo, che ho chiamato watermark.php, come argomento al tag HTML <a> </a> con parametro in GET così:

<p><a href="watermark.php?url=immagini/cagnoline.jpg"><img src="thumbnail.php?url=immagini/cagnoline.jpg" alt="" /></a></p>

succede che, ovviamente, se un utente smaliziato volesse accedere a questa foto digitando nella barra degli indirizzi direttamente l'URL della foto, il watermark NON viene applicato!!!!
.

cioè, per capirci meglio se scrivo sulla barra di Mozilla Firefox - faccio questo esempio in locale:

http://localhost/mio_sito_locale/immagini/cagnoline.jpg

ecco che appare la mia foto SENZA NESSUN WATERMARK!

Allora per ovviare alla cosa, con Apache ho bloccato l'accesso diretto a questa ed altre foto, spostandole in una cartella che mi sono creato ad hoc, che ho chiamato "watermarked_images", creando all'interno della stessa, un file .htaccess con le seguenti direttive per bloccare a chiunque l'accesso alla medesima ed ai files ivi contenuti:

<Files *>
Order Allow,Deny
Deny from All
</Files>

Provando ORA ad accedere a qualunque immagine tramite il browser non ci si riesce più! Il file descritto sta facendo il suo mestiere!
Ovvero scrivendo sulla barra:
http://localhost/mio_sito_locale/watermarked_images/cagnoline.jpg

ecco che ottengo il famoso Error 403 di Accesso Negato, ( questo in locale, mentre sul mio sito, NON appare tale pagina, dovrei controllare il file .htaccess della root, ma comunque anche online, la foto scompare).

Ora perciò posso richiamare il file watermark.php così:

<p><a href="watermark.php?url=watermarked_images/cagnoline.jpg"><img src="thumbnail.php?url=immagini/cagnoline.jpg" alt="" /></a></p>

In effetti la soluzione funziona, ma poi leggendo qui http://httpd.apache.org/docs/2.2/howto/htaccess.html, che è il sito ufficiale di Apache leggo che per una serie di motivi indicati E' MEGLIO EVITARE DI CREARE TALI FILE .HTACCESS. all'interno di cartelle ecc.

Allora ecco il problema? Qualcuno mi sa dire come posso evitare di creare 'sti file .htaccess in cartelle che devo creare apposta, e suggerirmi una soluzione alternativa, SENZA MAGARI TOCCARE LA CONFIGURAZIONE DI APACHE?

Grazie e ciao.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
domanda stupida
ma perchè non applichi direttamente il watermark alle immagini che carichi?
nella cartella carichi solo le immagini "watermarkate" e, a casa, in una chiavetta o cd o quello che vuoi ti conservi gli originali

dimenticavo, dai un occhio a questi
https://www.mrw.it/php/articoli/aggiungere-proprio-watermark-immagine_735.html
https://www.mrw.it/script/jquery-image-watermark_1785.html
https://www.mrw.it/script/watermark-js_1872.html
forse trovi qualcosa che ti può servire senza passare dagli .htaccess
 
Ultima modifica:

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Innanzitutto grazie per le risposte; ecco quanto riporta il link http://httpd.apache.org/docs/2.2/howto/htaccess.html di Apache sull'uso dei file .htaccess che scoraggia assolutamente:

When (not) to use .htaccess files

In general, you should never use .htaccess files unless you don't have access to the main server configuration file. There is, for example, a prevailing misconception that user authentication should always be done in .htaccess files. This is simply not the case. You can put user authentication configurations in the main server configuration, and this is, in fact, the preferred way to do things.

.htaccess files should be used in a case where the content providers need to make configuration changes to the server on a per-directory basis, but do not have root access on the server system. In the event that the server administrator is not willing to make frequent configuration changes, it might be desirable to permit individual users to make these changes in .htaccess files for themselves. This is particularly true, for example, in cases where ISPs are hosting multiple user sites on a single machine, and want their users to be able to alter their configuration.

However, in general, use of .htaccess files should be avoided when possible. Any configuration that you would consider putting in a .htaccess file, can just as effectively be made in a <Directory> section in your main server configuration file.

There are two main reasons to avoid the use of .htaccess files.

The first of these is performance. When AllowOverride is set to allow the use of .htaccess files, Apache will look in every directory for .htaccess files. Thus, permitting .htaccess files causes a performance hit, whether or not you actually even use them! Also, the .htaccess file is loaded every time a document is requested.

Further note that Apache must look for .htaccess files in all higher-level directories, in order to have a full complement of directives that it must apply. (See section on how directives are applied.) Thus, if a file is requested out of a directory /www/htdocs/example, Apache must look for the following files:

/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess

And so, for each file access out of that directory, there are 4 additional file-system accesses, even if none of those files are present. (Note that this would only be the case if .htaccess files were enabled for /, which is not usually the case.)

The second consideration is one of security. You are permitting users to modify server configuration, which may result in changes over which you have no control. Carefully consider whether you want to give your users this privilege. Note also that giving users less privileges than they need will lead to additional technical support requests. Make sure you clearly tell your users what level of privileges you have given them. Specifying exactly what you have set AllowOverride to, and pointing them to the relevant documentation, will save yourself a lot of confusion later.

Note that it is completely equivalent to put a .htaccess file in a directory /www/htdocs/example containing a directive, and to put that same directive in a Directory section <Directory /www/htdocs/example> in your main server configuration:

.htaccess file in /www/htdocs/example:
Contents of .htaccess file in /www/htdocs/example

AddType text/example .exm
Section from your httpd.conf file

<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>

However, putting this configuration in your server configuration file will result in less of a performance hit, as the configuration is loaded once when Apache starts, rather than every time a file is requested.

The use of .htaccess files can be disabled completely by setting the AllowOverride directive to none:

AllowOverride None

Mi pare che più chiaro di così!.

Essendo autodidatta nella programmazione in PHP, sto studiando tale linguaggio server side per creare siti web, e sono arrivato nel mio studio all'uso delle librerie GD, con le quali si possono fare molte cose; creare thumbnails, applicare watermark ecc.

Ecco il motivo per il quale NON voglio ricorrere a GIMP o simili (uso UBUNTU e LINUX MINT) per applicare localmente dei watermark a delle foto, ma per motivi di studio, lo faccio dinamicamente con il PHP.

Grazie delle risposte, e comunque la guida di C. Garau indicata nel primo link, è una di quelle che ho seguito per il mio script.

Grazie e attendo news.
Ciao
 
Ultima modifica di un moderatore:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
La documentazione dice che l'uso dei file .htaccess è sconsigliato se hai accesso al file di configurazione del server. Tu non hai accesso al file di configurazione del server, e tale file di configurazione obbliga Apache a cercare comunque un .htaccess in ogni directory. In conclusione, per te usare o non usare il file .htaccess è del tutto indifferente: le performance subiscono comunque un calo. Quindi, tanto vale usarli.
 

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Ciao,

Allora non esistono vie alternative per bloccare a terzi l'accesso a foto contenute in directory , tramite il PHP, se non creando file .htaccess con quelle direttive nelle directory medesime?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
oppure (ma rognoso) salvare le immagini nel db in un campo blob
ma comunque con con cattura schermata o simili l'immagine si preleva almeno parzialmente
 

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Grazie per le risposte, ma vorrei evitare l'uso di un db per quello che desidero fare: vedrò se esistono funzioni del PHP che permettano il camuffamento degli URL.
Grazie comunque e alla prossima.
Ciao.
Vi faccio sapere se trovo qualcosa.
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
Io comunque non capisco la tua ostinazione nel non voler usare i file .htaccess. Sono usati dai più importanti progetti Web. Quelle nella documentazione di Apache sono linee guida: la differenza di performance è nulla, te l'ho già spiegato.
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Ma tu hai la necessità di caricare sul server anche le immagini senza il water-mark? Secondo me se proprio non è strettamente necessario potresti non caricarle sul server e mettere direttamente quelle modificate come diceva borgo.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
un'idea balzana (ma molto balzana), che non so se funzi e/o faccia il caso tuo
(alex non ridermi dietro)
cioè fai due pagine una col menù (es. menu.php)

PHP:
<p><a href="transito.php?a=0"><img src="thumbnail.php?url=immagini/cagnoline.jpg" alt="" /></a></p>
<p><a href="transito.php?a=1"><img src="thumbnail.php?url=immagini/gattine.jpg" alt="" /></a></p>
e una di reindirizzamento (es transito.php)
PHP:
<?php
ob_start();
$proviene=basename($_SERVER['HTTP_REFERER']);
$immagine=array('cagnoline.jpg','gattine.jpg');
/*
per ricavare in automatico senza scrivere ogni volta i nomi delle foto
$immagine=glob("immagini/*.jpg");
*/
if(isset($_GET['a']) && $proviene=="menu.php"){
	$indice=$_GET['a'];
	$vai_a="watermark.php?url=immagini/".$immagine[$indice];//forse ci vuole l'url assoluti http://www.sito......
	header("Location: $vai_a");
}else{
	header("Location: index.php");
}
ob_end_flush();
?>
se funzia poresti anche, quando carichi le immagini, creare tramite php le tumb (vedi articolo qui su mrwm) e metterele in una cartella apposita per cui i link diventano
PHP:
<p><a href="transito.php?a=0"><img src="thumb/tmb_cagnoline.jpg" alt="" /></a></p>
<p><a href="transito.php?a=1"><img src="thumb/tmb_gattine.jpg" alt="" /></a></p>
cosi mal che vada il furbetto si scarica un'immagine (es.) 100x100px
 

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Ciao,

Devo provare in locale la soluzione indicata, poi vi dico come va.
Intanto grazie e a presto.
Ciao.
 

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Ciao,

Ho provato il codice indicato, ma appare, come prima, l'immagine con il watermark, ma con il path completo, ovvero alla directory immagini/ che contiene appunto le foto SENZA watermatk, e perciò si può digitare benissimo nella barra degli indirizzi il path alla cartella che contiene le immagini, per ottenere la foto SENZA il watermark!

Va beh, vedo di trovare qualche via alternativa, poi vi dico.
Grazie e ciao.
 

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Ciao,

Riprendo questo mio post per chiedere aiuto sul mancato funzionamento dello script che indico sotto: seguendo il vostro consiglio, ho aggiunto al mio database, registrazione_utenti, in MySQL una tabella, dove poter caricare le immagini/foto del mio sito, che intendo far apparire con il watermark. La tabella è strutturata così:

CREATE TABLE tabella_files (id_file INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, nome_file VARCHAR(255), tipo_file VARCHAR(128), dati_file MEDIUMBLOB, PRIMARY KEY (id_file));

Infatti funziona perfettamente: per conservare il files immagini binari ho scelto correttamente un campo BLOB, qui MEDIUMBLOB, per avere anche foto un pò grandi.
Poi ho caricato delle immagini nella tabella, che infatti visualizzo correttamente con il seguente script, che ho adattato al mio sito web:

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
  
<head>
<?php
include("header.html");
?>

<title>Mostra file nel database</title>
<link rel="shortcut icon" href="favicon.ico"/>
<link rel="stylesheet" href="video.css" type="text/css" media="screen" />
<link rel="stylesheet" href="stampa.css" type="text/css" media="print" />
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="rss.xml" /> 

</head>

<body>
<?php
  if ( isset($_COOKIE['user']) )
    {
      include("struttura_sito_per_utenti_loggati.php");
    }
  else
    {
      include("struttura_sito.php");
    }

?>

<span class="grassetto">Clicca su uno dei seguenti file oppure</span> <span><a href="upload.php">torna indietro<a/></span>
<?php

// connessione e selezione del database
$connessione = mysql_connect("localhost", "root", "") or die(mysql_error());
$selezione_db = mysql_select_db("registrazione_utenti", $connessione) or die(msyql_error());  

// query per ottenere l'elenco dei files nel DB
$query = "SELECT * FROM tabella_files";

$risultato = mysql_query($query) or die('Query non valida: ' . mysql_error());

// se ci sono files nel DB
if(mysql_num_rows($risultato))
{
  // estrazione dei risultati e stampa dei links ai files
  while ($tmp = mysql_fetch_array($risultato))
  {
    //echo "<p><a href=\"show.php?id=$tmp[id_file]\">$tmp[nome_file]</a></p>\n";

  }
}
else
{
  echo '<p>Nessun file presente nel database</p>';
}
?>

<?php
  include("footer_per_non_stampare.html");
?>

</body>
</html>


Fin qui ok, infatti lo script show.php mostra le immagini correttamente, eccolo:

PHP:
<?php

// connessione e selezione del database
$connessione = mysql_connect("localhost", "root", "") or die(mysql_error());
$selezione_db = mysql_select_db("registrazione_utenti", $connessione) or die(msyql_error());

// query per recuperare il file
$query = "SELECT * FROM tabella_files WHERE id_file = " . $_GET['id'];

$risultato = mysql_query($query) or die('Query non valida: ' . mysql_error());

//creo un array associativo che chiamo $tmp
$tmp = mysql_fetch_array($risultato);

// invio una intestazione contenente il tipo MIME
header('Content-Type: ' . $tmp['tipo_file']);

// invio il contenuto del file
echo $tmp['dati_file'];

?>

Il problema sta quando io voglio applicare dinamicamente con PHP il watermark alle foto e poi farle apparire, perciò invece di show.php uso come rimando del link:

PHP:
    echo "<p><a href=\"show.php?id=$tmp[id_file]\">$tmp[nome_file]</a></p>\n";

questo:

PHP:
                echo "<p><a href=\"wt.mark.php?id=$tmp[id_file]\">$tmp[nome_file]</a></p>\n";

ovvero lo script wt.mark.php, dove ottengo questo errore:

Warning: imagecreatefromjpeg(fiore.jpeg) [function.imagecreatefromjpeg]: failed to open stream: File o directory non esistente in /opt/lampp/htdocs/sito_in_php_locale/wt.mark.php on line 40
Impossibile creare l'immagine

Spero di essermi spiegato abbastanza,anche se la questione appare complessa, va beh, auguri a tutti e grazie in anticipo.:crying:
Il codice dello script wt.mark.php è il seguente:

PHP:
<?php

	// connessione e selezione del database
	$connessione = mysql_connect("localhost", "root", "") or die(mysql_error());
	$selezione_db = mysql_select_db("registrazione_utenti", $connessione) or die(msyql_error());

	// query per recuperare il file
	$query = "SELECT * FROM tabella_files WHERE id_file = " . $_GET['id'];
	$risultato = mysql_query($query) or die('Query non valida: ' . mysql_error());

	//creo un array associativo che chiamo $tmp
	$tmp = mysql_fetch_array($risultato);	

	// immagine sorgente che deve essere firmata e
	// watermark per la firma	
	$source = $tmp['nome_file'];
	$my_symbol = 'immagini/jam1.gif';
	
	// ricavo il type dell'immagine sorgente
	$image_type = substr($source, strlen($source) - 4);
	$image_type = strtolower($image_type);

	// ricavo il type del watermark
	$watermark_type = substr($my_symbol, strlen($my_symbol) - 4);
	$watermark_type = strtolower($watermark_type);

	
	// estraggo i dati a seconda dell'immagine sorgente	
	switch ($image_type)
	{
		case '.png':
			$image_result = imagecreatefrompng($source);
		break;

		case '.gif':		
			$image_result = imagecreatefromgif($source);
		break;

		case '.jpg' || 'jpeg':
			$image_result = imagecreatefromjpeg($source);
		break;

		default:			
			die('Impossibile rilevare il formato dell\'immagine');		
	}	
	
	if (!$image_result)
	{
		die('Impossibile creare l\'immagine');
	}


	// faccio lo stesso per il watermark
	switch ($watermark_type)
	{
		case '.gif':
			$watermark_result = imagecreatefromgif($my_symbol);
		break;
		
		case '.png':
			$watermark_result = imagecreatefrompng($my_symbol);
		break;

		default:
			die('Impossibile rilevare il formato del watermark');
	}	

	if (!$watermark_result)
	{
		die('Impossibile creare il watermark');
	}	

	// estraggo le dimensioni dell'immagine
	$source_w = imagesx($image_result);
	$source_h = imagesy($image_result);

	// estraggo le dimensioni del watermark
	$watermark_w = imagesx($watermark_result);	
	$watermark_h = imagesy($watermark_result);

	//stabilisco le dimensione dell'output: così metto il watermark al centro.	
	//$dest_x =  ($source_w - $watermark_w) / 2; 
	//$dest_y =  ($source_h - $watermark_h) / 2;

	# se voglio, invece, metterlo in basso a sx:
	 $dest_x =  ($source_w - $watermark_w) - 5; 
	 $dest_y =  ($source_h - $watermark_h) - 5;
	
	// creo una nuova immagine identica all'originale, ma con sopra il watermark
	imagecopy($image_result, $watermark_result, $dest_x, $dest_y, 0, 0, $watermark_w, $watermark_h);	

	switch ($image_type)
	{
		case '.png':
			header('Content-type: image/png');
			imagepng($image_result);
			imagedestroy($image_result);
			imagedestroy($watermark_result);			
		break;

		case '.gif':
			header('Content-type: image/gif');
			imagegif($image_result);
			imagedestroy($image_result);
			imagedestroy($watermark_result);		
		break;

		case '.jpg' || 'jpeg':
			header('Content-type: image/jpeg');
			imagejpeg($image_result);
			imagedestroy($image_result);
			imagedestroy($watermark_result);			
		break;		
	}

?>
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
Il problema è semplice: lo script che dovrebbe applicare il watermark all'immagine non riesce a trovare il file originale. Per caso tieni le immagini in una sottocartella?

Un'altra cosa. Questa riga:
PHP:
$query = "SELECT * FROM tabella_files WHERE id_file = " . $_GET['id'];
È pericolosissima, perché consente a chiunque di cancellare l'intero database. Modificala così:
PHP:
$query = "SELECT * FROM tabella_files WHERE id_file = " . addslashes($_GET['id']);
 

Jam1

Nuovo Utente
11 Dic 2011
9
0
0
Ciao,

No il problema poi mi sono reso conto sta nel fatto che io salvo su db NON un'immagine "vera" , per così dire, bensì una stringa di info binaria per recuperare la quale devo usare NON i vari:
PHP:
imagecreatefrompng()
PHP:
imagecreatefromgif()
PHP:
imagecreatefromjpeg()

bensì
PHP:
imagecreatefromstring()

inoltre nello script wt.mark.php invece di scrivere quanto segue:

PHP:
// immagine sorgente che deve essere firmata e
    // watermark per la firma    
    $source = $tmp['nome_file'];
    $my_symbol = 'immagini/jam1.gif';

devo scrivere

PHP:
// immagine sorgente che deve essere firmata e
    // watermark per la firma    
    $source = $tmp['dati_file'];
    $my_symbol = 'immagini/jam1.gif';

cioè come indice/chiave dell'array associativo $tmp devo usare la stringa binaria, per quanto sopra.

Con tale modifiche infatti lo script funziona.
Anche se poi ho visto sul web che da quasi tutti viene sconsigliato il salvataggio di file immagini/foto su db per una serie di motivi.

Dicono che conviene salvare solo il path ovvero l'url alle immagini sul db, e trasferire le immagini con il solito FTP su normali cartelle.
Va beh, vedremo di salvare solo questo path alle immagini sul db.

Ci risentiamo al prossimo post, mi sa....
Non è per nulla semplice trovare subito una via d'uscita da tutte queste info che girano su Internet!!!
Ciao.
Alla prossima.
:byebye:
 
Discussioni simili
Autore Titolo Forum Risposte Data
B Come proteggere la casa durante i nostri lunghi viaggi Discussioni Varie 1
R [c#] Proteggere il codice dell'applicazione C/C++ 0
S [PHP] proteggere pagine PHP 10
B Proteggere cartella Apache ma non le sottocartelle!!! Apache 0
anton Proteggere un file con htaccess Apache 0
anton Proteggere un file su host HTML e CSS 9
S proteggere download dei file PHP 6
M proteggere un file testuale da accesso diretto PHP 4
G Proteggere le tabelle in access MS Access 0
P Sistema migliore per proteggere le immagini? Discussioni Varie 8
A Proteggere Cartella con .htaccess su Xoom.it Web Server 2
max_400 Proteggere i cookie PHP 7
M Proteggere PHP PHP 4
max_400 Proteggere login con autenticazione database PHP 19
maurodefilippis Software Per DRM per proteggere pdf ed epub Windows e Software 1
C Proteggere file sul server Apache 2
asevenx proteggere dati con password sicura PHP 8
max_400 Nascondere indirizzo o visualiz. un altro oppure Proteggere pagina php ricevente PHP 6
S [VB.NET] Proteggere le applicazioni .NET Framework 0
M [htaccess] Proteggere file con password Web Server 1
I proteggere le pagine internet PHP 25
M Proteggere più pagine con password PHP 12
R Proteggere una pagina di un sito con password PHP 23
G php - codice per proteggere le pagine PHP 10
M Proteggere un intero sito con .htaccess PHP 1
S Proteggere file e dati nel FTP Web Server 0
M come posso proteggere le mie immagini? Javascript 5
Z proteggere pagine Classic ASP 2
Maverick1000tt Proteggere pagina html HTML e CSS 2
M Proteggere una pagina con password usando ASP Classic ASP 6
C Come proteggere le immagini Webdesign e Grafica 1
D Proteggere immagini HTML e CSS 3
grottafelix Tutorial Asp: come proteggere le pagine Supporto Mr.Webmaster 6
peppoweb Proteggere PHP: guida passo passo PHP 0
S come vedere anteprime delle foto prima di mandarli al server Javascript 1
N spostare millimetricamente un pezzo di foto Photoshop 0
C Come caricare foto da google foto ad un sito? Discussioni Varie 1
F Estrarre ultima foto da cartelle PHP 2
S poblema rendering foto jpg dompdf PHP 1
C Presentazione foto WordPress 0
Tommy03 Scattare foto e mostrarla Sviluppo app per Android 0
L COLORE DETTAGLIO IN FOTO BIANCO E NERO - PHOTOSHOP Photoshop 0
F INDESIGN: problema esportazione esecutivo per la stampa con foto B/N Webdesign e Grafica 1
Alex_70 Delete foto in database e cartella PHP 72
L Scmporre una foto dotata di varie immagini in piu layer Photoshop 2
S Inserire foto in ogni cella di una tabella Javascript 0
P Upload foto cover e profilo jQuery 0
Alex_70 Visualizzare anteprima foto in dropdown PHP 2
K Presentazione di foto Photoshop 1
S [Photoshop] Nome di questo effetto (vedi foto) Photoshop 1

Discussioni simili