Adenina

Programmazione Problema nello script per aprire una directory

Recommended Posts

Buonasera a tutti :ciao:

Ho riscontrato il mio primo problema nell'utilizzo di php :(

Sto cercando di fare, a mo' di esercizio, un piccolo blog.

Nella fattispecie sto provando a realizzare un piccolo script per aprire una directory sul server (che contiene solo immagini) e visulizzarle su una pagina.

Manca l' if(isset($_POST['submit']) che aggiungerò in seguito. Per ora riaggiorno sempre la stessa pagina per capire se ci sono problemi.

<?php
$target_dir='Loghi/';

if ($handle = opendir($target_dir)) {
    while (false !== ($file = readdir($handle))) { 
        if ($file != "." && $file != "..") { 
			foreach ($file as $value){
			$ext=pathinfo($value,PATHINFO_EXTENSION);
        		switch($ext){
					case "jpg":
					$logo=imagecreatefromjpg($value);
					echo $logo."<br/>";
					break;
					case "png":
					$logo=imagecreatefrompng($value);
					echo $logo."<br/>";
					break;
					case "jpeg":
					$logo=imagecreatefromjpeg($value);
					echo $logo."<br/>";
					break;
				
				} 

			}
            
        } 
    }
    closedir($handle); 
}
?>

Il problema è (credo) nel foreach che ho ho evidenziato: mi dà due warning di questo tipo ''Warning: Invalid argument supplied for foreach()" e non riesco a comprendere il perché, dato che "readdir" dovrebbe darmi un array :(

Ad ogni modo, non mi compare nulla nella pagina (eccetto i warning) quindi penso che in generale ci sia qualcosa che non vada.

Sapete dirmi dove sbaglio? :fumopeo:

Ringrazio in anticipo :flower:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ciao Adenina,

levalo via quel foreach... serve poco. Non ricordo la sintassi dei vari imagecreatefromXXX magari mi rinfresco domani (adesso sto per staccare).

Per ora parti da questo come base e smanetta con le function che creano le immagini, domani cerco di ritagliarmi il tempo per darti una mano (sistema l'indentazione... il tag "code" fa i capricci...):

<?php
$path = "Loghi/";
if (is_dir($path)) {
  if ($dir = opendir($path)) {
    while (($file = readdir($dir)) !== false) {
      if ($file != "." && $file != "..") { 
        $ext=pathinfo($file,PATHINFO_EXTENSION);
    		switch($ext){
					case "jpg":
            echo "filename: $file | filetype: " . filetype($path . $file) . " | extension: $ext <br>";
  					break;
					case "png":
            echo "filename: $file | filetype: " . filetype($path . $file) . " | extension: $ext <br>";
  					break;
					case "jpeg":
            echo "filename: $file | filetype: " . filetype($path . $file) . " | extension: $ext <br>";
  					break;
				}             
			}
        }
        closedir($dir);
    }
}
?>

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ciao dk,

scusami se rispondo solo ora, ma non ho potuto prima :)

Ti ringrazio, intanto, per la risposta. Oggi non ho potuto lavorare allo script e non potrò nemmeno domani, ti fo sapere sicuramente lunedi :)

Grazie ancora :ciao:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

il ciclo while dovrebbe leggerti la cartella e durante la lettura ti assegna una variabile temporanea $file che contiene il nome del file. il foreach da errore perchè $file non è un array ma una stringa.

togli il foreach, e lo script dovrebbe funzionare... non ti assicuro che vada liscio (vedi libreria gd o imagik)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ciao, concordo con dk e bomale sul fatto della completa inutilità del foreach( tralaltro hai già messo un while ), inoltre c'è un altro problema, tu vai a leggere il nome dei file nella directory Loghi e fin qui tutto bene, poi però quando fai $logo=imagecreatefrompng($value)  gli stai passando solo il nome del file e non il percorso in cui è contenuto tale file e quindi vedrai che non te lo trova (amesso che le immagini siano nella directory loghi, ma mi è parso di aver capito cosi). Infine Imagecreatefrompng($value) non ti visualizza l'immagine ma un identificativo di quest'ultima (del tipo Resource id #5) anche se questo forse lo sapevi già, per visualizzare l'immagine bisogna fare altro XD.

 

Ti posto qui il codice completo cosi basta che lo copincolli e va.

<?php$target_dir='Loghi/'; if ($handle = opendir($target_dir)) {    while ( ($file = readdir($handle)) !== false ) {         if ($file != "." && $file != "..") { $ext = pathinfo($file,PATHINFO_EXTENSION);         switch($ext){case "jpg":$logo=imagecreatefromjpg($target_dir.$file);echo $logo."<br/>";break;case "png":$logo=imagecreatefrompng($target_dir.$file);echo $logo."<br/>";break;case "jpeg":$logo=imagecreatefromjpeg($target_dir.$file);echo $logo."<br/>";break; }                       }     }    closedir($handle); }?>

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Buongiorno a tutti :ciao:

Inanzitutto grazie per le vostre risposte :flower:

In realtà il foreach all'inizio non l'avevo messo, solo che nello script iniziale, mi dava un errore (mi pare un fatal error) sull'imagecreatefromjpg e non riuscivo a capire perché :(

