<?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>PHPBlog.it &#187; tipi</title>
	<atom:link href="http://phpblog.it/tag/tipi/feed/" rel="self" type="application/rss+xml" />
	<link>http://phpblog.it</link>
	<description>Solo un altro blog targato WordPress</description>
	<lastBuildDate>Mon, 30 Jan 2012 10:36:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Generare password casuali</title>
		<link>http://phpblog.it/2008/02/18/classe-php5-generazione-password-casuali/</link>
		<comments>http://phpblog.it/2008/02/18/classe-php5-generazione-password-casuali/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 06:00:47 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[classi]]></category>
		<category><![CDATA[phpblog]]></category>
		<category><![CDATA[sicurezza]]></category>
		<category><![CDATA[generatore]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[shuffle]]></category>
		<category><![CDATA[tipi]]></category>

		<guid isPermaLink="false">http://php5blog.it/2008/02/18/classe-php5-generazione-password-casuali/</guid>
		<description><![CDATA[In tutte le applicazioni che richiedono l&#8217;autenticazione da parte degli utenti un ruolo fondamentale per quanto riguarda la sicurezza dell&#8217;intero sistema è rappresentato dalla password inserita. Molte volte (se non nella totalità dei casi) lasciare all&#8217;utente la gestione completa della propria password è fonte di rischio visto che per semplice pigrizia l&#8217;utente medio utilizza spesso [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://172.18.0.13/wordpress/wp-content/uploads/2008/02/padlock.jpg" alt="Padlock" />In tutte le applicazioni che richiedono l&#8217;autenticazione da parte degli utenti <strong>un ruolo fondamentale per quanto riguarda la sicurezza dell&#8217;intero sistema è rappresentato dalla password inserita</strong>. Molte volte (se non nella totalità dei casi) lasciare all&#8217;utente la gestione completa della propria password è fonte di rischio visto che per semplice pigrizia l&#8217;utente medio utilizza spesso la stessa parola chiave sicuramente appartenente alla tipologia che possiamo definire debole: il proprio nome, date di nascita, parole estremamente corte. <strong>Oggi quindi presento una semplice classe per la generazione di password casuali scritta in PHP5.</strong></p>
<p><span id="more-34"></span>Una strada per innalzare la sicurezza della propria applicazione e dell&#8217;intero sistema è quella di <strong>fornire all&#8217;utente una password creata dal sistema seguendo un determinato criterio</strong> con l&#8217;intento di rispettare quelli che sono i requisiti minimi per una password sicura. Vogliamo quindi utilizzare:</p>
<ul>
<li>un insieme di caratteri alfabetici maiuscoli e minuscoli</li>
<li>un insieme di numeri</li>
</ul>
<p>La classe che vediamo di seguito è molto semplice prende <strong>2 valori in input <em>length</em> e <em>numbers</em></strong> che indicano rispettivamente la lunghezza totale della password ed il numero di cifre intendiamo inserire nella stringa che andiamo a generare. E&#8217; costituita dal <strong><em>costruttore</em> che si occupa di creare l&#8217;oggetto</strong> al momento dell&#8217;istanziazione della classe e dal <strong>metodo <em>getPassword() </em></strong>che si occupa dell&#8217;elaborazione vera e propria dell&#8217;input per la generazione dell&#8217;output: la password.</p>
<p><strong>Il costruttore si occupa appunto di costruire l&#8217;oggetto facendo le dovute <a href="http://php5blog.it/2008/02/12/php-non-e-fortemente-tipizzato/" title="verifiche sui tipi, di cui abbiamo parlato in un post precedente">verifiche sui tipi</a></strong><a href="http://php5blog.it/2008/02/12/php-non-e-fortemente-tipizzato/" title="verifiche sui tipi, di cui abbiamo parlato in un post precedente">, di cui abbiamo parlato in un post precedente</a>, ed agendo in base alla situazione che si verifica.<br />
<code></code></p>
<p><code>public function __construct($length, $numbers) {<br />
if (!is_int($length) || !is_int($numbers)) {<br />
die("randoPassword() richiede argomenti di tipo intero\n");<br />
}<br />
if ($length &lt; $numbers) {<br />
die("length deve essere maggiore di numbers\n");<br />
}<br />
$this-&gt;length = $length;<br />
$this-&gt;numbers = $numbers;<br />
}<br />
</code></p>
<p>Come anticipato <strong>il metodo <em>getPassword() </em>si occupa del lavoro vero e proprio</strong>, vediamo quindi come si comporta. Innanzitutto <strong>andiamo ad inserire nell&#8217;array <em>random_char</em> un numero di caratteri alfabetici presi da <em>$alphabet</em> pari al valore di <em>$length</em> meno il valore di <em>$numbers</em>.</strong> In secondo luogo <strong>aggiungiamo dei caratteri numerici</strong> presi casualmente tra 0 e 9 fino a raggiungere una numerosità dell&#8217;array <em>random_char</em> pari a <em>$length. </em>A questo punto avremmo già una password composta da lettere (maiuscole e minuscole) con n=$numbers caratteri numerici in coda. <strong>Per rendere le password meno ripetitive ho deciso di rimischiare i valori interni all&#8217;array con la comoda funzione <a href="http://it.php.net/manual/it/function.shuffle.php" title="shuffle">shuffle</a></strong> prima di eseguire il return del metodo.<br />
<code><br />
public function getPassword() {<br />
$a = 0;<br />
while ($a &lt; ($this-&gt;length - $this-&gt;numbers)) {<br />
$random_char[$a] = $this-&gt;alphabet[rand(0,51)];<br />
$a++;<br />
}</code><br />
<code><br />
while ($a &lt; $this-&gt;length) {<br />
$random_char[$a] = rand(0,9);<br />
$a++;<br />
}<br />
</code><code><br />
shuffle($random_char);<br />
</code><code><br />
$a = 0;<br />
while ($a &lt; ($this-&gt;length + $this-&gt;numbers)) {<br />
$password .= $random_char[$a];<br />
$a++;<br />
}<br />
return $password;<br />
}<br />
</code></p>
<p>Come sempre potete <a href="http://php5blog.it/downloads/phpblog/randomPassword.class.php.txt" title="randomPassword.class.php">scaricare <strong>il codice completo della classe randomPassword.class.php</strong></a> in modo da studiarlo attentamente (l&#8217;indentazione lì è corretta) e provarlo ma soprattutto modificarlo e perfezionarlo in base a quello che vi ha insegnato la vostra esperienza.</p>
<p>Usate i commenti qui sotto per esprimere il vostro parere, i vostri dubbi, le vostre critiche e i suggerimenti che riteniate possano essere utili a me ed ai lettori.</p>
<p><strong>CREDITS<br />
</strong>L’immagine utilizzata nell’articolo proviene da <a href="http://www.flickr.com/">Flickr</a>, dove è stata <a href="http://www.flickr.com/photos/imaginedreality/399334773/" title="Padlock and Key">pubblicata da Imagined Reality</a> con <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.it" title="Attribuzione-Condividi allo stesso modo 2.0 Generico">licenza Creative Commons</a>.<a href="http://www.flickr.com/photos/imaginedreality/399334773/" title="http://www.flickr.com/photos/imaginedreality/399334773/"><br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/02/18/classe-php5-generazione-password-casuali/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>La questione dei tipi primitivi</title>
		<link>http://phpblog.it/2008/02/12/php-non-e-fortemente-tipizzato/</link>
		<comments>http://phpblog.it/2008/02/12/php-non-e-fortemente-tipizzato/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 06:00:34 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[phpblog]]></category>
		<category><![CDATA[sicurezza]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tipi]]></category>
		<category><![CDATA[variabili]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://php5blog.it/2008/02/12/php-non-e-fortemente-tipizzato/</guid>
		<description><![CDATA[Sappiamo tutti (oppure lo scoprite ora) che PHP non è un linguaggio fortemente tipizzato. Questo cosa vuol dire? Significa che non è necessario dichiarare il tipo di una variabile perchè essa possa gestire un particolar tipo di dato. In questo modo potremmo assegnare a $numero il valore 2 oppure &#8220;due&#8221; alla stessa maniera. Nei linguaggi [...]]]></description>
			<content:encoded><![CDATA[<p>Sappiamo tutti (oppure lo scoprite ora) che <strong>PHP non è un linguaggio fortemente tipizzato</strong>. Questo cosa vuol dire? Significa che <strong>non è necessario dichiarare il tipo di una variabile</strong> perchè essa possa gestire un particolar tipo di dato. In questo modo potremmo assegnare a <strong>$numero</strong> il valore <em>2</em> oppure &#8220;<em>due</em>&#8221; alla stessa maniera. Nei linguaggi fortemente tipizzati (C, Java&#8230;) è obbligatorio dichiarare il tipo di una variabile prima di assegnarle un valore, valore che chiaramente deve rispettare il tipo specificato.</p>
<p><span id="more-27"></span>Questo non significa certo che PHP non rispetti il <strong>concetto di tipo</strong>, ogni valore che possiamo assegnare ad una variabile ha un tipo che possiamo verificare attraverso delle utili <a href="http://it.php.net/manual/it/ref.var.php" title="http://it.php.net/manual/it/ref.var.php">funzioni per la gestione delle variabili</a>. Avremo quindi la possibilità di utilizzare is_bool(), is_integer(), is_string()&#8230;per verificare il tipo di una variabile passata come parametro, in caso positivo il valore di ritorno sarà <em>true</em>.</p>
<p>Effettuare <strong>il controllo del tipo di una varibile torna particolarmente importante quando si ha a che fare con gli argomenti di metodi e funzioni</strong>, casi in cui bisogna prestare particolare attenzione al codice che si scrive. Vediamo un esempio. Immaginiamo di estrarre delle informazioni di configurazione da un file XML, l&#8217;elemento &lt;resolvedomains&gt; specifica all&#8217;applicazione se provare o meno ad eseguire il reverse DNS di un IP.<br />
<code><br />
&lt;settings&gt;<br />
&lt;resolvedomains&gt;false&lt;/resolvedomains&gt;<br />
&lt;settings&gt;<br />
</code></p>
<p>La stringa &#8220;false&#8221; viene letta dall&#8217;appliccazione e passata ad un metodo chiamato <em>outputAddress()</em> che si occupa di visualizzare i dati di un determinato IP.</p>
<p>[php]<br />
function outputAddresses($resolve) {<br />
foreach($this-&gt;addresses as $address) {<br />
print $address;<br />
if ($resolve) {<br />
print &#8220;(&#8220;. gethostbyaddr($address) .&#8221;)&#8221;;<br />
}<br />
print &#8220;\n&#8221;;<br />
}<br />
}<br />
[/php]</p>
<p>Il metodo <em>outputAddresses()</em> non fa altro che iterare su un array di indirizzi IP mostrandoli uno ad uno, nel caso in cui $resolve sia true il metodo restituisce anche il dominio assieme all&#8217;IP. Vediamo una porzione di codice che potrebbe essere chiamata da questo metodo:<br />
<code><br />
$settings = simplexml_load_file("settings.xml");<br />
$manager = new AddressManager();<br />
$manager-&gt;outputAddresses($settings-&gt;resolvedomains);</code></p>
<p>Questo codice non si comporta come ci si aspetterebbe: passando la stringa &#8220;false&#8221; al metodo <em>outputAddress()</em> <strong>trascuriamo l&#8217;assunzione implicita che il metodo fa riguardo all&#8217;argomento passato</strong>. Infatti il metodo si aspetta un valore di tipo booleano (true o false) ma la stringa &#8220;false&#8221; corrisponde al valore true in un test. Questo è dato dal fatto che PHP esegue un cast di una stringa non vuota al valore booleano true in un test if. Di conseguenza:<br />
<code><br />
if ("false") {<br />
//..<br />
}<br />
</code></p>
<p>è equivalente a<br />
<code><br />
if (true) {<br />
//..<br />
}</code></p>
<p>Esistono diverse strade per risolvere questo problema, quella più metodica e sicura richiede di modificare il metodo <em>outputAddress()</em>  per fare in modo che sia pronto ad aspettarsi il corretto tipo di dato riferito all&#8217;argomento <em>$resolv</em>.</p>
<p>[php]<br />
function outputAddresses($resolve) {<br />
if (!is_bool($resolve)) {<br />
die(&#8220;outputAddress() richiede un argomento di tipo booleano\n&#8221;);<br />
}<br />
}<br />
[/php]</p>
<p>Un approccio di questo tipo <strong>obbliga chi utilizza il metodo a fornire l&#8217;argomento $resolv nel tipo di dato corretto</strong> evitando problemi di ogni sorta. Detto questo sta al programmatore considerare il potenziale impatto che l&#8217;utilizzo di tipi inaspettati potrebbe avere sulla propria applicazione. Non pensate di lasciare nulla al caso, chi userà le vostre classi non può leggere quello che avete in mente quando le realizzate quindi<strong> è consigliabile pensare sempre come i metodi che scrivete possano reagire alla &#8220;spazzatura&#8221; che potrebbero ricevere in input.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/02/12/php-non-e-fortemente-tipizzato/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

