107 lines
8.6 KiB
Plaintext
107 lines
8.6 KiB
Plaintext
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "../../../www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
|
|
<head>
|
|
<title>Drupal und Image: Zugriff auf Bilder (und Artikel) beschränken | Uppsala</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<style type="text/css" media="all">@import "../misc/drupal.css";</style>
|
|
<script type="text/javascript"><!--
|
|
var BASE_URL = "../";
|
|
--></script>
|
|
|
|
<script type="text/javascript" src="../misc/drupal.js"></script>
|
|
<script type="text/javascript" src="../modules/img_assist/img_assist.js"></script>
|
|
<link rel="shortcut icon" href="../misc/favicon.ico" type="image/x-icon" />
|
|
<style type="text/css" media="all">@import "../themes/chameleon/common.css";</style><style type="text/css" media="all">@import "../modules/img_assist/img_assist.css";</style><style type="text/css" media="all">@import "../themes/chameleon/marvin/style.css";</style></head><body>
|
|
<div id="header"> <a href="../default.htm" title="Startseite"><img src="../themes/chameleon/marvin/logo.png" alt="Startseite" /></a> <h1 class="site-name title"><a href="../default.htm">Uppsala</a></h1></div>
|
|
<div class="navlinks"><div class="primary"></div><div class="secondary"></div> </div>
|
|
<table id="content">
|
|
<tr>
|
|
<td id="sidebar-left"><div class="block block-user" id="block-user-0">
|
|
<h2 class="title">Benutzeranmeldung</h2>
|
|
<div class="content"><form action="/uppsala/node/84?destination=node%2F84" method="post" id="user-login-form">
|
|
<div><div class="form-item">
|
|
<label for="edit-name">Benutzername: <span class="form-required" title="Das Feld wird benötigt.">*</span></label>
|
|
<input type="text" maxlength="60" name="edit[name]" id="edit-name" size="15" value="" class="form-text required" />
|
|
</div>
|
|
<div class="form-item">
|
|
<label for="edit-pass">Passwort: <span class="form-required" title="Das Feld wird benötigt.">*</span></label>
|
|
<input type="password" name="edit[pass]" id="edit-pass" maxlength="60" size="15" class="form-text required" />
|
|
</div>
|
|
<input type="submit" name="op" value="Anmelden" class="form-submit" />
|
|
<div class="item-list"><ul><li><a href="../user/password" title="Ein neues Passwort per E-Mail anfordern.">Neues Passwort anfordern</a></li></ul></div><input type="hidden" name="edit[form_id]" id="edit-user-login-block" value="user_login_block" />
|
|
|
|
</div></form>
|
|
</div>
|
|
</div>
|
|
<div class="block block-block" id="block-block-1">
|
|
<h2 class="title">Info</h2>
|
|
<div class="content"><p><a href="86" class="bb-url">Über dieses Blog</a><br />
|
|
<a href="85" class="bb-url">Kontakt</a></p></div>
|
|
</div>
|
|
<div class="block block-menu" id="block-menu-57">
|
|
<h2 class="title">Links</h2>
|
|
<div class="content">
|
|
<ul class="menu">
|
|
<li class="leaf"><a href="http://antjesblog.martinpelzer.de/">Antjes Blog</a></li>
|
|
<li class="leaf"><a href="http://kerstin-in-schweden.blogspot.com">Kerstins Blog</a></li>
|
|
<li class="leaf"><a href="http://timo-uppsala.blogspot.com/">Timos Blog</a></li>
|
|
<li class="leaf"><a href="http://www.fiket.de/" title="Blog aus und über Schweden">Fiket</a></li>
|
|
<li class="leaf"><a href="http://www.theturnip.se/" title="Ein Online-Magazin von Nichtschweden für Nichtschweden">The Turnip</a></li>
|
|
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
<td id="main">
|
|
<div class="breadcrumb"><a href="../default.htm">Startseite</a></div><h2>Drupal und Image: Zugriff auf Bilder (und Artikel) beschränken</h2>
|
|
<!-- begin content -->
|
|
<div class="node">
|
|
<div class="content">
|
|
<p><span style="font-style:italic">Hinweis: Wer nur am Uppsala-Blog und weniger an Content-Management-Software interessiert ist, kann hier aufhören zu lesen.</span></p>
|
|
|
|
<p>Ich hatte schon länger vor, den Zugriff auf die (mit <a href="http://drupal.org/project/image" class="bb-url">Image</a> hochgeladenen) Bilder in diesem Blog derart zu beschränken, dass nur angemeldete Benutzer die Bilder in voller Auflösung betrachten können. Zunächst hatte ich nach einem Modul gesucht, das den Zugriff nach dem Typ des Nodes beschränkt um die Bilder nicht einzeln schützen zu müssen, war aber nicht fündig geworden. Also habe ich zunächst einmal <a href="http://drupal.org/project/simple_access" class="bb-url">Simple Access</a> installiert, mit dem man den Zugriff auf einzelne Nodes für bestimmte Nutzergruppen freigeben kann, zumal ich inzwischen eventuell auch einzelne Artikel schützen wollte.</p>
|
|
|
|
<p><span style="font-weight:bold">1. Bilder mit Simple Access schützen</span><br />
|
|
<span style="font-style:italic">Hinweis: Wer nur den Zugriff auf Bilder beschränken will, braucht Simple Access nicht und kann mit 2. fortfahren.</span><br />
|
|
Nach der Installation hatte ich wenig Lust, sämtliche Bilder von Hand zu schützen und habe deswegen meine SQL-Kenntnisse etwas aufgefrischt:<br />
|
|
Mit <code class="bb-code">SELECT DISTINCT * FROM `node_access` a INNER JOIN `files` f ON a.nid = f.nid ORDER BY a.nid ASC</code> habe ich zunächst alle Bilder anzeigen lassen um sicher zu sein, dass ich keine Artikel bearbeite. Den Simple-Access-Schutz aktiviert man für alle Bilder dann mit <code class="bb-code">UPDATE `node_access` As a INNER JOIN `files` AS f ON a.nid = f.nid SET `gid` = 1</code> (SQL in phpMyAdmin-Notation.)</p>
|
|
|
|
<p><span style="font-weight:bold">2. Direktzugriff auf Dateien unterbinden</span><br />
|
|
Nun werden zwar alle Image-Nodes durch Simple Access geschützt, nur merkte ich, dass der direkte Zugriff auf die Bilddateien problemlos möglich war, obwohl in den Drupal-Dateisystem-Einstellungen als Download-Methode "privat" eingestellt war. Zunächst dachte ich an ein Problem mit den Verzeichnisrechten und spielte mit htaccess-Befehlen rum, bis ich merkte, dass der Pfad, über den man die Bilder erreicht, ein virtueller ist:<br />
|
|
Während der eigentliche Pfad <a href="../files/images/chor01.preview.jpg">http://www.tilman.de/uppsala/files/images/chor01.preview.jpg</a> sehr wohl geschützt war, war das Bild in der Artikeln als <a href="../system/files/images/chor01.preview.jpg">http://www.tilman.de/uppsala/system/files/images/chor01.preview.jpg</a> verlinkt. (Ich kenne die Architektur von Drupal nicht und habe keine Ahnung, welchem Zweck dieses "system"-Verzeichnis dient.) Auch der Zugriff über GET-Parameter <a href="../@q=system_2Ffiles_2Fimages_2Fchor01.preview.jpg">http://www.tilman.de/uppsala/?q=system/files/images/chor01.preview.jpg</a> war möglich.<br />
|
|
Des Rätsels Lösung: Das Image-Modul, welches ich für das Einbinden der Bilder verwende, schert sich nicht um Benutzerrechte und gibt die Bilder an jeden, der danach fragt. (Autsch.)<br />
|
|
Der entscheidende Hinweis war dann im Drupal-Forum: <a href="http://drupal.org/node/26601#comment-54855">http://drupal.org/node/26601#comment-54855</a><br />
|
|
Den geposteten Code habe ich dann etwas angepasst und damit die Funktion <span style="font-style:italic">image_file_download</span> in <span style="font-style:italic">image.module</span> ersetzt:<br />
|
|
<pre class="bb-code-block">
|
|
// edit
|
|
// see <a href="http://drupal.org/node/26601#comment-54855">http://drupal.org/node/26601#comment-54855</a> and <a href="../@q=node_2F84">http://www.tilman.de/uppsala/?q=node/84</a>
|
|
function image_file_download($file) {
|
|
// get image from database
|
|
$result = db_fetch_object(db_query("SELECT f.*, n.type FROM {files} f LEFT JOIN {node} n ON f.nid=n.nid WHERE f.filepath='%s'", $file));
|
|
|
|
if ($result->type == 'image') {
|
|
// only allow download if its our node, and the user has privilege or it is only a thumbnail
|
|
if (user_access('view original images') || strpos($file, '.thumbnail.')) {
|
|
$headers = array('Content-Type: ' . $result->filemime);
|
|
return $headers;
|
|
}
|
|
}
|
|
|
|
// otherwise, its some other modules responsibility
|
|
return -1;
|
|
}
|
|
</pre><br />
|
|
Ergebnis: Bilder werden nur noch an registrierte Benutzer herausgegeben, oder wenn ".thumbnail." im Dateinamen vorkommt. (Drupal fügt zum eigentlichen Datei noch die Bildgröße als Suffix hinzu.)</p>
|
|
|
|
<p><span style="font-style:italic">Anmerkung:</span> Der Zugriff über den physischen Pfad auf die Bilder war bei mir immer noch möglich, was aber wohl eher mit einer Fehlkonfiguration oder meinen Spielereien zu tun hat. Dieses Problem ließ sich dann wirklich mit einer htaccess-Datei im Verzeichnis <span style="font-style:italic">files/images</span> mit dem Inhalt <pre class="bb-code-block">Deny from all
|
|
</pre> lösen.<br class="clear" /></p> </div>
|
|
<div class="links">Von Tilman am 2006-12-07 02:20 | <a href="../taxonomy/term/5" rel="tag" title="">Technik</a> | Bitte <a href="../user/login@destination=comment_2Freply_2F84_252523comment_form">anmelden</a> um Kommentare einzutragen</div>
|
|
</div>
|
|
|
|
<!-- end content -->
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|