Ho pensato che forse stavo passando alla funzione un'array e non una stringa. Ho allora provato ad inserire il foreach ottenendo così due warning, ma non un fatal error. Ho pensato quindi di essere sulla strada giusta :boh: Il problema sta forse effettivamente nel fatto che "gli stai passando solo il nome del file e non il percorso in cui è contenuto tale file e quindi vedrai che non te lo trova", come diceva Crowder :sisi: Lunedì mi ci rimetto :sisi: grazie ancora :ciao:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Buonasera,

ho risolto con uno script molto più semplice (prima non ci avevo pensato :qwo:).

Insomma, mando semplicemente le immagini a video e le ridimensiono tutte della stessa misura tramite css.

Non so se è il modo corretto per farlo, però funziona :sisi:

 

Posto il codice:

<?php
ob_start();
?>
<html>
<head>
	<title>Pagina Banner</title>
	<meta charset="UTF-8">
	<meta name="description=" content=""></meta>
	<link href="style.css" type="text/css" rel="stylesheet">

</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<?php
$target_dir='Loghi/';
if ($handle = opendir($target_dir)) {
    while (false !== ($file = readdir($handle))) { 
        if ($file != "." && $file != "..") { 
        	echo "<img class='banner'src='".$target_dir.$file."' alt='banner-libriromantici'/><input type='radio' name='immagine' value='".$file."'></input> <br/>";
        	$ck_expire=time()+ 100*365*24*60*60;
			setcookie('logoutente1',$file,false, '/', false);
             
}
}
closedir($handle); 
}
ob_end_flush();
?>
<input id="submit" name="submit" type="submit" value="Invia">
</form>
<a class="comeback2" href="index.php">Vai alla homepage</a>
<?php
if((isset($_POST['submit'])) && (isset($_COOKIE['logoutente1']))){
	echo "<div class='comeback2'>L'immagine è stata caricata con successo!</div>";
	}
?>
</body>
</html>

Ho aggiunto un pezzettino per settare un cookie (ho settato un tempo di scadenza che non uso, in locale non serve, ma lo lascio lì per il fututo :bho:)  che riprendo in un'altra pagina.

 

In realtà, nella pagina in cui riprendo il cookie, me ne arriva anche un altro.

Vorrei ora dire al mio script: "se l'utente ha scelto il logo tramite questo metodo usa la variabile 1 altrimenti usa la variabile 2"

Qualcosa tipo:

<?php
$folder='Loghi/';
$logo=$folder.'21.jpg';
if(isset($_COOKIE['logoutente'])){
	$logo_utente=$_COOKIE['logoutente'];
	$logo=$folder.$logo_utente;
}
if(isset($_COOKIE['logoutente1'])){
	$logo_utente1=$_COOKIE['logoutente1'];
	$logo=$folder.$logo_utente1;

}
?>
<a href="index.php"><img id="logo" src="<?php echo $logo; ?>" alt=""/></a>

Ma non so come fare, né, se è concettualmente sbagliato usare due cookie (e temo di sì).  Vorrei poterli non usare, ma non so come gestire altrimenti la questione. Le sessioni non vanno bene, perché quando spengo e riaccendo il server non tiene memoria di ciò che avevo selezionato (come immagine) la volta precendete.

 

Edit: ho constatato che il  "setcookie('logoutente1',$file,false, '/', false);" mi setta, nel cookie, sempre la stessa immagine anche se dovrebbe cambiare a seconda dell'opzione scelta e non comprendo perché :qwo:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Edit: ho constatato che il  "setcookie('logoutente1',$file,false, '/', false);" mi setta, nel cookie, sempre la stessa immagine anche se dovrebbe cambiare a seconda dell'opzione scelta e non comprendo perché :qwo:

hai messo il setcookie nel modulo che genera le scelte... ma non quando viene inviata la richiesta :P

ovvero occorre modificarlo in:

 

<?phpob_start();?><html>	<head>		<title>Pagina Banner</title>		<meta charset="UTF-8">		<meta name="description=" content=""></meta>		<link href="style.css" type="text/css" rel="stylesheet">	</head>	<body>		<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">			<?php			$target_dir = 'Loghi/';			if ($handle = opendir($target_dir))			{				while (false !== ($file = readdir($handle)))				{					if ($file != "." && $file != "..")					{						echo "<img class='banner' src='" . $target_dir . $file . "' alt='banner-libriromantici'/><input type='radio' name='immagine' value='" . $file . "'></input> <br/>";					}				}				closedir($handle);			}			ob_end_flush();			?>			<input id="submit" name="submit" type="submit" value="Invia">		</form>		<a class="comeback2" href="index.php">Vai alla homepage</a>		<?php		if (isset($_POST['submit']) && !empty($_POST['immagine']))		{			$ck_expire = time() + 100 * 365 * 24 * 60 * 60; //100 ANNI?? davvero waaoo			setcookie('logoutente', $_POST['immagine'], $ck_expire, '/', false);			echo "<div class='comeback2'>L'immagine è stata caricata con successo!</div>";		}		?>	</body></html>
e poi

