{"id":122,"date":"2009-04-26T16:01:52","date_gmt":"2009-04-26T14:01:52","guid":{"rendered":"http:\/\/www.fantascienza.com\/blog\/blackpig\/?p=122"},"modified":"2009-04-26T16:01:52","modified_gmt":"2009-04-26T14:01:52","slug":"errori-connessioni-db","status":"publish","type":"post","link":"https:\/\/luigirosa.com\/index.php\/2009\/04\/26\/errori-connessioni-db\/","title":{"rendered":"Ancora sugli errori: connessioni al database"},"content":{"rendered":"<p>Riprendo di nuovo il tema degli errori, dopo <a title=\"Messaggi di errore\" href=\"http:\/\/luigirosa.com\/2008\/08\/messaggi-di-errore\/\">averne parlato la scorsa estate<\/a>.<\/p>\n<p>Una buona diagnostica degli errori \u00e8 fondamentale per qualsiasi linguaggio di programmazione, ma nel caso di linguaggi per il web molti dettagli dovrebbero essere tenuti abbastanza nascosti agli utenti quando la procedura va in produzione.<\/p>\n<p><!--more-->Un esempio tipico \u00e8 il verificarsi di un problema di connessione al database che impedisce il caricamento dei contenuti di un sito. Per capire cosa sto dicendo provate a <a href=\"http:\/\/www.google.it\/search?q=warning+mysql_connect+\" target=\"_blank\" rel=\"noopener\">cercare su Google la stiringa warning mysql_connect &#8220;access denied for user&#8221; &#8220;using password&#8221;<\/a>; se andate un po&#8217; in l\u00e0 nei risultati cominciate a trovare non pi\u00f9 le pagine che descrivono questo errore, ma i siti in cui si verifica questo errore. La visualizzazione sulla pagina del client di questa diagnostica \u00e8 abbastanza pericolosa perch\u00e9 pu\u00f2 rivelare informazioni utili per eventuali attacchi al sito. Ecco due esempi di diagnostica consegnata al browser del visitatore:<\/p>\n<p><strong>Warning<\/strong>: mysql_connect() [function.mysql-connect]: Access denied for user &#8216;festival&#8217;@&#8217;localhost&#8217; (using password: YES) in <strong>\/home\/www\/if\/old\/functions.php<\/strong> on line <strong>86<\/strong><\/p>\n<p>Microsoft OLE DB Provider for SQL Server error &#8216;80040e4d&#8217; Login failed for user &#8216;mediamanager&#8217;. \/V1\/Playlist.asx, line 30<\/p>\n<p>Nella prima diagnostica non solo diciamo a tutto il mondo che stiamo utilizzando MySQL, ma riveliamo il nome dell&#8217;utente con cui ci connettiamo al database e il path assoluto dei file nel sito web; in questo modo un attaccante che vuole leggere, ad esempio, il file \/etc\/passwd sa che il path relativo a functions.php \u00e8 ..\/..\/..\/..\/..\/etc\/passwd<\/p>\n<p>Se il server HTTP e il linguaggio utilizzato lo prevedono (e di solito lo prevedono), la prima azione da intraprendere \u00e8 ovviamente la disabilitazione dell&#8217;invio di ogni tipo di messaggio al client, limitandosi a tenere un log locale degli errori.<\/p>\n<p>Dal momento che, come nel primo esempio, l&#8217;apertura della connessione al server SQL avviene solitamente in un solo punto del programma, per evitare questo tipo di problema \u00e8 sufficiente testare il valore ritornato dalla funzione di connessione e, in caso di errore, visualizzare una pagina di cortesia in cui si dice che il sito \u00e8 temporaneamente in manutenzione o qualcosa del genere. Attenzione a mettere la diagnostica dettagliata dell&#8217;errore tra commenti HTML come fa, per esempio, <a title=\"Flickr\" href=\"http:\/\/www.flickr.com\/\" target=\"_blank\" rel=\"noopener\">Flickr<\/a> perch\u00e9 non sono l&#8217;unico io ad andare a vedere il sorgente HTML di questo tipo di pagine&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Riprendo di nuovo il tema degli errori, dopo averne parlato la scorsa estate. Una buona diagnostica degli errori \u00e8 fondamentale per qualsiasi linguaggio di programmazione, ma nel caso di linguaggi per il web molti dettagli dovrebbero essere tenuti abbastanza nascosti agli utenti quando la procedura va in produzione.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"local","activitypub_max_image_attachments":3,"footnotes":""},"categories":[11,20,25],"tags":[209,305,373,423],"class_list":["post-122","post","type-post","status-publish","format-standard","hentry","category-informatica","category-programmazione","category-sicurezza","tag-errore","tag-messaggio","tag-programma","tag-sicurezza"],"_links":{"self":[{"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/posts\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/comments?post=122"}],"version-history":[{"count":0,"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/posts\/122\/revisions"}],"wp:attachment":[{"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/media?parent=122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/categories?post=122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/luigirosa.com\/index.php\/wp-json\/wp\/v2\/tags?post=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}