Images schützen


#1

Moin Leute,

ich will eine kleine Anwendung erstellen auf der ich Bilder hochladen
kann, die dann
für jeden User(Freunde) einsehbar sind, der einen Zugang hat.
Wie kann ich sicherstellen, dass nur die Leute, die registriert sind,
die Bilder einsehen
können. Wenn ich die Bilder beim Upload in den public Folder speichere
kriege ich die
ja nicht gescheit geschützt. Die Bilder in der Datenbank speichern
wollte ich nicht so gern.

Kennt jemand ein Plugin, hat eine Idee…

Vielen Dank
und
Viele
Grüße,
Daniel_______________________________________________
rubyonrails-ug mailing list
removed_email_address@domain.invalid
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug


#2

Hi Daniel,

On Fri, Nov 28, 2008 at 03:39:55PM +0100, Daniel Boekhoff wrote:

ich will eine kleine Anwendung erstellen auf der ich Bilder hochladen
kann, die dann
für jeden User(Freunde) einsehbar sind, der einen Zugang hat.
Wie kann ich sicherstellen, dass nur die Leute, die registriert sind,
die Bilder einsehen
können. Wenn ich die Bilder beim Upload in den public Folder speichere
kriege ich die
ja nicht gescheit geschützt. Die Bilder in der Datenbank speichern
wollte ich nicht so gern.

Wozu ein Plugin? Das kannst du direkt selbst hinprogrammieren.

Ich habe etwas ähnliches in einer Bewerbenfunktion, bei der Bilder
mit hochgeladen werden können. Die soll sonst auch niemand sehen.

Im Model “bewerben” habe ich dazu image_column wie folgt umdefiniert:
image_column :bild1, :store_dir => proc{|record, file|
“…/…/pictures/#{record.id}/”}

Dadurch wird pro Datensatz im Rails-Root ein Unterverzeichnis unter
/pictures angelegt. Da es nicht unterhalb von public ist, kann dort
kein Zugriff stattfinden.

Dann gibt es die Funktion zum Ausliefern des Bilds:

class Admin::BewerbenController < ApplicationController
layout ‘admin’
before_filter :login_required

[…]

def bild
bewerben = Bewerben.find(params[:id])
filename = “pictures/” + params[:id].to_s + “/” +
bewerben.bild1.filename

send_file(filename, :type => File.mime_type?(filename), :disposition 

=> ‘inline’)
end
end

Das Bild wird über Rails ausgeliefert durch einen Controller, der eine
Anmeldung vorher erfordert. Der Mime-Type wird mittels diesem Plugin
http://code.google.com/p/mimetype-fu/ ermittelt.

Wenn das ganze hochperformant sein soll, kann man an der Geschwindigkeit
sicher noch optimieren. Aber das ist bei mir nicht der Fall gewesen und
klingt bei dir auch nicht unbedingt danach, oder?

Jan


Jan T. Mail: removed_email_address@domain.invalid
ETES GmbH Fon : +49 (7 11) 48 90 83 - 17
Gablenberger Hauptstrasse 32 Fax : +49 (7 11) 48 90 83 - 50
D-70186 Stuttgart Web : http://www.etes.de/

Registergericht: Amtsgericht Stuttgart HRB 721182
Geschäftsführende Gesellschafter: Markus Espenhain und Jan T.
Sitz der Gesellschaft: Stuttgart
USt.-Id.Nr.: DE814767446


#3

Daniel Boekhoff wrote:

wollte ich nicht so gern.

Kennt jemand ein Plugin, hat eine Idee…

Die Bilder ausserhalb des DocumentRoot speichern und durch Apache mit
mod_x_sendfile nach Authentifizierung ausliefern lassen.

Jonathan


Jonathan W.
http://blog.innerewut.de
http://twitter.com/jweiss


#4

Hallo,

2008/11/28 Jan T. removed_email_address@domain.invalid:

Wozu ein Plugin? Das kannst du direkt selbst hinprogrammieren.

Im Model “bewerben” habe ich dazu image_column wie folgt umdefiniert:
image_column :bild1, :store_dir => proc{|record, file| “…/…/pictures/#{record.id}/”}

Dadurch wird pro Datensatz im Rails-Root ein Unterverzeichnis unter
/pictures angelegt. Da es nicht unterhalb von public ist, kann dort
kein Zugriff stattfinden.

Oder man verwendet einfach ein Plugin namens Paperclip, bei dem man
ebenfalls den Base-Pfad konfigurieren kann. Wenn man will, kann man da
noch eingreifen und den Filename “hashen” lassen
(Digest::SHA1.hexdigest(“meinbild.jpg”)), damit man die URLs nicht
erraten kann.

Andreas R.


#5

Hi,

kann mir jemand sagen, wie ich Bilder oder andere Daten, die nicht im
Public-Verzeichnis liegen, in einer View anzeigen kann?
Bei Benutzung von send_file erhalte ich unter normaler Verwendung von
REST die Fehlermeldung:

Can only render or redirect once per action

Ich möchte nicht nur ein einzelnes Bild in einer leeren Seite anzeigen,
sondern das normale Layout verwenden und z.B. alle Bilder aus einer
Galerie lediglich für registrierte Benutzer darstellen.

Vielen Dank bereits


#6

Moin Jan, Moin Jonathan,

danke für Eure Tipps! Das ist ja einfacher als ich gedacht hatte, sehr
schön,werde ich gleich mal am Wochenende umsetzen.

Daniel

Am 28.11.2008 um 15:51 schrieb Jonathan W.:


#7

Hi Sebi,

Da musst ein return dranhängen
send_file … and return

In der API ist auch noch der Hinweis auf X-Sendfile.
:x_sendfile - uses X-Sendfile to send the file when set to true. This
is currently only available with Lighttpd/Apache2 and specific modules
installed and activated. Since this uses the web server to send the
file, this may lower memory consumption on your server and it will not
block your application for further requests. See blog.lighttpd.net/
articles/2006/07/02/x-sendfile and tn123.ath.cx/mod_xsendfile/ for
details. Defaults to false.

ciao, tom

Am 04.02.2009 um 10:40 schrieb Sebastian K.:

anzeigen,
sondern das normale Layout verwenden und z.B. alle Bilder aus einer
Galerie lediglich für registrierte Benutzer darstellen.


Thomas R. “TomK32” Koll <> http://ananasblau.com
just a geek trying to change the world
http://github.com/TomK32


#8

Hi Sebi,

Also, jetzt wär’s natürlich nett zu wissen ob du ein plugin
verwendest für den upload. attachment_fu oder paperclip?

Eigentlich wollt ich jetzt empfehlen einen eigenen controller
dafür anzulegen aber wenn’s nur der user ist und auch immer
nur ein einziges Bild dann war deine show methode schon
sehr nah dran.

def show
@person = Person.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @person }
format.jpg { send_file @person.photo_url, :type => ‘image/
jpg’, :disposition =>
‘inline’ }
end
end

wahrscheinlich muss du noch jpg als mime-type registrieren.
Mime::Type.register “image/jpg”, :jpg

ciao, tom

Am 04.02.2009 um 12:01 schrieb Sebastian K.:

Sorry - bin leider noch Rails-Anfänger :).