<?php$folder		= 'Loghi/';$img		= isset($_COOKIE['logoutente']) ? $_COOKIE['logoutente'] : '21.jpg'; //operatore ternario$logo		= $folder.$img;?><a href="index.php"><img id="logo" src="<?php echo $logo; ?>" alt=""/></a>

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Grazie capo, gentilissimissimo :laaa1: Avevo provato a seguire questa via, ma poiché usavo $file nel setcookie mi dava errore :sisi: Dopo sostituisco, grazie ancora :sisi:

 

//100 ANNI?? davvero waaoo

 

:asd:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Giusto per la forma, mi pare che da PHP 5.3 in avanti si possa anche abbreviare le dichiarazioni ternarie:

<?php
$folder		= 'Loghi/';
$img		= isset($_COOKIE['logoutente']) ?: '21.jpg'; //operatore ternario
$logo		= $folder.$img;
?>
<a href="index.php"><img id="logo" src="<?php echo $logo; ?>" alt=""/></a>

E' solo una finezza niente di utile al funzionamento...

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ri-salve a tutti :ciao:

Purtroppo la versione di bomale non andava bene (grazie cmq bomale!!), perciò ho riscritto e risistemato lo script e ora pare che vada :sisi:

Metto la versione finale per completezza (anche se non so se qualcuno è interessato :p )

 

Adesso ho solo due pagine:

 

index.php

<?php
session_start();
?>
<html>
		<head>
			<title>Libri</title>
			<meta charset="UTF-8">
			<meta name="description" content=""></meta>
			<meta name="author" content="">
			<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
			<link href="style.css" rel="stylesheet" type="text/css">
		</head>
	<body>
		<?php
	$folder		= 'Loghi/';
if(isset($_POST['submit1'])){
	$_SESSION['logoutente']=$folder.$_POST['immagine'];
} 

if(isset($_SESSION['logoutente'])){
	$logo=$_SESSION['logoutente'];
}else {
	$logo=$folder."papaveri1.jpg";
}
	?>

		<div id=header>
			<a href="index.php"><img id="logo" src="<?php echo $logo; ?>" alt=""/></a>
		</div>
			<div id="change_logo"> 
			<form action='openlogo.php' method="POST" enctype="multipart/form-data" name="form1">
			<span class="bold">Carica Logo</span>
			<input type="hidden" name="MAX_FILE_SIZE" value="1048576">
			<input name="userfile" type="file">
			<input type="submit" name="submit" value="Inserisci Logo">
			<button type="reset">Pulisci</button><br/>
			</form>
			<form action='openlogo.php' method="POST" name="form2">
			<span class="bold">Seleziona un'immagine già caricata</span>
			<input type="submit" name="submit2" value="Sfoglia...">
			</form>
		</div>	

e openologo.php

<html>
<head>
	<title>Pagina Banner</title>
	<meta charset="UTF-8">
	<meta name="description=" content=""></meta>
	<link href="style.css" type="text/css" rel="stylesheet">

</head>
<body>
<form method="POST" action="index.php">
<?php
$homepage= '<a id="comeback" href="'.$_SERVER['HTTP_REFERER'].'">Torna alla pagina precedente</a>';
if(isset($_FILES['userfile'])){
	$target_dir='C:/Users/****/Documents/offline/htdocs/libri/Loghi/';
	$img_temp=$_FILES['userfile']['tmp_name'];
	$img_name=$_FILES['userfile']['name'];
	$img_type=$_FILES['userfile']['type'];
	$img_size=$_FILES['userfile']['size'];
	

	if($img_size > 1048576){
		echo "L'immagine caricata è troppo grande </br>";
		echo $homepage;
	} elseif (file_exists($target_dir . basename($img_name))){
		echo "L'immagine caricata è già esistente. </br>";	
		echo $homepage;
	} elseif (($img_type!= "image/png")&&($img_type!= "image/jpg")&&($img_type!= "image/jpeg")) {
		echo "Solo le estensioni .jpg, .png e .jpeg sono ammesse. </br>";
		echo $homepage;
	} else {
	if((move_uploaded_file($img_temp, $target_dir.$img_name))){
		echo "L'immagine è stata caricata con successo. </br>";
		echo "<input type='hidden' name='immagine' value='".$img_name."'> </br><input id='submit' name='submit1' type='submit' value='Inserisci Logo'>";
	} else {
		echo "Non è stato possibile caricare l'immagine.";
		}
	}
} elseif (isset($_POST['submit2'])){
$target_dir='Loghi/';
if ($handle = opendir($target_dir)) {
    while (false !== ($file = readdir($handle))) { 
        if ($file != "." && $file != "..") { 
        	echo "<img class='banner'src='".$target_dir.$file."' alt='banner-libri'/><input type='radio' name='immagine' value='".$file."'><br/>";
}
}
closedir($handle); 
} echo "<input id='submit' name='submit1' type='submit' value='Inserisci Logo'>";
  echo '<a id="comeback" href="'.$_SERVER['HTTP_REFERER'].'">Annulla</a>';;
}
?>
</form>
</body>
</html>

Solo una precisazione: quando riaggiorno la homepage (index.php) Firefox mi chiede sempre se voglio ritrasmettere i dati. Come posso evitarlo?

 

