Mit ‘php’ getaggte Artikel

Passwortschutz für Bilder

Montag, 13. August 2012

Weil es doch immer wichtiger wird zu kontrollieren wer im Internet Bilder sehen darf und wer nicht kann man Inhalte in WordPress recht einfach mit einem Passwort schützen.
Ich nutze das beliebte NextGen Gallery PlugIn für WordPress. Dabei bleibt aber leider das Problem, dass der direkte Link zu dem Bild weiterhin ohne Schutz ist. Eigentlich ist das kein so großes Problem, da ich ja nichts verbotenes online stelle und man den Link zum Bild erraten müsste, aber irgendwie unbefriedigend ist es schon. Denn die Pfade und Bildnamen sind jetzt nicht so kompliziert.
Also habe ich mal geschaut, was es da so für Möglichkeiten schon gibt, habe aber auf die Schnelle nichts gefunden und bevor ich viel weiter suche, programmiere ich mir halt selbst schnell was zusammen.

Um die Bilder zu schützen dürfen sie nicht direkt ausgeliefert werden. Daher habe ich eine .htaccess Datei einmal in den Nextgen Ordner mit den Bilder-Subfoldern und einmal in das Uploads Verzeichnis gelegt, der per mod_rewrite bei Aufruf einer .jpg Datei auf eine PHP umleitet.

.htaccess
<FilesMatch "\.(jpg|jpe?g)$">
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !.*/thumbs/.*
    RewriteRule (.*) /image.php?i=%{REQUEST_URI} [R]
</FilesMatch>

Die Nextgen Thumbs habe ich jedoch ausgeschlossen, da die auch ohne Passworteingabe angezeigt werden müssen.
Die PHP Datei image.php im Root empfängt den Bild-Pfad und prüft nun die Rechte.

  • Ist das Bild in der Nextgen Datenbank hinterlegt?
  • Ist es von der Anzeige ausgeschlossen?
  • Gehört es zu einer Passwort-geschützen Nextgen Gallery Seite?
  • Ist das richtige Passwort gesetzt?

Wenn das Bild nicht zu einer Galerie gehört…

  • Ist das Original-/Vollbild ein Anhang zu einer geschützten Seite?
  • Ist das Passwort gesetzt?

Die Vorschaubilder und Bilder die zu keiner Seite gehören sind davon ausgenommen und werden direkt angezeigt.
Wenn das Bild nicht ausgeliefert werden darf wird ein transparentes 1×1 Pixel PNG ausgeliefert.

image.php
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/wp-config.php');
$pathinfo = pathinfo($_GET['i']);
if ($pathinfo['extension'] == 'jpg'){
  $path = $pathinfo['dirname'];
  $file = $pathinfo['basename'];
  $filename = $pathinfo['filename'];
  if (file_exists($_SERVER['DOCUMENT_ROOT'].$path.'/'.$file)){
    $gallery_row = $wpdb->get_row($wpdb->prepare("SELECT gid, pageid FROM " . $table_prefix . "ngg_gallery WHERE path = %s ", substr($path, 1)));    
    $gid = $gallery_row->gid;    
    $pageid = $gallery_row->pageid;    
    if($pageid > 0){
      $pic_row = $wpdb->get_row($wpdb->prepare("SELECT pid, COUNT(*) AS 'counter' FROM " . $table_prefix . "ngg_pictures WHERE galleryid = %s AND filename = %s AND exclude = 0", $gid, $file));
      $pid = $pic_row->pid;    
      $filecount = $wpdb->get_var($query);  
      if($filecount > 0){
        $thispost = get_post($pageid); 
        if (!post_password_required($pageid)){
          deliverImage($path, $file);
        }
      } 
    } else {
      $pageid = $wpdb->get_var($wpdb->prepare("SELECT post_parent FROM " . $table_prefix . "posts WHERE post_type = 'attachment' AND post_mime_type = 'image/jpeg' AND post_name = %s ", $filename));    
      if($pageid > 0){
        $thispost = get_post($pageid); 
        if (!post_password_required($pageid)){
          deliverImage($path, $file);
        }
      } else {
        deliverImage($path, $file);
      }
    }
  }
}
header('Content-disposition: inline; filename="_.png"');
header('Content-transfer-encoding: binary');  
header('Content-type: image/png');
$im = imagecreate(1, 1);
$white = ImageColorAllocate($im, 0xFF, 0xFF, 0xFF);
ImageFilledRectangle($im, 0, 0, 1, 1, $white);
imagecolortransparent($im, $white); 
ImagePng($im);
ImageDestroy($im);
exit();

function deliverImage($path, $file){
  header('Content-disposition: inline; filename="' . $file . '"');
  header('Content-transfer-encoding: binary');  
  header('Content-type: image/jpeg');
  readfile($_SERVER['DOCUMENT_ROOT'] . $path . '/' . $file);
  exit();
}
?>

Also eigentlich recht einfach und effektiv. Diese Funktionalität lässt sich natürlich recht einfach auf andere Dateitypen erweitern. Viel Spaß beim Nachbauen…

Polaroid

Dienstag, 3. November 2009

Nachdem ich in der letzten freien Woche doch nicht dazu gekommen bin, mein Adressdaten WordPress Plugin weiter zu schreiben, habe ich mich heute Abend mal kurz meinem „PlaceIt“ WP-Plugin gewitment, dass mir verschiedene frei verschiebbare Objekte auf meiner derivart Seite anzeigt. Zur Zeit funktioniert es wegen eines DIV Problems (auf meiner Page) nur in Firefox, aber wer nutzt schon IE. Jedenfalls habe ich es so erweitert, dass es nicht nur ein Dia generiert, sondern aus der NGG Gallery auch noch ein Polaroid.

p.s.: Ich befürchte nur, das die Seite so ein wenig zu voll wirkt… *grübel*

Handgeschriebene Headlines

Mittwoch, 30. September 2009

Gestern hat ein Kollege auf Facebook einen Link zu einem interessanten Tool gepostet: fontcapture
Das musste ich natürlich gleich ausprobieren. Aber mit dem coolen Grafiktablets von Wacom kann man sich den Umweg über ausdrucken und einscannen sparen. Einfach das PDF in ein Bildbearbeitungsprogramm laden, die „Felder“ mit den eigenen Buchstaben füllen — neben dem Bamboo eignet sich das intuos4 bzw. das Cintiq super dafür — als PNG abspeichern und hoch laden.
Aber wie nun diese coole eigene Schrift einsetzen? Geht ja leider nur in PDFs oder Bildern. Also schnell das eigene WP-PostIt PlugIn damit ausgestattet und ein kleines PHP Script geschrieben, das mit die Headlines in diesem Blog in Bilder mit dieser Schrift umwandelt. Aber seht selbst…

Update 30. März 2010:

Leider leitet die Seite fontcapture.com seit einiger Zeit auf yourfonts.com. Der dortige ähnliche Dienst ist aber leider nicht mehr kostenlos. Außerdem gibt es noch fontifier.com, der aber auch kostenpflichtig ist.

URL dieser Seite: http://inmemoriam.novacorps.com/2009/09/handgeschriebene-headlines/
Dieser Artikel wurde am Mittwoch, 30. September 2009 um 15:40 Uhr erstellt.
Sofern nicht anders angegeben, steht der Inhalt unter einer „Namensnennung-Keine kommerzielle Nutzung-Keine Bearbeitung 3.0 Deutschland“ Lizenz.