{"id":415,"date":"2009-09-19T12:31:32","date_gmt":"2009-09-19T10:31:32","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=415"},"modified":"2009-09-19T12:31:32","modified_gmt":"2009-09-19T10:31:32","slug":"anhange-in-wordpress-richtig-machen","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=415","title":{"rendered":"Anh\u00e4nge in WordPress richtig machen"},"content":{"rendered":"<p>Ich nutze hier im Blog Anh\u00e4nge eher selten, weshalb mir der Fehler auch bisher nicht wirklich aufgefallen ist. Und selbst dann war es eher ein Zufall, dass ich gestern darauf gesto\u00dfen bin: Grob gesagt: WordPress nutzt ein Pass-Through f\u00fcr Downloads, d.h. generiert URLs die auf die eigentlichen zu downloadenden Dateien zeigen. Das ist an sich erstmal nicht schlimm und bietet sogar, gerade bei Anh\u00e4ngen, die M\u00f6glichkeit, dass der Apache diese Cachen kann. Problematisch wird dies aber in einem Fall, der bei mir aufgetreten war.<!--more--><\/p>\n<p>Ich hatte wie sicherlich viele gelesen haben werden, meinen 1kLOC-Templater vorgestellt und in den Post auch gleich den Templater zum Download anbinden wollen. Einmal abgesehen davon, dass in WordPress 2.8.4 mal wieder ein Evil-Modifier eingebaut ist (zum Korrigieren der URL des Attachments) und ich daher erstmal mein WordPress patchen musste, um die Datei \u00fcberhaupt verlinken zu k\u00f6nnen, zeigte der generierte Download-Link weit ab jeglicher Dateien, die zum Download freigegeben waren &#8211; und enthielt im konkreten Fall sogar Teile des Server-Pfades, die eigentlich nicht sichtbar sein sollten. Ein kurzes Eingreifen in die Pfad-Einstellungen unter &#8222;Verschiedenes&#8220; (ich h\u00e4tte das eher unter Mediathek erwartet &#8230;) l\u00f6ste zumindest dieses Problem. <\/p>\n<p>Bliebe noch der kritischere Punkt: Das Upload-Verzeichnis enth\u00e4lt die Download-F\u00e4higen Dateien mit ihrem originalen Namen in unver\u00e4nderter Form. D.h. die TTemplater.php meines 1kLOC-Templaters lag im besagten Verzeichnis unver\u00e4ndert und wurde beim Versuch sie zu downloaden &#8211; da .php genannt &#8211; vom Apachen an PHP zur Ausf\u00fchrung \u00fcbergeben &#8211;> 0 Byte Output.<\/p>\n<p>Die L\u00f6sung f\u00fcr einen funktionierenden Download &#8211; und der gleichzeitigen Verbesserung der Sicherheit &#8211; bringt eine kleine .htaccess-Datei im Upload-Verzeichnis:<\/p>\n<pre lang=\"apache\" escaped=\"true\">RemoveHandler .php .php3 .php4 .php5 .htm .html .cgi .fcg .fcgi\r\nphp_value engine off<\/pre>\n<p>Die erste Zeile verhindert hierbei die Ausf\u00fchrung der Datei \u00fcber die CGI-Schnittstelle, w\u00e4hrend die zweite Zeile die Ausf\u00fchrung \u00fcber mod_php deaktiviert. Ein php_admin_value geht in .htaccess-Dateien verst\u00e4ndlicherweise nicht zu setzen; w\u00fcrde aber auch wenig Sinn ergeben.<\/p>\n<p>Mit dieser kleinen \u00c4nderung in der Konfiguration k\u00f6nnen nun in meinem Blog auch PHP-Files angeh\u00e4ngt werden, ohne dass ich mir Gedanken dar\u00fcber machen m\u00fcsste, dass diese ausgef\u00fchrt w\u00fcrden. Auch versehentlich in dieses Verzeichnis gelegte Dateien werden nun 1:1 zur\u00fcckgegeben.<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=415&amp;md5=c8631fda3125455a003b433f0f39e070\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Ich nutze hier im Blog Anh\u00e4nge eher selten, weshalb mir der Fehler auch bisher nicht wirklich aufgefallen ist. Und selbst dann war es eher ein Zufall, dass ich gestern darauf gesto\u00dfen bin: Grob gesagt: WordPress nutzt ein Pass-Through f\u00fcr Downloads, d.h. generiert URLs die auf die eigentlichen zu downloadenden Dateien zeigen. Das ist an sich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[156,346],"class_list":["post-415","post","type-post","status-publish","format-standard","hentry","category-server","tag-apache","tag-server"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=415"}],"version-history":[{"count":1,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/415\/revisions"}],"predecessor-version":[{"id":416,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/415\/revisions\/416"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}