Grazie ancora a tutti, siete stati davvero gentilissimi! :ciao::flower:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Stavolta faccio in tempo a rispondere. u.u
 
Il problema nasce dal fatto che invii tramite POST da openlogo.php a index.php la nuova immagine, facendo in modo che un reload della pagina (dalla index) abbia bisogno di inviare nuovamente tali informazioni. Quindi possiamo evitare di andare alla index.php e lavorare solo sull'altra pagina, avvalendoci delle sessioni che già stai usando e lo facciamo per sfruttarle appieno, ovvero condividendo informazioni tra le varie pagine PHP.
 
index.php

<?phpsession_start();?><html>		<head>			<title>Libri</title>			<meta charset="UTF-8">			<meta name="description" content=""></meta>			<meta name="author" content="">			<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>			<link href="style.css" rel="stylesheet" type="text/css">		</head>	<body>				<?php			if(isset($_SESSION['logoutente']))				$logo = $_SESSION['logoutente'];			else {				$folder = 'Loghi/';				$_SESSION['logoutente']	= $folder."papaveri1.jpg";				$logo = $_SESSION['logoutente'];			}		?>		<div id=header>			<a href="index.php"><img id="logo" src="<?php echo $logo; ?>" alt=""/></a>		</div>			<div id="change_logo"> 			<form action='openlogo.php' method="POST" enctype="multipart/form-data" name="form1">			<span class="bold">Carica Logo</span>			<input type="hidden" name="MAX_FILE_SIZE" value="1048576">			<input name="userfile" type="file">			<input type="submit" name="submit" value="Inserisci Logo">			<button type="reset">Pulisci</button><br/>			</form>			<form action='openlogo.php' method="POST" name="form2">			<span class="bold">Seleziona un'immagine già caricata</span>			<input type="submit" name="submit2" value="Sfoglia...">			</form>		</div> 


 
openlogo.php

<?php	session_start();?><html><head>	<title>Pagina Banner</title>	<meta charset="UTF-8">	<meta name="description=" content=""></meta>	<link href="style.css" type="text/css" rel="stylesheet"></head><body><form method="POST" action="openlogo.php"><?php$homepage= '<a id="comeback" href="'.$_SERVER['HTTP_REFERER'].'">Torna alla pagina precedente</a>';$target_dir = 'C:/Users/****/Documents/offline/htdocs/libri/Loghi/';if(isset($_FILES['userfile'])){	$img_temp=$_FILES['userfile']['tmp_name'];	$img_name=$_FILES['userfile']['name'];	$img_type=$_FILES['userfile']['type'];	$img_size=$_FILES['userfile']['size'];	if($img_size > 1048576){		echo "L'immagine caricata è troppo grande </br>";		echo $homepage;	} elseif (file_exists($target_dir . basename($img_name))){		echo "L'immagine caricata è già esistente. </br>";			echo $homepage;	} elseif (($img_type!= "image/png")&&($img_type!= "image/jpg")&&($img_type!= "image/jpeg")) {		echo "Solo le estensioni .jpg, .png e .jpeg sono ammesse. </br>";		echo $homepage;	} else {	if((move_uploaded_file($img_temp, $target_dir.$img_name))){		echo "L'immagine è stata caricata con successo. </br>";		echo "<input type='hidden' name='immagine' value='".$img_name."'> </br><input id='submit' name='submit1' type='submit' value='Inserisci Logo'>";	} else {		echo "Non è stato possibile caricare l'immagine.";		}	}} elseif (isset($_POST['submit2'])){	if ($handle = opendir($target_dir)) {	    while (false !== ($file = readdir($handle))) { 	        if ($file != "." && $file != "..") { 	        	echo "<img class='banner'src='".$target_dir.$file."' alt='banner-libri'/><input type='radio' name='immagine' value='".$file."'><br/>";		}		}		closedir($handle); 		} 		  echo "<input id='submit' name='submit1' type='submit' value='Inserisci Logo'>";		  echo '<a id="comeback" href="'.$_SERVER['HTTP_REFERER'].'">Annulla</a>';;}elseif(isset($_POST['submit1'])) {			$_SESSION['logoutente'] = $target_dir . $_POST['immagine'];	header('Location: index.php');}?></form></body></html> 


 
Ho fatto qualche modifica qua e là durante questo ed altri test, quindi ti lascio solo i file come me li ritrovo. :-P
 
Un paio di note importanti:

$target_dir = 'C:/Users/****/Documents/offline/htdocs/libri/Loghi/';

Meglio utilizzare un percorso relativo, ad esempio:

$target_dir = './Loghi/';

Mentre è praticamente sempre sconsigliato accedere direttamente ai valori degli array globali senza opportuni controlli e filtri:

$img_name=$_FILES['userfile']['name'];$_SESSION['logoutente'] = $target_dir . $_POST['immagine'];

Sono due esempi di vulnerabilità presenti nel codice che permettono a malintenzionati di sfruttare tali falle a diversi scopi. Prima di caricarlo su internet meglio informarsi su qualcosa di base sul fronte della sicurezza, fa sempre benissimo. ;)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

:ciao: scanetatore, ti ringrazio per la spiegazione e gli utili consigli !