Und ich hatte dich als Mega-Super-Pro eingeschätzt. My bad.


Thomas R. “TomK32” Koll <> http://ananasblau.com
just a geek trying to change the world
http://github.com/TomK32


#9

Hi Tom,

vielen Dank bereits. Leider versteh ich es noch nicht so ganz :/.
Momentan habe ich z.B. im Model “Person” für jeden Benutzer ein Bild
gespeichert (bzw. den Pfad dazu). Die Bilder sollen allerdings nur für
registrierte Benutzer sichtbar sein und liegen außerhalb des
public-Verzeichnisses.

def index
@people = Person.find(:all)
respond_to do |format|
format.html
format.xml { render :xml => @people }
end
end

Gibt es nun eine Möglichkeit in der Index-View für jeden Benutzer das
zugehörige Bild anzuzeigen?
Wie sähe das für einen einzelnen Benutzer mit dem sendfile/return aus?

def show
@person = Person.find(params[:id])
send_file @person.photo_url, :type => ‘image/jpg’, :disposition =>
‘inline’
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @person }
end
end

Sorry - bin leider noch Rails-Anfänger :).
Vielen Dank für die Mühe bereits!

Da musst ein return dranh�ngen
send_file … and return


#10
  format.jpg { send_file @person.photo_url, :type => 'image/

jpg’, :disposition =>
‘inline’ }

Verwende derzeit Paperclip. Mit ‘format’ schaffe ich es doch lediglich
durch http://url.tld/people/1.jpg das Bild des Benutzers anzusehen? Es
steht dabei aber nicht in der Html-View. Ich will die Bilder ja nicht
“nur” herunterladen, sondern in einer Gallerie/Profil anzeigen (ohne,
dass ein unangemeldeter Benutzer darauf Zugriff hat).

Viele Grüße


#11

dann probier mal nen controller zu bauen, der dir immer die bilder
anzeigt, dann kannst du image_tag die url für den controller übergeben
und in dem controller auch per before filter oder wie auch immer,
schauen, ob der user angemeldet ist oder nicht und wenn nicht, gibst
du ne fehlermeldung oder sonst was aus…

also in deinem image controller brauchste dann ne art show action die,
dir bilder ausgibt… dem musst du halt irgendwie sagen, was für
bilder er ausgeben soll… müsste aber über die routes.rb gehen…

gruß
manu

Am 04.02.2009 um 13:22 schrieb Sebastian K.:


#12

Am 04.02.2009 um 13:22 schrieb Sebastian K.:

 format.jpg { send_file @person.photo_url, :type => 'image/

jpg’, :disposition =>
‘inline’ }

Verwende derzeit Paperclip. Mit ‘format’ schaffe ich es doch lediglich
durch http://url.tld/people/1.jpg das Bild des Benutzers anzusehen?

Glaub mir, genau das willst du. Verlink die Bilder in deiner index view.
Geschützt sind die Bilder dann genauso wie es das User Profil ist.

Es
steht dabei aber nicht in der Html-View. Ich will die Bilder ja nicht
“nur” herunterladen, sondern in einer Gallerie/Profil anzeigen (ohne,
dass ein unangemeldeter Benutzer darauf Zugriff hat).

deutsch: Galerie
englisch: gallery

ciao, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
just a geek trying to change the world
Skype: TomK32 || Mail: removed_email_address@domain.invalid
http://flickr.com/people/tomk32