<?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>Émile Girard : gérant d&#039;estrade &#187; PHP</title>
	<atom:link href="http://www.estrade.ca/dev/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.estrade.ca</link>
	<description>Penser tout connaître c&#039;est déjà un début</description>
	<lastBuildDate>Mon, 19 Dec 2011 15:22:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>php.ini : forcer des options spécifiques pour chaque site</title>
		<link>http://www.estrade.ca/dev/php-ini-forcer-des-options-specifiques-pour-chaque-site.html</link>
		<comments>http://www.estrade.ca/dev/php-ini-forcer-des-options-specifiques-pour-chaque-site.html#comments</comments>
		<pubDate>Fri, 27 May 2011 16:14:49 +0000</pubDate>
		<dc:creator>Emile Girard</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[fichiers]]></category>
		<category><![CDATA[poids]]></category>
		<category><![CDATA[taille]]></category>

		<guid isPermaLink="false">http://www.estrade.ca/?p=1303</guid>
		<description><![CDATA[Petit truc très utile si jamais vous disposiez d&#8217;un serveur mutualisé hébergeant plusieurs sites et que vous souhaitiez &#8211; par exemple &#8211; augmenter le POST_MAX_SIZE pour un de vos clients afin de lui permettre de téléverser des photos de haute qualité via l&#8217;admin de WordPress. &#8211; À la racine de votre dossier public, ajoutez un [...]]]></description>
			<content:encoded><![CDATA[<p>Petit truc très utile si jamais vous disposiez d&#8217;un serveur mutualisé hébergeant plusieurs sites et que vous souhaitiez &#8211; par exemple &#8211; augmenter le POST_MAX_SIZE pour un de vos clients afin de lui permettre de téléverser des photos de haute qualité via l&#8217;admin de WordPress.</p>
<p>&#8211;</p>
<p>À la racine de votre dossier public, ajoutez un<em> .htaccess </em>contenant :</p>
<pre style="padding-left: 30px;">suPHP_ConfigPath /home/public_html/</pre>
<p>et au même endroit, un fichier nommé <em>php.ini</em> contenant les configs à surpasser (<em>override</em>), par exemple:</p>
<pre style="padding-left: 30px;">upload_max_filesize=10M
post_max_size=10M
max_execution_time=200
max_input_time=200</pre>
<p>&#8211;</p>
<p><strong>MÀJ : </strong>Merci au collègue <a href="http://www.erichogue.ca/">Éric</a> qui me souligne au passage la nécessité d&#8217;avoir installé le <a href="http://www.suphp.org/Documentation.html">module suPHP</a> pour que cette astuce fonctionne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.estrade.ca/dev/php-ini-forcer-des-options-specifiques-pour-chaque-site.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mise en cache de pages dynamiques</title>
		<link>http://www.estrade.ca/dev/php/mise-en-cache-php.html</link>
		<comments>http://www.estrade.ca/dev/php/mise-en-cache-php.html#comments</comments>
		<pubDate>Wed, 04 Nov 2009 02:11:35 +0000</pubDate>
		<dc:creator>Emile Girard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[caching]]></category>

		<guid isPermaLink="false">http://www.estrade.ca/?p=969</guid>
		<description><![CDATA[Voici un petit tutoriel pour expliquer comment &#8211; très simplement &#8211; mettre une page dynamique en cache pour en accélérer l&#8217;affichage et limiter les ressources côté serveur (apache et mysql). Premièrement, suffit de créer deux fonctions. La première &#8211; debut_cache() &#8211; testera l&#8217;existence d&#8217;un fichier cache récent pour l&#8217;affichier, ou initialisera le buffer et débutera [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un petit tutoriel pour expliquer comment &#8211; très simplement &#8211; mettre une page dynamique en cache pour en accélérer l&#8217;affichage et limiter les ressources côté serveur (apache et mysql).</p>
<p>Premièrement, suffit de créer deux fonctions. La première &#8211; debut_cache() &#8211; testera l&#8217;existence d&#8217;un fichier cache récent pour l&#8217;affichier, ou initialisera le buffer et débutera la mise en cache du contenu. La deuxième &#8211; fin_cache() &#8211; prend le contenu mis dans le buffer et va, suivant le besoin, écrire un fichier statique avec le contenu généré par le serveur qui sera alors repris par les requêtes suivants jusqu&#8217;à son expiration.</p>
<pre class="php"><span class="phpFunctionKeyword">function</span> debut_cache<span class="phpOperator">(</span><span class="phpOperator">)</span>
<span class="phpOperator">{</span>
<span class="phpKeyword">	global </span>$cachedFile<span class="phpText">;</span>
<span class="phpKeyword">	if<span class="phpOperator">(</span></span>CACHE <span class="phpOperator">&gt;</span> <span class="phpNumber">0</span><span class="phpOperator">)</span> <span class="phpOperator">{</span>
	<span class="phpKeyword">	if </span><span class="phpOperator">(</span><span class="phpOperator">!</span><span class="phpFunction">isset</span><span class="phpOperator">(</span><span class="phpScriptVar">$_POST</span><span class="phpOperator">)</span> <span class="phpOperator">|</span><span class="phpOperator">|</span> <span class="phpFunction">count</span><span class="phpOperator">(</span><span class="phpScriptVar">$_POST</span><span class="phpOperator">)</span> <span class="phpOperator"><span class="phpOperator">=</span>=</span> <span class="phpNumber">0</span><span class="phpOperator">)</span> <span class="phpOperator">{</span>
			$hash <span class="phpOperator">=</span> <span class="phpFunction">md5</span><span class="phpOperator">(</span><span class="phpFunction">serialize</span><span class="phpOperator">(</span><span class="phpScriptVar">$_GET</span><span class="phpOperator">)</span> <span class="phpOperator">.</span> <span class="phpScriptVar">$_SERVER</span><span class="phpOperator">[</span><span class="phpString">'HTTP_HOST'</span><span class="phpOperator">]</span> <span class="phpOperator">.</span> <span class="phpScriptVar">$_SERVER</span><span class="phpOperator">[</span><span class="phpString">'REQUEST_URI'</span><span class="phpOperator">]</span><span class="phpOperator">)</span><span class="phpText">;</span>
			$filename <span class="phpOperator">=</span> <span class="phpFunction">basename</span><span class="phpOperator">(</span><span class="phpScriptVar">$_SERVER</span><span class="phpOperator">[</span><span class="phpString">'PHP_SELF'</span><span class="phpOperator">]</span> <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">.</span>'</span> <span class="phpOperator">.</span> <span class="phpScriptVar">$_SERVER</span><span class="phpOperator">[</span><span class="phpString">'HTTP_HOST'</span><span class="phpOperator">]</span> <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">.</span>'</span> <span class="phpOperator">.</span> $hash <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">.</span>html'</span><span class="phpOperator">)</span><span class="phpText">;</span>
		<span class="phpKeyword">	if </span><span class="phpOperator">(</span><span class="phpFunction">file_exists</span><span class="phpOperator">(</span>CACHE_DIR <span class="phpOperator">.</span> $filename<span class="phpOperator">)</span> AND <span class="phpOperator">(</span><span class="phpFunction">time</span><span class="phpOperator">(</span><span class="phpOperator">)</span> - filem<span class="phpFunction">time</span><span class="phpOperator">(</span>CACHE_DIR<span class="phpOperator">.</span> $filename<span class="phpOperator">)</span><span class="phpOperator">)</span> <span class="phpOperator">&lt;</span> CACHE<span class="phpOperator">)</span> <span class="phpOperator">{</span>
				<span class="phpFunction">readfile</span><span class="phpOperator">(</span>CACHE_DIR <span class="phpOperator">.</span> $filename<span class="phpOperator">)</span><span class="phpText">;</span>
				<span class="phpFunction">exit</span><span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span>
			<span class="phpOperator">}</span><span class="phpKeyword"> else </span><span class="phpOperator">{</span>
				$cachedFile <span class="phpOperator">=</span> CACHE_DIR <span class="phpOperator">.</span> $filename<span class="phpText">;</span>
				<span class="phpFunction">ob_start</span><span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span>
			<span class="phpOperator">}</span>
		<span class="phpOperator">}</span><span class="phpKeyword"> else </span>$cachedFile <span class="phpOperator">=</span><span class="phpKeyword"> false<span class="phpText">;</span></span>
	<span class="phpOperator">}</span>
<span class="phpOperator">}</span>
<span class="phpFunctionKeyword">function</span> fin_cache<span class="phpOperator">(</span><span class="phpOperator">)</span>
<span class="phpOperator">{</span>
<span class="phpKeyword">	global </span>$cachedFile<span class="phpText">;</span>
<span class="phpKeyword">	if<span class="phpOperator">(</span></span><span class="phpOperator">(</span>CACHE <span class="phpOperator">&gt;</span> <span class="phpNumber">0</span><span class="phpOperator">)</span> AND $cachedFile<span class="phpOperator">)</span> <span class="phpOperator">{</span>
		$hoststr= <span class="phpFunction">getenv</span><span class="phpOperator">(</span><span class="phpString">"HOSTNAME"</span><span class="phpOperator">)</span><span class="phpText">;</span>
		$host <span class="phpOperator">=</span> <span class="phpFunction">explode</span> <span class="phpOperator">(</span><span class="phpString">"<span class="phpOperator">.</span>"</span>, $hoststr<span class="phpOperator">)</span><span class="phpText">;</span>
		$page <span class="phpOperator">=</span> <span class="phpFunction">ob_get_contents</span><span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span>
		$page <span class="phpOperator">.=</span> <span class="phpString">'<span class="phpOperator">&lt;</span><span class="phpOperator">!</span>-- Page mise en cache @ '</span> <span class="phpOperator">.</span> <span class="phpFunction">date</span><span class="phpOperator">(</span><span class="phpString">'Y-m-d H<span class="phpOperator">:</span>i<span class="phpOperator">:</span>s'</span><span class="phpOperator">)</span> <span class="phpOperator">.</span> <span class="phpString">' -<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>'</span><span class="phpText">;</span>
		<span class="phpFunction">ob_end_flush</span><span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span>
	<span class="phpKeyword">	if </span><span class="phpOperator">(</span>$file <span class="phpOperator">=</span> <span class="phpFunction">fopen</span><span class="phpOperator">(</span>$cachedFile, <span class="phpString">'w'</span><span class="phpOperator">)</span><span class="phpOperator">)</span> <span class="phpOperator">{</span>
    			<span class="phpFunction">fwrite</span><span class="phpOperator">(</span>$file, $page<span class="phpOperator">)</span><span class="phpText">;</span>
    			<span class="phpFunction">fclose</span><span class="phpOperator">(</span>$file<span class="phpOperator">)</span><span class="phpText">;</span>
    		<span class="phpOperator">}</span>
	<span class="phpOperator">}</span>
<span class="phpOperator">}</span></pre>
<p>Juste avant de faire l&#8217;appel, il importe de définir deux variables (des constantes globales dans cet exemple). </p>
<pre class="php"><span class="phpComment">//temps pour le cache <span class="phpOperator">(</span>secondes<span class="phpOperator">)</span>.<span class="phpOperator">.</span>. <span class="phpNumber">0</span> pour annuler la cache
</span><span class="phpFunction">define</span><span class="phpOperator">(</span><span class="phpString">'CACHE'</span>, 60*15<span class="phpOperator">)</span><span class="phpText">;</span>  <span class="phpComment">//15 min
</span>
<span class="phpComment">//dossier de cache
</span><span class="phpFunction">define</span><span class="phpOperator">(</span><span class="phpString">'CACHE_DIR'</span>, <span class="phpString">'/www/cache/'</span><span class="phpOperator">)</span><span class="phpText">;</span></pre>
<p>Ensuite, on se lance : </p>
<pre class="php"><span class="phpComment">//lancer la mise en cache
</span>debut_cache<span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span>
<span class="phpComment">//---------------------------------------------
</span><span class="phpComment">//afficher normalement votre page ici
</span><span class="phpComment">//elle sera mise dans le buffer
</span><span class="phpComment">//---------------------------------------------
</span>
<span class="phpComment">//afficher le contenu <span class="phpOperator">(</span>du buffer ou du fichier mis en cache<span class="phpOperator">)</span>
</span>fin_cache<span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.estrade.ca/dev/php/mise-en-cache-php.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Raccourcir une URL avec l&#8217;API de Bit.ly en PHP</title>
		<link>http://www.estrade.ca/dev/php/raccourcir-url-api-bitly-php.html</link>
		<comments>http://www.estrade.ca/dev/php/raccourcir-url-api-bitly-php.html#comments</comments>
		<pubDate>Fri, 30 Oct 2009 00:33:34 +0000</pubDate>
		<dc:creator>Emile Girard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[bit.ly]]></category>
		<category><![CDATA[programmation]]></category>

		<guid isPermaLink="false">http://www.estrade.ca/?p=964</guid>
		<description><![CDATA[Voici une petite fonction qui m&#8217;a été bien utile pour raccourcir une URL en utilisant l&#8217;API de Bit.ly et la classe SimpleXML (disponible dans PHP 5). function shorten($url, $bitly_login, $bitly_apiKey) { //bit.ly defaults $bitly_version = '2.0.1'; $bitly_history = 1; //url à interroger pour le retour via XML $connectURL = 'http://api.bit.ly/shorten?version='.$bitly_version.'&#038;amp;longUrl='.$url.'&#038;amp;login='.$bitly_login.'&#038;amp;apiKey='.$bitly_apiKey.'&#038;amp;history='.$bitly_history.'&#038;amp;format=xml&#038;amp;callback=?'; //lire le contenu retourné par [...]]]></description>
			<content:encoded><![CDATA[<p>Voici une petite fonction qui m&#8217;a été bien utile pour raccourcir une URL en utilisant l&#8217;<a href="http://code.google.com/p/bitly-api/wiki/ApiDocumentation" target="_blank">API de Bit.ly</a> et la <a href="http://php.net/manual/fr/book.simplexml.php" target="_blank">classe SimpleXML</a> (disponible dans PHP 5).</p>
<pre class="php">
<span class="phpFunctionKeyword">function</span> shorten<span class="phpOperator">(</span>$url, $bitly_login, $bitly_apiKey<span class="phpOperator">)</span>
<span class="phpOperator">{</span>
	<span class="phpComment">//bit.ly defaults
</span>	$bitly_version 	<span class="phpOperator">=</span> <span class="phpString">'<span class="phpNumber">2</span><span class="phpOperator">.</span><span class="phpNumber">0</span><span class="phpOperator">.</span><span class="phpNumber">1</span>'</span><span class="phpText">;</span>
	$bitly_history	<span class="phpOperator">=</span> <span class="phpNumber">1</span><span class="phpText">;</span>
	<span class="phpComment">//url à interroger pour le retour via XML
</span>	$connectURL <span class="phpOperator">=</span> <span class="phpString">'http<span class="phpOperator">:</span><span class="phpComment">//api<span class="phpOperator">.</span>bit.ly/shorten<span class="phpOperator">?</span>version<span class="phpOperator">=</span>'</span>.$bitly_version<span class="phpOperator">.</span><span class="phpString">'&#038;amp<span class="phpText">;</span>longUrl='</span>.$url<span class="phpOperator">.</span><span class="phpString">'&#038;amp<span class="phpText">;</span>login<span class="phpOperator">=</span>'</span>.$bitly_login<span class="phpOperator">.</span><span class="phpString">'&#038;amp<span class="phpText">;</span>apiKey<span class="phpOperator">=</span>'</span>.$bitly_apiKey<span class="phpOperator">.</span><span class="phpString">'&#038;amp<span class="phpText">;</span>history<span class="phpOperator">=</span>'</span>.$bitly_history<span class="phpOperator">.</span><span class="phpString">'&#038;amp<span class="phpText">;</span>format<span class="phpOperator">=</span>xml&#038;amp<span class="phpText">;</span>callback<span class="phpOperator">=</span><span class="phpOperator">?</span>'</span><span class="phpText">;</span>
</span>
	<span class="phpComment">//lire le contenu retourné par l<span class="phpString">'URL
</span>	$content <span class="phpOperator">=</span> <span class="phpFunction">file_get_contents</span><span class="phpOperator">(</span>$connectURL<span class="phpOperator">)</span><span class="phpText">;</span>
<span class="phpKeyword">	if </span><span class="phpOperator">(</span>$content <span class="phpOperator">!</span><span class="phpOperator"><span class="phpOperator">=</span>=</span><span class="phpKeyword"> false<span class="phpOperator">)</span></span> <span class="phpOperator">{</span>
		<span class="phpComment">//créer l'</span>object avec SimpleXML <span class="phpOperator">(</span>PHP <span class="phpNumber">5</span><span class="phpOperator">)</span>
</span>		$bitly <span class="phpOperator">=</span><span class="phpKeyword"> new </span>SimpleXMLElement<span class="phpOperator">(</span>$content<span class="phpOperator">)</span><span class="phpText">;</span>
		<span class="phpComment">//s<span class="phpString">'assurer qu'</span>il n<span class="phpString">'y a pas d'</span>erreur
</span>	<span class="phpKeyword">	if<span class="phpOperator">(</span></span>$bitly<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>errorCode <span class="phpOperator"><span class="phpOperator">=</span>=</span> <span class="phpNumber">0</span><span class="phpOperator">)</span>
		<span class="phpKeyword">	return </span>$bitly<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>results<span class="phpOperator">[</span><span class="phpNumber">0</span><span class="phpOperator">]</span><span class="phpOperator">-<span class="phpOperator">&gt;</span></span>nodeKeyVal<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>shortUrl;
	<span class="phpOperator">}</span>
<span class="phpKeyword">	return </span>>false<span class="phpText">;</span>
<span class="phpOperator">}</span></pre>
<p>Suffit donc de l&#8217;appeler de cette manière : </p>
<pre class="php">
<span class="phpComment">//vos infos bit.ly
</span>$bitly_login <span class="phpOperator">=</span> <span class="phpString">'username'</span><span class="phpText">;</span>
$bitly_apiKey <span class="phpOperator">=</span> <span class="phpString">'R_1234567898765432123456789'</span><span class="phpText">;</span>
<span class="phpComment">//appel de la fonction
</span>$shorten <span class="phpOperator">=</span> shorten<span class="phpOperator">(</span><span class="phpString">'http<span class="phpOperator">:</span><span class="phpComment">//estrade.ca'</span>, $bitly_login, $bitly_apiKey<span class="phpOperator">)</span><span class="phpText">;</span>
</span><span class="phpComment">//retourner l&#039;url raccourcie
</span><span class="phpFunction">echo</span> $shorten<span class="phpText">;</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.estrade.ca/dev/php/raccourcir-url-api-bitly-php.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Convertir des sauts de lignes en paragraphes</title>
		<link>http://www.estrade.ca/dev/php/convertir-sauts-lignes-paragraphes.html</link>
		<comments>http://www.estrade.ca/dev/php/convertir-sauts-lignes-paragraphes.html#comments</comments>
		<pubDate>Thu, 15 Oct 2009 02:25:29 +0000</pubDate>
		<dc:creator>Emile Girard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[expressions régulières]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.estrade.ca/?p=921</guid>
		<description><![CDATA[Un petit truc pratique lorsqu&#8217;on a à traiter une chaîne de texte dont les sections sont séparées par des sauts de ligne (\n ou \r) et qu&#8217;on désire séparer tout ça en paragraphes. Assumons donc que nous avons un texte du genre : $texte = "Ceci est un paragraphe \n\n En voici un deuxième \n\n [...]]]></description>
			<content:encoded><![CDATA[<p>Un petit truc pratique lorsqu&#8217;on a à traiter une chaîne de texte dont les sections sont séparées par des sauts de ligne (\n ou \r) et qu&#8217;on désire séparer tout ça en paragraphes.</p>
<p>Assumons donc que nous avons un texte du genre :</p>
<pre class="php">$texte <span class="phpOperator">=</span> <span class="phpString">"Ceci est un paragraphe \n\n En voici un
	deuxième \n\n Et finalement un troisième."</span><span class="phpText">;</span>
</pre>
<p>On s&#8217;attend donc à avoir trois paragraphes enrobés de la balise &lt;P&gt; plutôt qu&#8217;un seul bloc qui sera converti en de multiples &lt;br /&gt;, probablement via la fonction <strong>nl2br()</strong>. Voici donc l&#8217;expression régulière à utiliser pour nettoyer votre texte :</p>
<pre class="php">$texte <span class="phpOperator">=</span> <span class="phpFunction">preg_replace</span><span class="phpOperator">(</span><span class="phpString">"/<span class="phpOperator">(</span>\r\n<span class="phpOperator">)</span><span class="phpOperator">+</span><span class="phpOperator">|</span><span class="phpOperator">(</span>\n<span class="phpOperator">|</span>\r<span class="phpOperator">)</span><span class="phpOperator">+</span>/"</span>, <span class="phpString">"<span class="phpOperator">&lt;</span>/p<span class="phpOperator">&gt;</span><span class="phpOperator">&lt;</span>p<span class="phpOperator">&gt;</span>"</span>, $texte<span class="phpOperator">)</span><span class="phpText">;</span>
$texte <span class="phpOperator">=</span> <span class="phpString">'<span class="phpOperator">&lt;</span>p<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">.</span> $texte <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">&lt;</span>/p<span class="phpOperator">&gt;</span>'</span><span class="phpText">;</span>
</pre>
<p>Notez que si, explicitement dans votre texte, les sauts de ligne sont déjà remplacés par un &lt;BR /&gt;, vous n&#8217;avez qu&#8217;à utiliser cette expression régulière en lieu et place de la première : </p>
<pre class="php"><span class="phpComment"><span class="phpComment">//va convertir toutes les multiples instances de <span class="phpOperator">&lt;</span>br /</span><span class="phpOperator">&gt;</span> ou <span class="phpOperator">&lt;</span>br<span class="phpOperator">&gt;</span> ou <span class="phpOperator">&lt;</span>BR<span class="phpOperator">&gt;</span>
</span>$texte <span class="phpOperator">=</span> <span class="phpFunction">preg_replace</span><span class="phpOperator">(</span><span class="phpString">"/<span class="phpOperator">(</span><span class="phpOperator">&lt;</span>br\s*\/<span class="phpOperator">?</span><span class="phpOperator">[</span><span class="phpOperator">&gt;</span><span class="phpOperator">]</span>\s*<span class="phpOperator">)</span><span class="phpOperator">+</span>/i"</span>, <span class="phpString">"<span class="phpOperator">&lt;</span>/p<span class="phpOperator">&gt;</span><span class="phpOperator">&lt;</span>p<span class="phpOperator">&gt;</span>"</span>, $texte <span class="phpOperator">)</span><span class="phpText">;</span>
$texte <span class="phpOperator">=</span> <span class="phpString">'<span class="phpOperator">&lt;</span>p<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">.</span> $texte <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">&lt;</span>/p<span class="phpOperator">&gt;</span>'</span><span class="phpText">;</span>
</pre>
<p>Dans tous les cas, une fois que vous afficherez le texte en question, il ressemblera à ceci :<br />
&lt;P &gt;<br />
   Ceci est un paragraphe<br />
&lt;/P &gt;<br />
&lt;P &gt;<br />
   En voici un deuxième<br />
&lt;/P &gt;<br />
&lt;P &gt;<br />
   Et finalement un troisième.<br />
&lt;/P &gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.estrade.ca/dev/php/convertir-sauts-lignes-paragraphes.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Protéger la fonction mail() des injections d&#8217;en-têtes</title>
		<link>http://www.estrade.ca/dev/php/proteger-la-fonction-mail-des-injections-den-tetes.html</link>
		<comments>http://www.estrade.ca/dev/php/proteger-la-fonction-mail-des-injections-den-tetes.html#comments</comments>
		<pubDate>Wed, 14 Oct 2009 20:32:00 +0000</pubDate>
		<dc:creator>Emile Girard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.estrade.ca/?p=890</guid>
		<description><![CDATA[Vous avez développé un formulaire d&#8217;envoi par courriel utilisant la fonction mail()? Si oui, avez-vous pensé à vous protéger des injections d&#8217;en-têtes, lesquelles peuvent faire de votre beau petit script de 10 lignes un relai de spam considérable? Non? Qu&#8217;attendez-vous? Comment les spammers s&#8217;y prennent? Très simple! Il ne font qu&#8217;entrer un truc du genre [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez développé un formulaire d&#8217;envoi par courriel utilisant la fonction mail()? Si oui, avez-vous pensé à vous protéger des injections d&#8217;en-têtes, lesquelles peuvent faire de votre beau petit script de 10 lignes un relai de spam considérable? Non? Qu&#8217;attendez-vous? </p>
<h3>Comment les <em>spammers </em>s&#8217;y prennent?</h3>
<p>Très simple! Il ne font qu&#8217;entrer un truc du genre dans un champ de votre formulaire : </p>
<pre class="php">email@domaine.com \n CC<span class="phpOperator">:</span> spam1@domaine.com, spam2@domaine.com<span class="phpOperator">.</span>.<span class="phpOperator">.</span>
</pre>
<p>Les en-têtes e-mail étant très sensibles, elles considèrent le saut de ligne (\r) ou les nouvelles lignes (\n) explicites comme le début d&#8217;une nouvelle directive (ici, l&#8217;insertion d&#8217;une liste d&#8217;adresses en copie-conforme). Voyez <a href="http://www.damonkohler.com/2008/12/email-injection.html">une multitude d&#8217;<em>exploit</em> ici</a>.</p>
<h3>Comment s&#8217;en protéger?</h3>
<p>Encore une fois, rien de plus facile. Dans votre validation, vous n&#8217;avez qu&#8217;à y aller d&#8217;une petite expression régulière sur les champs soumis : </p>
<pre class="php">if <span class="phpOperator">(</span> <span class="phpFunction">eregi</span><span class="phpOperator">(</span><span class="phpString">"<span class="phpOperator">(</span>\r<span class="phpOperator">|</span>\n<span class="phpOperator">)</span>"</span>, <span class="phpScriptVar">$_GET</span><span class="phpOperator">[</span><span class="phpString">'nom'</span><span class="phpOperator">]</span><span class="phpOperator">)</span> <span class="phpOperator">|</span><span class="phpOperator">|</span> <span class="phpFunction">eregi</span><span class="phpOperator">(</span><span class="phpString">"<span class="phpOperator">(</span>\r<span class="phpOperator">|</span>\n<span class="phpOperator">)</span>"</span>, <span class="phpScriptVar">$_GET</span><span class="phpOperator">[</span><span class="phpString">'email'</span><span class="phpOperator">]</span><span class="phpOperator">)</span> <span class="phpOperator">)</span>
	<span class="phpFunction">exit</span><span class="phpOperator">(</span><span class="phpString">"Va-t&#039;en, spammer<span class="phpOperator">!</span>"</span><span class="phpOperator">)</span><span class="phpText">;</span>
</pre>
<p>N&#8217;oubliez pas de <strong>traiter chacun des champs</strong> qui sont utilisés dans la construction des en-têtes (nom, courriel, format, charset, etc.) de votre message.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.estrade.ca/dev/php/proteger-la-fonction-mail-des-injections-den-tetes.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Script de partage pour médias sociaux</title>
		<link>http://www.estrade.ca/dev/de-limportance-de-partager.html</link>
		<comments>http://www.estrade.ca/dev/de-limportance-de-partager.html#comments</comments>
		<pubDate>Tue, 17 Jun 2008 17:34:54 +0000</pubDate>
		<dc:creator>Emile Girard</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[fanatique]]></category>

		<guid isPermaLink="false">http://www.estrade.ca/?p=532</guid>
		<description><![CDATA[Je viens de créer un petit module pour Fanatique dont j&#8217;entends aussi faire bénéficier Matinternet et Showbizz dès que j&#8217;aurai quelques minutes. C&#8217;est rien de bien compliqué&#8230; seulement un bloc proposant les principaux réseaux (?) sociaux en français pour fins de sauvegarde et diffusion des articles consultés. C&#8217;est rien de bien compliqué, mais c&#8217;est fort [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="alignright" style="margin: 8px; float: right;" src="http://www.fanatique.ca/images/_blogue/partagez.jpg" alt="" width="298" height="242" /></p>
<p>Je viens de <a href="http://www.fanatique.ca/blogue/fan/125/" target="_blank">créer un petit module</a> pour Fanatique dont j&#8217;entends aussi faire bénéficier <a href="http://www.matin.qc.ca">Matinternet</a> et <a href="http://www.showbizz.net">Showbizz</a> dès que j&#8217;aurai quelques minutes. C&#8217;est rien de bien compliqué&#8230; seulement un bloc proposant les principaux réseaux (?) sociaux en français pour fins de sauvegarde et diffusion des articles consultés.</p>
<p style="text-align: left;">C&#8217;est rien de bien compliqué, mais c&#8217;est fort utile (et c&#8217;était sur ma <em>to-do list</em> depuis au moins deux éternités).</p>
<p style="text-align: left;">Et comme la notion de partage est au coeur des motivations ayant entraîné cet ajout, j&#8217;ai décidé de partager le code source du produit avec vous <img src='http://www.estrade.ca/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left;">Voici donc le package : <strong><a href="http://www.estrade.ca/wp-content/uploads/2008/06/partager.rar">partager.rar</a></strong></p>
<p style="text-align: left;">Amusez-vous!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.estrade.ca/dev/de-limportance-de-partager.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)
Object Caching 933/1027 objects using disk

Served from: www.estrade.ca @ 2012-02-07 07:14:34 -->