Due cose:

 

 


 
Ho fatto qualche modifica qua e là durante questo ed altri test, quindi ti lascio solo i file come me li ritrovo. :-P
 
Un paio di note importanti:

$target_dir = 'C:/Users/****/Documents/offline/htdocs/libri/Loghi/';

Meglio utilizzare un percorso relativo, ad esempio:

$target_dir = './Loghi/';

Mentre è praticamente sempre sconsigliato accedere direttamente ai valori degli array globali senza opportuni controlli e filtri:

$img_name=$_FILES['userfile']['name'];$_SESSION['logoutente'] = $target_dir . $_POST['immagine'];

Sono due esempi di vulnerabilità presenti nel codice che permettono a malintenzionati di sfruttare tali falle a diversi scopi. Prima di caricarlo su internet meglio informarsi su qualcosa di base sul fronte della sicurezza, fa sempre benissimo. ;)

 

Per quanto riguarda la variabile $target_dir: avevo provato ad usare un percorso relativo, ma se non ricordo male, non funzionava e avevo letto che ( non ricordo però nemmeno se il problema era solo in locale o in genereale) era necessario scrivere il percorso assoluto  :qwo:

 

Per quanto riguarda invece il secondo punto, se ti va, potresti farmi degli esempi? :grat: non sono sicura di avere inteso quali controlli e filtri usare :)

Grazie ancora!!

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Non è necessario il percorso assoluto se si imposta tutto correttamente. ;) Già se utilizzi una sintassi simile a quella che ti ho proposto dovrebbe andare tutto correttamente, io non ho problemi né su Windows né su Linux.
 
Ok, cercherò di darti un paio di dritte, benché riduttive. Negli due esempi riportati si viene a creare una vulnerabilità XSS (e non solo), ovvero Cross-Site Scripting, una vulnerabilità diffusissima e difficile da individuare durante lo sviluppo. Praticamente, modificando opportunamente il nome dell'immagine da caricare o modificandolo andando ad intercettare l'invio dei dati del form prima che vengano spediti al server, possiamo caricare codice HTML/CSS/JavaScript arbitrario. Soprattutto quest'ultimo è utilizzato per i scopi più disparati e dipendenti dal contesto, generalmente per rubare i cookie amministrativi e avere accesso alle funzioni avanzate di un servizio. Un altro uso interessante è stato l'ultimo attacco, di qualche giorno fa, a MyBB (forum software) che sfruttando una vulnerabilità di questo tipo ha compromesso centinaia o migliaia di database in un colpo solo.

 

Ah, un esempio, giusto?

"><script>alert(1)</script>.jpg

 
Per difendersi la soluzione ideale è: filter on input, escape on output. Potresti usare diverse librerie, ad esempio HTML Purifier, per filtrare e funzioni come htmlspecialchars() per fare l'escape. Nel tuo caso penso che generalmente basti la seconda opzione visto che sei ancora alle prime armi. :)
 
L'altra volta non avevo provato e volevo esserne prima sicuro ma

elseif (($img_type!= "image/png")&&($img_type!= "image/jpg")&&($img_type!= "image/jpeg"))

non basta come controllo. Anche qui, mi basta sostituire tipo di risorsa che sto caricando con "image/jpg" e posso, di fatto, caricare qualunque tipo di file (Unrestricted File Upload). Un esempio potrebbe essere una shell PHP che mi permetta di operare come voglio sul tuo server e file, magari effettuando anche una Privilege escalation.

 

Ora, non spaventarti, gestisci solo delle immagini, ma ci son fin troppi siti vulnerabili in giro per una scarsa conoscenza in ambito di sicurezza. Magari queste informazioni ti torneranno utili in seguito o per chiunque passasse di qui. ;) *si sta togliendo del possibile lavoro con le proprie mani*

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Grazie infinite scanetatore! :)

Avevo letto qualche tempo fa una guida alla sicurezza in php, ma era generica e non lasciava intendere quando e come è necessario applicare delle misure di sicurezza :')

Essendo poi inespertissima, non sono in grado nemmeno autonomamente di capire e prevenire i malintenzionati :)

I tuoi consigli mi sono davvero utili e non posso che ringraziarti ulteriormente :)

 

Ps. bomale: attendo con ansia :D

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Sì, purtroppo per esperienza so che è lasciata molto in disparte. :) Ma una cosa per volta, intanto impara bene a programmare. ;)

 

E aspetto anch'io lo script di bomale per darci un'occhiata ma sono sicuro che sarà ben fatto. :susu:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

ho letto diversi articoli per l'upload dei file, ero sorpreso da alcuni plugin che potresti incorporare nello script come clamav (http://www.sitepoint.com/file-uploads-with-php/) per verificare all'istante della presenza di virus evitando di archittettare un tuo sistema di "criptaggio"/escape e che eventuali caratteri azionassero script malevoli...
Dovresti poi agire a livello del web server per restringere permessi (evitando privilege escalation)
anche lo script che ho purtroppo può essere "bucato" con un exploit (non ho testato) ma tramite una guida si potrebbe fugare ogni possibile inflitrazione.
usa nella configurazione php.ini quindi parametri come allow_url_fopen su off, e imposta un header Access-Control-Allow-Origin, infine come soluzione ultima basterebbe prendere dal nome del file solo i caratteri alfanumerici (non credo ti interessino gli spazi e simboli no?)
 
