{"id":954,"date":"2012-01-26T00:01:14","date_gmt":"2012-01-25T23:01:14","guid":{"rendered":"http:\/\/www.manuelmarangoni.it\/sir-bit\/?p=954"},"modified":"2016-01-14T14:13:17","modified_gmt":"2016-01-14T13:13:17","slug":"php-gestire-lo-slash-davanti-ai-caratteri-pericolosi-e-la-direttiva-magic_quotes_gpc","status":"publish","type":"post","link":"https:\/\/www.manuelmarangoni.it\/sir-bit\/954\/php-gestire-lo-slash-davanti-ai-caratteri-pericolosi-e-la-direttiva-magic_quotes_gpc\/","title":{"rendered":"PHP &#8211; Gestire lo slash davanti ai caratteri pericolosi e la direttiva magic_quotes_gpc"},"content":{"rendered":"<p>Quando lasciate all\u2019utente la possibilit\u00e0 di inserire un testo o un commento, che poi andr\u00e0 a salvarsi nel vostro database, dovete <strong>assicurarvi che alcuni caratteri particolari (come gli apostrofi) non vadano a danneggiare la query<\/strong>, provocando degli errori sconfortanti.<br \/>\nQuesto pu\u00f2 avvenire intenzionalmente (l\u2019utente, cio\u00e8, \u00e8 consapevole del danno e sta cercando di attaccare volontariamente il vostro database; il termine tecnico \u00e8 <em>query injections<\/em>), ma anche casualmente: in tal caso la colpa sar\u00e0 solo nostra.<\/p>\n<p>Per evitare simili disastri, ci vengono in soccorso due funzioni native del PHP:<br \/>\n&#8211; <code>addslashes()<\/code> aggiunger\u00e0 il backslash (\\) davanti agli apici (\u2018), doppi apici (\u201c) e ai backslash (\\) presenti nella stringa passata. Dovr\u00e0 essere usata prima di salvare le stringhe nel database.<br \/>\n&#8211; <code>stripslashes()<\/code> far\u00e0 il procedimento inverso, togliendo i backslash davanti ai suddetti caratteri e dovr\u00e0 essere usata una volta estratta la stringa del database e prima di stamparla a video.<!--more--><br \/>\nUn esempio:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000088;\">$stringa<\/span><span style=\"color: #339933;\">=<\/span>\"Questa \u00e8 una stringa di prova con l\u2019apostrofo\"<span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000088;\">$stringa2<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #990000;\">addslashes<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$stringa<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #b1b100;\">echo<\/span> <span style=\"color: #000088;\">$stringa2<\/span><span style=\"color: #339933;\">;<\/span> <span style=\"color: #666666; font-style: italic;\">\/\/ dar\u00e0 come risultato \"Questa \u00e8 una stringa di prova con l\\\u2019apostrofo\"<\/span>\r\n<span style=\"color: #b1b100;\">echo<\/span> <span style=\"color: #990000;\">stripslashes<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$stringa2<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span> <span style=\"color: #666666; font-style: italic;\">\/\/dar\u00e0 come risultato la stringa iniziale<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Facciamo un passo in avanti.<br \/>\nIl <em>php.ini<\/em> del nostro Apache ha al suo interno la direttiva <code>magic_quotes_gpc<\/code> (la sigla &#8220;gpc&#8221; sta per &#8220;get post cookies&#8221;). Quando questa \u00e8 impostata sul valore \u201con\u201d, non avremo bisogno di usare la funzione <code>addslashes()<\/code> nel salvare le nostre stringhe nel database, perch\u00e9 <strong>ci penser\u00e0 autonomamente il server ad aggiungere i backslashes<\/strong> in tutti i valori GET, POST o COOKIES.<\/p>\n\n<p>Per correttezza, devo <strong>sconsigliare l&#8217;uso di questa direttiva per due motivi<\/strong>:<br \/>\n1) In genere i server hanno di default la direttiva a on, ma pu\u00f2 capitare in caso di trasferimento del sito di trovarci di fronte a un server con la direttiva impostata a <em>off<\/em>. In questo caso, dovremmo aggiungere manualmente la funzione <code>addslashes()<\/code> alle nostre stringhe, perdendo inutilmente del tempo.<br \/>\n2) La direttiva \u00e8 deprecata in PHP5 e sar\u00e0 del tutto rimossa con PHP6 per ragioni di efficienza.<\/p>\n<p><strong>Un uso migliore e pi\u00f9 performante \u00e8 avvalersi della funzione <code>mysql_real_escape_string()<\/code><\/strong>. L&#8217;unico problema nel suo uso \u00e8 che se la direttiva <code>magic_quotes\u00ad_gpc<\/code> \u00e8 attiva, ci sar\u00e0 un doppio inserimento di slash ai caratteri pericolosi.<br \/>\nUn modo per ovviare al problema \u00e8 creare uno script che, a seconda del caso, usi o meno la funzione <code>mysql_real_escape_string(<\/code>). A questo scopo ci torner\u00e0 utile un&#8217;altra funzione, <code>get_magic_quotes_gpc()<\/code>, che per l&#8217;appunto controlla se la direttiva \u00e8 attiva:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #b1b100;\">if<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #990000;\">get_magic_quotes_gpc<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">)<\/span>\r\n\t<span style=\"color: #b1b100;\">return<\/span> <span style=\"color: #990000;\">mysql_real_escape_string<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #990000;\">stripslashes<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$string<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #b1b100;\">else<\/span>\r\n\t<span style=\"color: #b1b100;\">return<\/span> <span style=\"color: #990000;\">mysql_real_escape_string<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$string<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>In questo modo qualsiasi stringa passata avr\u00e0 lo slash davanti ai caratteri pericolosi.<br \/>\nDove solo ricordarvi di applicare la funzione <code>stripslashes()<\/code>quando i dati saranno recuperati dal database.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando si lascia agli utenti la possibilit\u00e0 di inserire dati nel nostro database, \u00e8 utile controllare le stringhe per proteggerci da eventuali attacchi mirati.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78],"tags":[4,30],"class_list":["post-954","post","type-post","status-publish","format-standard","hentry","category-php-mysql","tag-php","tag-sicurezza","cat-78-id"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/954"}],"collection":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/comments?post=954"}],"version-history":[{"count":12,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/954\/revisions"}],"predecessor-version":[{"id":2263,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/954\/revisions\/2263"}],"wp:attachment":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/media?parent=954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/categories?post=954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/tags?post=954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}