<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Il blog di webEngine &#187; Script</title>
	<atom:link href="http://blog.webeng.it/category/script/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.webeng.it</link>
	<description>Blog dedicato alle tecnologie Web e alle notizie dal mondo della rete...</description>
	<lastBuildDate>Thu, 17 Dec 2009 13:07:15 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Box Fluido con Ombra</title>
		<link>http://blog.webeng.it/2009/11/10/box-fluido-con-ombra/</link>
		<comments>http://blog.webeng.it/2009/11/10/box-fluido-con-ombra/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 16:19:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articoli Generici]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[box fluido]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.webeng.it/?p=1101</guid>
		<description><![CDATA[Ecco un breve esempio di una funzione PHP che ci permette di generare un box fluido in HTML con l&#8217;effetto ombreggiatura. La funzione è scritta in PHP ma il codice HTML generato è valido per qualsiasi tipo di linguaggio di programmazione. L&#8217;effetto ombra è ottenuto tramite un immagine creata con GIMP.
Le immagini che fanno da [...]]]></description>
			<content:encoded><![CDATA[<p>Ecco un breve esempio di una funzione PHP che ci permette di generare un box fluido in HTML con l&#8217;effetto ombreggiatura. La funzione è scritta in PHP ma il codice HTML generato è valido per qualsiasi tipo di linguaggio di programmazione. L&#8217;effetto ombra è ottenuto tramite un immagine creata con GIMP.</p>
<p><span id="more-1101"></span>Le immagini che fanno da angolo sinistro (superiore e inferiore) devono essere opportunamente dimensionate in modo da poter coprire una qualsiasi lunghezza (nel nostro caso fino a un massimo di 2000px) .</p>
<pre class="brush: php">

&lt;html&gt;
&lt;head&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
function get_box($header, $content){
$box = &quot;&lt;div class=\&quot;box\&quot;&gt;&lt;div class=\&quot;hd\&quot;&gt;&lt;div class=\&quot;c\&quot;&gt;&lt;/div&gt;&lt;/div&gt;&quot;;
$box .= &quot;&lt;div class=\&quot;bd\&quot;&gt;&lt;div class=\&quot;c\&quot;&gt;&lt;div class=&#039;s&#039;&gt;&quot;;
$box .= &quot;&lt;!-- content area --&gt;&quot;;
$box .= &quot;&lt;h1&gt;&quot;.$header.&quot;&lt;/h1&gt;&quot;;
$box .=    &quot;&lt;hr/&gt;&quot;;
$box .= $content;
$box .= &quot;&lt;!-- content area --&gt;&quot;;
$box .= &quot;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&quot;;
$box .= &quot;&lt;div class=\&quot;ft\&quot;&gt;&lt;div class=\&quot;c\&quot;&gt;&lt;/div&gt;&lt;/div&gt;&quot;;
$box .= &quot;&lt;/div&gt;&quot;;
return $box;
}
?&gt;

&lt;?php
echo get_box(&quot;Questo &amp;amp;amp;amp;amp;egrave; un box fluido&quot;, &quot;Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.&quot;);
?&gt;
&lt;/body&gt;
</pre>
<p>Ora veniamo al css.</p>
<pre class="brush: css">

/* stili per le box */
.box {
width:100%;
margin:1em 0 0em 0;
min-width:5em;
color:#fff;
}

.box .hd .c,
.box .ft .c {
font-size:1px; /* ensure minimum height */
height:13px;
}

.box .ft .c {
height:14px;
}

.box .hd {
background:transparent url(../images/box_top_left.png) no-repeat 0px 0px;
}

.box .hd .c {
background:transparent url(../images/box_top_right.png) no-repeat right 0px;
}

.box .bd {
background:transparent url(../images/box_left.png) repeat-y 0px 0px;
}

.box .bd .c {
background:transparent url(../images/box_right.png) repeat-y right 0px;
}

.box .bd .c .s {
margin:0px 8px 0px 4px;
background:#8193a7 repeat-x 0px 0px;
padding:1em;
}

.box .ft {
background:transparent url(../images/box_bottom_left.png) no-repeat 0px 0px;
}

.box .ft .c {
background:transparent url(../images/box_bottom_right.png) no-repeat right 0px;
}

/* content-specific */
.box h1 {
/* header */
font-size:1em;
margin:0px;
padding:0px;
margin-top:-1.0em;
}

.box p {
margin:0.5em 0px 0px 0px;
padding:0px;
font-size: 0.9em;
line-height: 1;
}

.box hr {
color: white;
}
</pre>
<p><a href="http://blog.webeng.it/wp-content/uploads/2009/11/box.rar">L&#8217;intero esempio è scaricabile da qui</a>.</p>
<p>Un grazie a Daniele.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webeng.it/2009/11/10/box-fluido-con-ombra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Come proteggere un form html dall&#8217;invio di SPAM</title>
		<link>http://blog.webeng.it/2007/10/13/impedire-linvio-di-spam-da-un-form-html/</link>
		<comments>http://blog.webeng.it/2007/10/13/impedire-linvio-di-spam-da-un-form-html/#comments</comments>
		<pubDate>Sat, 13 Oct 2007 13:29:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Sicurezza]]></category>
		<category><![CDATA[Sviluppo Web]]></category>

		<guid isPermaLink="false">http://blog.webeng.it/2007/10/13/impedire-linvio-di-spam-da-un-form-html/</guid>
		<description><![CDATA[In questo articolo proveremo ad illustrarvi come proteggere un form HTML dall&#8217;invio di SPAM mediante la tecnica del CAPTCHA. I form html non gestiti in modo ottimale possono essere causa di problemi sia nel caso in cui il modulo invii delle informazioni tramite email che nel caso inserisca le informazioni in un database.
Il rischio principale [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo proveremo ad illustrarvi come proteggere un form HTML dall&#8217;invio di SPAM mediante la tecnica del CAPTCHA. I form html non gestiti in modo ottimale possono essere causa di problemi sia nel caso in cui il modulo invii delle informazioni tramite email che nel caso inserisca le informazioni in un database.</p>
<p><span id="more-5"></span>Il rischio principale è costituito dagli SPAMBOT ovvero dei software in grado di effettuare richieste http allo scopo di bucare i form non protetti. Le conseguenze di un attacco di questo tipo possono essere il sovraccarico del server web, malfunzionamenti del server di posta nonchè il rapido accumularsi di informazioni inutili sul Database.Il potenziale pericolo è rappresentato dal fatto che analizzando i tag di una pagina html, si possono analizzare facilmente le variabili usate per il passaggio delle informazioni, il metodo utilizzato (POST/GET) e la pagina che elabora la richiesta di invio email.</p>
<p>Quindi un qualsiasi individuo che vuole crearvi una grana, può, mediante un banale programmino che invia richieste HTTP effettuare la medesima richiesta infinite volte e intasarvi la posta o riempirvi il database. Per questo problema nasce l&#8217;esigenza di validare lato server le richieste effettuate tramite la pagina che si occupa nello specifico di elaborare la richiesta.</p>
<p>La tecnica del Captcha Code &#8220;completely automated public Turing test to tell computers and humans apart&#8221; è uno dei metodi più utilizzati per verificare se chi effettua la richiesta è un umano oppure un BOT.</p>
<p>A questo punto mostriamo un esempio di come implementare tale tecnica all&#8217;interno del proprio sito web:</p>
<p>Iniziamo con la creazione di una tabella sul nostro DB MySql che contenga le informazioni necessarie per implementare la tecnica del Captcha. Connettiamoci al nostro DB tramite PhpMyAdmin o tramite linea di comando e creiamo la tabella captcha con il seguente script:</p>
<pre class="sql">CREATE TABLE `captcha` (
`captcha_id` varchar(255) character set latin1 collate latin1_general_ci NOT NULL,
`code` varchar(255) character set latin1 collate latin1_general_ci NOT NULL,
`timestamp` varchar(255) character set latin1 collate latin1_general_ci NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;</pre>
<p>Occupiamoci ora della pagina dove verrà visualizzato il FORM, preleviamo il codice e salviamolo in un file di testo index.php (per comodità si consiglia di posizionare tutti i file creati all&#8217;interno della stessa directory nella root del web server) :</p>
<pre class="php">&lt;?php
echo "&lt;html&gt;";
echo "&lt;head&gt;";

// genero un identificativo criptato md5 da associare al codice di sicurezza
$captcha_id = md5(microtime().mt_rand().'super1segreto2segretissimo3');

// creo un codice di controllo per la verifica dell'identificativo
$sale = "frase super segreta da cambiare a discrezione.";

// cripto in md5 i due codici generati
$chk = md5($sale.$captcha_id);

echo "&lt;/head&gt;";
echo "&lt;body&gt;";

//Creo il form

echo "&lt;form method=\"post\" action=\"email.php\"&gt;";
echo "Cognome : &lt;input type=\"text\" name=\"surname\"/&gt;";
echo "&lt;br/&gt;";
echo "Nome : &lt;input type=\"text\" name=\"name\"/&gt;";
echo "&lt;br/&gt;";
echo "E-mail : &lt;input type=\"text\" name=\"mail\"/&gt;";
echo "&lt;br/&gt;";
echo "&lt;img src=\"captcha.php?id=".$captcha_id."&amp;chk=".$chk."\" width=\"110\" height=\"70\"/&gt;";
echo "&lt;input type=\"text\" name=\"captcha_code\"/&gt;";
echo "&lt;br/&gt;";
echo "&lt;input name=\"captcha_id\" type=\"hidden\" id=\"captcha_id\" value=\"".$captcha_id."\"/&gt;";
echo "&lt;br/&gt;";
echo "&lt;input type=\"submit\" name=\"submit\" value=\"Submit\"/&gt;";
echo "&lt;br/&gt;";
echo "&lt;/form&gt;";

echo "&lt;/body&gt;";
?&gt;</pre>
<p>Notare bene che nello script precedente:</p>
<p>l&#8217;immagine Captcha è stata generata dalla richiesta presente nell&#8217;attributo src dell&#8217;immagine<br />
il campo captcha_code conterrà il codice di sicurezza che l&#8217;utente dovrà inserire per validare l&#8217;elaborazione<br />
il campo captcha_id contiene il captcha_id generato precedentemente nella head<br />
Ecco il listato della pagina che genera l&#8217;immagine CAPTCHA, salviamo il codice in un file di testo avendo l&#8217;accortezza di salvarlo come captcha.php :</p>
<pre class="php">&lt;?php
// controllo se è stato fornito l identificativo del codice captcha
if(!isset($_GET['id'])) exit();

// controllo la validità dell identificativo
$captcha_id = $_GET['id'];
if(!preg_match("/^[a-f0-9]{32}$/",$captcha_id)) exit();

// ricreo il codice di controllo e lo confronto con quello passato via GET
$sale = "frase super segreta da cambiare a discrezione.";
$chk = md5($sale . $captcha_id);
if($chk != $_GET['chk']) exit();

// creo l immagine
// ---------------------------------------------------------------

// le dimensioni dell immagine
$size_x = 110;
$size_y = 70;

$img = imagecreatetruecolor($size_x,$size_y);

// alloco un colore per lo sfondo
$backgroung = imagecolorallocate($img,255, 255, 255);

// alloco 3 colori per le 3 lettere da decifrare
// utilizzo il canale alpha per impostare la trasparenza
$color[] = imagecolorallocatealpha($img,110,110,110,60);
$color[] = imagecolorallocatealpha($img,3,187,63,60);
$color[] = imagecolorallocatealpha($img,255,0,0,70);

// mischio l ordine dei colori
shuffle($color);

// coloro lo sfondo creando un rettangolo
imagefilledrectangle($img,0,0,$size_x-1,$size_y-1,$backgroung);

// i caratteri da utilizzare per il codice di sicurezza
$caratteri = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";

// inizializzo la variabile che conterrà il codice
$codice = '';

// per ciascuno dei 3 caratteri
for ($i=0 ; $i &lt; 3 ; $i++){
// estraggo un carattere a caso
$codice .= $caratteri{rand(0,34)};
// disegno il carattere
imagettftext(
$img,
50,
-5+rand(0,10), // rotazione casuale
($i+0.3)*24,
60,
$color[$i],
'./VeraMono.ttf',
$codice{$i});
}

// inserisco identificativo e codice nel DB
// ---------------------------------------------------------------
mysql_connect('IP_MIO_SERVER_MYSQL','USER_MYSQL','PASS_MYSQL');
mysql_select_db('NOME_DB_MYSQL');

mysql_query("REPLACE INTO captcha (captcha_id,code,`timestamp`)
values ('$captcha_id','$codice',UNIX_TIMESTAMP())");

// con prob. impostata da $probabilità cancello i record più vecchi
$probabilità = 5; // 5%
if(mt_rand(1,100) &lt;= $probabilità){
$durata_captcha = 60*60;
mysql_query("DELETE FROM captcha WHERE `timestamp`&lt;(UNIX_TIMESTAMP()-$durata_captcha)");
}

// invio l immagine al browser
// ---------------------------------------------------------------
header("Content-type: image/png");
imagepng($img);
?&gt;</pre>
<p>Da notare che nello script precedente si utilizza un font per generare l&#8217;immagine (VeraMono.ttf)  il quale può essere modificato a proprio piacimento con un qualsiasi font installato nel proprio pc o scaricato da internet. Per scaricare il font utilizzato nell&#8217;esempio cliccare qui. Nell&#8217;esempio il font in questione è posizionato all&#8217;interno della stessa cartella dove sono stati posizionati gli script.</p>
<p>Passiamo ora ad esaminare la pagina che invierà l&#8217; e-mail e che si occuperà anche di verificare la validità dell&#8217;elaborazione, copiamo il codice sottostante e incolliamolo su un file di testo avendo l&#8217;accortezza di salvarlo come email.php.</p>
<pre class="php">&lt;?php
//Inclusione file esterni
 require_once('send_mail.php');

// Recupero dei dati POST
$surname = $_POST['surname'];
$name = $_POST['name'];
$mail = $_POST['mail'];

// dopo quanto tempo i dati nella tabella del DB scadono
$durata_captcha = 60*60;

// ci sono tutti i dati?
if(!isset($_POST['captcha_code']) OR !isset($_POST['captcha_id'])) exit;
$captcha_code = $_POST['captcha_code'];
$captcha_id = $_POST['captcha_id'];

// controlla la validità del $captcha_id
if(!preg_match("/^[a-f0-9]{32}$/",$captcha_id)){
// se il $captcha_id non è valido termino la procedura
echo '$captcha_id non valido';
}else{
// controlla la validità del $captcha_code
if (!preg_match("/^[a-zA-Z0-9]{3}$/", $captcha_code)){
// se il $captcha_code non è valido non faccio la ricerca nel DB
echo '$captcha_code non valido';
}else{
// $captcha_id e $captcha_code sono ben formattati, posso fare la verifica
// rendo tutte le lettere del $captcha_code maiuscole e
// sostituisco gli zeri con le O
$captcha_code = strtoupper($captcha_code);
$captcha_code = str_replace('0','O',$captcha_code);

mysql_connect('IP_MIO_SERVER_MYSQL','USER_MYSQL','PASS_MYSQL') or die(mysql_error());
mysql_select_db('NOME_DB_MYSQL') or die(mysql_error());

// nella verifica non considero dati più vecchi di $durata_captcha secondi
$res = mysql_query("SELECT code FROM captcha WHERE captcha_id = '$captcha_id' AND code = '$captcha_code' AND `timestamp` &gt; (UNIX_TIMESTAMP() - $durata_captcha)") or die (mysql_error());
if(mysql_num_rows($res) != 1){
// verifica fallita
echo '$captcha_code errato';
}else{
// cancello i vecchi codici e quello corrente
mysql_query("DELETE FROM captcha WHERE captcha_id = '$captcha_id' OR `timestamp` &lt; (UNIX_TIMESTAMP() - $durata_captcha)");

//Scrittura parametri email
$from_name  = $name." ".$surname;
$from_email = $mail;
$to_name    = "NOME_DEL_DESTINATARIO";
$to_email   = "MAIL_DEL_DESTINATARIO";
$subject    = "Invio email sicura dal tuo sito";
$text_message = "This is HTML email and your email client software ain't support HTML email.";
$html_message = "&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"&gt;\n";
$html_message.= "&lt;html&gt;&lt;head&gt;&lt;title&gt;&lt;/title&gt;\n";
$html_message.= "&lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"&gt;\n";
$html_message.= "&lt;/head&gt;\n";
$html_message.= "&lt;body&gt;";
$html_message.= "Ciao, questa è un email sicura inviata dal tuo sito";
$html_message.= "&lt;/body&gt;&lt;/html&gt;";

//Creo l'allegato
$attachment = array ("PATH_ALLEGATO_SUL_SERVER");

//Invio l'email con la funzione sendmail
sendmail ($from_name, $from_email, $to_name, $to_email, $subject, $text_message, $html_message, $attachment);

echo "&lt;script language=\"Javascript\"&gt;";
echo "&lt;!–-";
echo "alert (\"e-mail inviata con successo\");";
echo "history.go(-1);";
echo "–-&gt;";
echo "&lt;/script&gt;";
}
}
}
?&gt;</pre>
<p>I controlli effettuati all&#8217;inizio del codice illustrato permettono al server web di distinguere se si tratta di una richiesta valida o di una richiesta effettuata da un BOT.</p>
<p>Se i controlli saranno superati si passerà ad invocare la funzione sendmail che si occuperà dell&#8217;invio di una mail in formato HTML con allegati. Alternativamente a questa funzione si pùo invocare la classica funzione mail disponibile nel linguaggio PHP.</p>
<p>Ecco ora il listato della funzione sendmail invocata nel precedente script, che si occupa di inviare una mail in formato HTML. Copiare il codice e salvarlo in un file denominato send_mail.php.</p>
<pre class="php">&lt;?php
function sendmail ($from_name, $from_email, $to_name, $to_email, $subject, $text_message="", $html_message, $attachment=""){
$from = "$from_name &lt;$from_email&gt;";
$to   = "$to_name &lt;$to_email&gt;";
$main_boundary = "----=_NextPart_".md5(rand());
$text_boundary = "----=_NextPart_".md5(rand());
$html_boundary = "----=_NextPart_".md5(rand());
$headers  = "From: $from\n";
$headers .= "Reply-To: $from\n";
$headers .= "X-Mailer: Hermawan Haryanto (<a href="http://hermawan.com)\n">http://hermawan.com)\n</a>";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n\tboundary=\"$main_boundary\"\n";
$message .= "\n--$main_boundary\n";
$message .= "Content-Type: multipart/alternative;\n\tboundary=\"$text_boundary\"\n";
$message .= "\n--$text_boundary\n";
$message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= ($text_message!="")?"$text_message":"Text portion of HTML Email";
$message .= "\n--$text_boundary\n";
$message .= "Content-Type: multipart/related;\n\tboundary=\"$html_boundary\"\n";
$message .= "\n--$html_boundary\n";
$message .= "Content-Type: text/html; charset=\"ISO-8859-1\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= str_replace ("=", "=3D", $html_message)."\n";
if (isset ($attachment) &amp;&amp; $attachment != "" &amp;&amp; count ($attachment) &gt;= 1){
for ($i=0; $i&lt;count ($attachment); $i++){
$attfile = $attachment[$i];
$file_name = basename ($attfile);
$fp = fopen ($attfile, "r");
$fcontent = "";
while (!feof ($fp)){
$fcontent .= fgets ($fp, 1024);
}
$fcontent = chunk_split (base64_encode($fcontent));
@fclose ($fp);
$message .= "\n--$html_boundary\n";
$message .= "Content-Type: application/octetstream\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "Content-Disposition: inline; filename=\"$file_name\"\n";
$message .= "Content-ID: &lt;$file_name&gt;\n\n";
$message .= $fcontent;
}
}
$message .= "\n--$html_boundary--\n";
$message .= "\n--$text_boundary--\n";
$message .= "\n--$main_boundary--\n";
@mail ($to, $subject, $message, $headers);
}
?&gt;</pre>
<p>A questo punto possiamo testare lo script chiamando la pagina index.php dal nostro browser.</p>
<p>Alla prossima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webeng.it/2007/10/13/impedire-linvio-di-spam-da-un-form-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