upload.php

<?phpheader('Access-Control-Allow-Origin: *');$settings	= array(	'width' 				=> 1280,	'height'				=> 768,	'size'					=> 7340032, //7MB = 7000000*1,024^2 (cerca su google)	'n_file'				=> 5,	'image_path'		=> realpath("../Upload_images").'/',	'url'					=> "Upload_images/",	'jpg_quality'		=> 70, //0 pessimo - 100 ottimo	'png_quality'		=> 9, // 0 nessuna compressione - 9 massima	'min_comp'		=> 307200, // Compressione dell'immagine se supera questo peso in B (307200 = 300 KB)	'not_ext_img'		=> array('4','5') //http://php.net/manual/it/function.exif-imagetype.php#refsect1-function.exif-imagetype-constants);if(isset($_REQUEST['bm_debug'])){echo json_encode(array_slice($settings, 0, 4), TRUE); exit;}if(!isset($_FILES["files"])){exit;}if(array_sum($_FILES["files"]['size']) > $settings['size']){echo json_encode(array(array('stato'=>'La somma dei file supera i '.($settings['size']/(1024*1024)).'MB')), TRUE); exit;}function reArrayFiles(&$file_post) {    $file_ary = array();    $file_count = count($file_post['name']);    $file_keys = array_keys($file_post);    for ($i=0; $i<$file_count; $i++) {        foreach ($file_keys as $key) {            $file_ary[$i][$key] = $file_post[$key][$i];        }    }    return $file_ary;}$files = reArrayFiles($_FILES['files']);if(count($files) > $settings['n_file']){echo json_encode(array(array('stato'=>'Hai superato il limite di file caricabili per volta('.$settings['n_file'].')')), TRUE); exit;}require_once( './kernel/classImage.php' ); //GRAZIE IPS, modificato per uso isolato (rimosso ipstext, e altre dipendenze)$array = array();foreach($files as $file){	$file['image_type'] = exif_imagetype($file["tmp_name"]);	if( $file['image_type'] && !in_array($file['image_type'], $settings['not_ext_img']) && ($file["size"] < $settings['size']) )	{		//Filter the file types , if you want.		if ($file["error"] > 0)		{			$array[] = array(				'stato'		=>	"Error: " . $file["error"]			);		}		else		{			$encoded_file = gmstrftime( "%Y_%m_%d-%H_%M_%S", time() ).'_'.substr( uniqid(), -5); //pathinfo(basename(preg_replace("/[^A-Z0-9._-]/i", "_",$file["name"])), PATHINFO_FILENAME)			$estensione = image_type_to_extension(exif_imagetype($file["tmp_name"]));			$nome = "http://".$_SERVER['SERVER_NAME']."/".$settings['url'].$encoded_file.$estensione;			$file_name = $encoded_file.$estensione;			$file_size_presente = @filesize($settings['image_path'].$file_name) ? filesize($settings['image_path'].$file_name) : 0;			$file_size_analizzato = filesize($file['tmp_name']);						//move the uploaded file to uploads folder;			// if(file_exists($settings['image_path'] . $file_name) && $file_size_analizzato == $file_size_presente)			// {				// $array[] = array(					// 'stato'		=>	"PRESENTE",					// 'risultato' 	=> 	$nome,					// /*'server'		=>	$_SERVER,					// 'size_caricato' => $file_size_analizzato,					// 'size_presente' => $file_size_presente*/				// );			// }			// else			if(move_uploaded_file($file["tmp_name"], $settings['image_path'] . $file_name))			{				$img = ips_kernel_image::bootstrap();				$attributes = $img->extractImageData( $settings['image_path'].$file_name );				if( $attributes['width'] > $settings['width'] || $attributes['height'] > $settings['height'] || $file_size_analizzato > $settings['min_comp'])				{					$settings['image_file'] = $file_name;					if ( $img->init( $settings ) )					{						$resize = $img->resizeImage( $settings['width'], $settings['height'], false, true );						$check = $img->writeImage( $settings['image_path'].$file_name );					}				}				unset($img);				$array[] = array(					'stato'		=>	"UPPATO",					'risultato' 	=> 	$nome,					/*'server'		=>	$_SERVER,*/					'size_caricato' => $resize ? filesize($settings['image_path'].$file_name) : $file_size_analizzato,					'size_presente' => $file_size_presente,					'resize'	=> $resize ? $resize : 0,					'scritto' => $check ? 1 : 0				);			}			else			{				$array[] = array(					'stato'		=>	"NON CARICATO, non hai il permesso di scrittura nella cartella \"{$settings['url']}\""				);			}	 		}	 	}	else{		$extra = "";		if(is_array($file)){			$extra = ", ";			$extra .= ($file["size"] >= $settings['size']) ? 'supera il limite di upload' : 'estensione non permessa';		}				$array[] = array(			'stato'		=>	'NESSUN FILE ANALIZZATO'.$extra		);	}}echo json_encode($array, TRUE);?>


codice html di "base", appena recupero la più recente versione la sostituisco(evitava le numerose richieste ajax).

<script type="text/javascript">!window.jQuery && document.write('<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"><\/script>');</script><script type="text/javascript">jQuery.noConflict();var jQ = jQuery.noConflict();</script><div class="ipsPad" id="bm_form">    <input name="bm_files[]" type="file" id="bm_files" class="input_text" multiple="multiple" />    <input type="button" class="input_submit" value="Upload" id="bm_submit" /><br />    <progress style="width:300px"></progress><span class="right" title="Conteggio dimensione file" id="bm_check"></span>    <div id="bm_status"></div></div><script type="text/javascript">var bm_size,bm_n_file,bm_ajax,script_url_php='http://image.tuosito.org/upload.php';jQ(document).ready(function(){    bm_n_file = getLimiti(5,'n_file');    bm_size = getLimiti(2048000,'size');    jQ('#bm_form').append('Limite upload: '+fileSize(bm_size));        jQ('#bm_submit').click(function(event){        var bm_check = 0;        var formData = new FormData();        if(jQ('#bm_files')[0].files.length > bm_n_file){jQ('#bm_status').prepend('<span style="color:red">Hai superato il limite di file caricabili per volta('+bm_n_file+')</span><br />'); return;}        for(var x=0;x<jQ('#bm_files')[0].files.length;x++){            if(jQ('#bm_files')[0].files[x].size < bm_size){                formData.append("files[]", jQ('#bm_files')[0].files[x]); bm_check+=jQ('#bm_files')[0].files[x].size;            }else{                jQ('#bm_status').prepend(jQ('#bm_files')[0].files[x].name+'(<strong>'+fileSize(jQ('#bm_files')[0].files[x].size)+'</strong>) - supera il limite di upload<br />');            }        }        jQ('#bm_check').text(bm_check ? fileSize(bm_check) : '0');        if(bm_check > bm_size){jQ('#bm_status').prepend('<span style="color:red">La somma dei file supera i '+fileSize(bm_size)+'</span><br />'); return;}        jQ.ajax({            url: script_url_php,            type: 'POST',            xhr: function() {  // Custom XMLHttpRequest                var myXhr = jQ.ajaxSettings.xhr();                if(myXhr.upload){ // Check if upload property exists                    myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // For handling the progress of the upload                }                return myXhr;            },            // Form data            data: formData,            crossDomain: true,            //Options to tell jQuery not to process data or worry about content-type.            cache: false,            contentType: false,            processData: false,            //Ajax events            success: function(t) {                try{                    t = JSON.parse(t);                    jQ.each( t, function(i,r) {                        if(r.stato == 'UPPATO'){                            if(r.resize != '0'){                                jQ('#bm_status').prepend('<span style="color:orange">'+r.risultato+' è stato ridimensionato in "larghezza":'+r.resize.newWidth+',"altezza":'+r.resize.newHeight+',"peso":'+(r.size_caricato > 0 ? fileSize(r.size_caricato) : 'indeterminato')+'</span><br />');                            }                            addEditor(r.risultato);                        }else if(r.stato == 'PRESENTE'){                            addEditor(r.risultato);                            //jQ('#bm_status').prepend('<span style="color:orange">'+r.risultato+'</span><br />');                        }else{                            jQ('#bm_status').prepend('<span style="color:red">'+r.stato+'</span><br />');                        }                    });                }                catch(e){                    console.log(e);                    console.log('errore script upload');                    console.log(t);                    }            },            error: function(jqXHR, textStatus, errorMessage) {                console.log(jqXHR, textStatus, errorMessage); // Optional            },        });    });    function progressHandlingFunction(e){        if(e.lengthComputable){            jQ('progress').attr({value:e.loaded,max:e.total});        }    }        function addEditor(m){        m = '<p>[img='+m+']</p>';        ipb.initDone ? ipb.editorInsert(m,ipb.textEditor.getCurrentEditorId()) : jQ('#bm_status').prepend('<span style="color:green">'+m+'</span>');    }        function getAjaxLimiti(){        return jQ.ajax({            url: script_url_php+'?bm_debug=1',            /*type: 'POST',            crossDomain: true,            cache: false,            contentType: false,            processData: false,*/            async: false,        });    }    function getLimiti(l, k){        var result = l;        if(jQ.type(bm_ajax) === 'object'){return bm_ajax[k] ? bm_ajax[k] : result;}        var t = getAjaxLimiti();        t.success(function (data) {            try{                data = JSON.parse(data);                bm_ajax = data;                result = data[k] ? data[k] : result;            }            catch(e){ console.log(data, e);}        });        return result;    }        function fileSize(size) {        var i = Math.floor(Math.log(size) / Math.log(1024));        return (size / Math.pow(1024, i)).toFixed(2) * 1 + '' +['B', 'kB', 'MB', 'GB', 'TB'][i];    }        jQ( "input:submit" ).click(function() {        jQ( "#bm_form" ).remove();    });    jQ('#bm_files').change(function() {        var bm_check = 0;        if(jQ('#bm_files')[0].files.length > bm_n_file){jQ('#bm_status').prepend('<span style="color:red">Hai superato il limite di file caricabili per volta('+bm_n_file+')</span><br />'); return;}        for(var x=0;x<jQ('#bm_files')[0].files.length;x++){            if(jQ('#bm_files')[0].files[x].size < bm_size){                bm_check+=jQ('#bm_files')[0].files[x].size;            }else{                jQ('#bm_status').prepend(jQ('#bm_files')[0].files[x].name+'(<strong>'+fileSize(jQ('#bm_files')[0].files[x].size)+'</strong>) - supera il limite di upload<br />');            }        }        jQ('#bm_check').text(bm_check ? fileSize(bm_check) : '0');        if(bm_check > bm_size){jQ('#bm_status').prepend('<span style="color:red">La somma dei file supera i '+fileSize(bm_size)+'</span><br />'); return;}    });});</script>


file kernel li trovate skillman92.altervista.org/nodzf/kernel.zip
 
funzione che usa ipboard per filtrare xss da una stringa:

	/*	 * @param string $txt	 * xssMakeJavascriptSafe( $txt ) 	*/	static public function xssMakeJavascriptSafe( $txt )	{		$txt = preg_replace( "/(j)avascript/i" , "\\1avascript", $txt );		$txt = preg_replace( '/(e)((\/\*.*?\*\/)*)x((\/\*.*?\*\/)*)p((\/\*.*?\*\/)*)r((\/\*.*?\*\/)*)e((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)i((\/\*.*?\*\/)*)o((\/\*.*?\*\/)*)n/is' , "\\1xp<b></b>ression"     , $txt );		$txt = preg_replace( '/(e)((\\\|\)*)x((\\\|\)*)p((\\\|\)*)r((\\\|\)*)e((\\\|\)*)s((\\\|\)*)s((\\\|\)*)i((\\\|\)*)o((\\\|\)*)n/is' 	  , "\\1xp<b></b>ression"     	  , $txt );		$txt = preg_replace( '/m((\\\|\)*)o((\\\|\)*)z((\\\|\)*)\-((\\\|\)*)b((\\\|\)*)i((\\\|\)*)n((\\\|\)*)d((\\\|\)*)i((\\\|\)*)n((\\\|\)*)g/is' 	  , "moz-<b></b>binding"     	  , $txt );		$txt = str_ireplace( "about:"     , "about:"         , $txt );		$txt = str_ireplace( "<body"      , "<body"            , $txt );		$txt = str_ireplace( "<html"      , "<html"            , $txt );		$txt = str_ireplace( "document." , "document."      , $txt );		$txt = str_ireplace( "window."   , "window."      , $txt );				$event_handlers	= array( 'mouseover', 'mouseout', 'mouseup', 'mousemove', 'mousedown', 'mouseenter', 'mouseleave', 'mousewheel',								 'contextmenu', 'click', 'dblclick', 'load', 'unload', 'submit', 'blur', 'focus', 'resize', 'scroll',								 'change', 'reset', 'select', 'selectionchange', 'selectstart', 'start', 'stop', 'keydown', 'keyup',								 'keypress', 'abort', 'error', 'dragdrop', 'move', 'moveend', 'movestart', 'activate', 'afterprint',								 'afterupdate', 'beforeactivate', 'beforecopy', 'beforecut', 'beforedeactivate', 'beforeeditfocus',								 'beforepaste', 'beforeprint', 'beforeunload', 'begin', 'bounce', 'cellchange', 'controlselect',								 'copy', 'cut', 'paste', 'dataavailable', 'datasetchanged', 'datasetcomplete', 'deactivate', 'drag',								 'dragend', 'dragleave', 'dragenter', 'dragover', 'drop', 'end', 'errorupdate', 'filterchange', 'finish',								 'focusin', 'focusout', 'help', 'layoutcomplete', 'losecapture', 'mediacomplete', 'mediaerror', 'outofsync',								 'pause', 'propertychange', 'progress', 'readystatechange', 'repeat', 'resizeend', 'resizestart', 'resume',								 'reverse', 'rowsenter', 'rowexit', 'rowdelete', 'rowinserted', 'seek', 'syncrestored', 'timeerror',								 'trackchange', 'urlflip',								);				foreach( $event_handlers as $handler )		{			$txt = str_ireplace( 'on' . $handler, 'on' . $handler, $txt );		}				return $txt;	}
Modificato da bomale
aggiornato html

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

 

ho letto diversi articoli per l'upload dei file, ero sorpreso da alcuni plugin che potresti incorporare nello script come clamav (http://www.sitepoint.com/file-uploads-with-php/) per verificare all'istante della presenza di virus evitando di archittettare un tuo sistema di "criptaggio"/escape e che eventuali caratteri azionassero script malevoli...

Dovresti poi agire a livello del web server per restringere permessi (evitando privilege escalation)

aggiungo un paio di cose.

 

per il discorso clamav si può integrarlo anche da server (impostando x esempio una scansione in cron ogni tot minuti..)

per la questione di evitare il privilege escalation secondo me la miglior soluzione è adottare suPHP e suExec.viene usato sopratutto su hosting condivisi con sopra cpanel. in questo modo se viene caricata una shell e viene compromesso solo un singolo dominio e non tutto il server.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
Ospite
Questa discussione è chiusa.