NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Povolení obrázků pro web se zákazem přímého odkazu

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:6.5.2017 11:10

Nevím zda lze použít php, nebo něco jiného a netuším kam jinam tento dotaz dát.

Zajímalo by mne, jakými způsoby by šlo zařídit, aby se obrázky ve stránkách na webu zobrazovaly, ale pokud se zadá přímá cesta k obrázku (místo adresy webové stránky), aby byl přístup odepřen.

Webové stránky (resp. soubory *.php) jsou v adresáři /web a obrázky /web-obr (resp. celá adresa je např. /web-obr/35000/350­00q.jpg) a design obrázky v adresáři /design

Zatím mne napadlo použít .httaccess v rootu stránek

RewriteRule \.(jpg|png|jpeg|gif)$ /chyba.php [R=301,L]

zablokuje obrázky z /design, ale adresáři /web-obr se zákaz úplně vyhne, navíc blokuje i cesty v php souborech

<filesmatch "\.(jpg|png|jpeg|gif)$">
order allow,deny
deny from all
</filesmatch>

sice zablokuje všechny obrázky (včetne /web-obr), ale blokuje i cesty v php souborech

pokud k prvnímu příkladu přidám:

RewriteCond  %{HTTP_HOST} ^adresa\.cz/web-obr
RewriteRule \.(jpg|png|jpeg|gif)$ /chyba.php [R=301,L]

tak to pro změnu úplně ignoruje všechno

 
Odpovědět
6.5.2017 11:10
Avatar
Odpovídá na VelkyBubak
Neaktivní uživatel:6.5.2017 14:15

Ahoj, čeho se vlastně snažíš dosáhnout s těmi obrázky? Co znamená zákaz přímého odkazu a co povolení pro web?

Nahoru Odpovědět
6.5.2017 14:15
Neaktivní uživatelský účet
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na VelkyBubak
Petr Čech:6.5.2017 16:12

Ne, to opravdu jednoduše nejde. Můžeš to vzdát. Pokud není obrázek dostupný z adresní řádky, není dostupný ani z webu.
Pokud by to bylo klíčové, dá se to udělat třeba tak, že bys to zobrazoval jako BLOB s klíčem, který jde použít jen jednou, ale potom se rozbije cokoliv není první načtení stránky, prostě mnoho věcí. Ale nezapomeň, že vždy může uživatel udělat screenshot.
Jestli se nesnažíš zobrazovat třeba nějaká umělecká díla, vykašlal bych se na to.

Nahoru Odpovědět
6.5.2017 16:12
the cake is a lie
Avatar
VelkyBubak
Člen
Avatar
Odpovídá na Petr Čech
VelkyBubak:7.5.2017 7:42

Freedep:

  1. Jako zákaz přímého odkazu si představuji, že když do adresního řádku libovolného webového prohlížeče zadám absolutní cestu k obrázku, bude přístup odepřen a obrázek se nezobrazí
  2. Povolení zobrazení pro web, chápu tak že brázky na stránce budou vidět
  3. chtěl bych dosáhnout obojího zároveň (ad body 2 a 3)

Petr Čech:
Jednoduše, nebo vůbec? Ne, umělecká díla nemám, ale chci se pokusit eliminovat podvádění (povědšinou prováděné pomocí google vyhledávání obrázků), v poznávací hře.

Pvní nápad byl nějak blokovat cestu, aby google nemohl načíst obrázek z adresy (a to určitě nějak jde, z uživatelského pohledu jsem to už někde potkal), ale pokud by se povedlo to co jsem nastínil na začátku, byl bych radši.

Další možnosti co mě teď napadly, možná by šlo obrázek překrýt průhledným divem, aby bylo pro uživatele obtížnější zjistit cestu, nebo ho pomocí grafické knihovny z php vylepšit tak, aby ho google nepoznal. Screenshotu se samozřejmě nevyhnu.

 
Nahoru Odpovědět
7.5.2017 7:42
Avatar
mkub
Tvůrce
Avatar
Odpovídá na VelkyBubak
mkub:7.5.2017 8:21

priehladny div uzivatelovi nezabrani, aby si zobrazil zdrojovy kod stranky a nahliadol, kde je ulozeny dany obrazok...

a ako napisal Peter Cech, tak to, co chces, je velmi zlozite, lebo ked k danemu suboru (v tomto pripade k obrazku) nie je pouzitelny link, tak sa ti nenacita ani na webstranke

a navyse ani nikto nepouziva taketo praktiky, lebo implementacia je narocnejsia, nez vysledny efekt

 
Nahoru Odpovědět
7.5.2017 8:21
Avatar
Odpovídá na VelkyBubak
Michal Štěpánek:7.5.2017 10:11

Nikdy jsem to nedělal, je mi to tak trochu proti srsti, ale mělo by jít ukládat obrázky přímo do DB, pak je ručním zadáním v adresním řádku nezobrazíš...
tady něco takového řeší...
http://www.onlamp.com/…p_mysql.html

Nahoru Odpovědět
7.5.2017 10:11
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na VelkyBubak
Petr Čech:7.5.2017 11:16

Jde o to, že jakmile to uživatelovi ukážeš, on si vždy cestu najde a ty s tím nemáš šanci cokoliv udělat. Existuje pár opatření, ale jak jsem již řekl, moc tomu nezabráníš:

  • zakážeš right-click - méně kreativní uživatelé nezjistí zdroj
  • můžeš načítat obrázek jako base64 z DB . To se dá ale zadat do adresního řádku a normálně se ti to ukáže (Chrome).
  • //extrém obrázek budeš mít v DB a nikde nebude <img> tag. Místo toho budeš mít <canvas>. Pomocí JS pošleš AJAX request, který ti vrátí obrázek třeba jako string, který pomocí JS převedeš vykreslíš na plátno. To sice odradí prakticky každého, ale zase budeš muset přenášet nekomprimovaný obrázek (pokud nechceš dělat dekomprimaci v JS :D ).
Nahoru Odpovědět
7.5.2017 11:16
the cake is a lie
Avatar
Neaktivní uživatel:7.5.2017 19:59

Tak ono stačí mít obrázky někde ve skryté složce a vždy, když si uživatel vyžádá stránku, která obsahuje obrázky 1, 2 a 3, tak si uložit session, že teď k těm obrázkům má přístup. V praxi by to fungovalo tak, že když si načte patřičnou stránku, tak bude moct po nějakou malou dobu ty obrázky otevírat i z adresního řádku, ale kdyby to poslal kamarádovi, nebo by na to odkazoval odněkud jinud, tak nebude mít přístup. Myslím, že tak to řeší blog.cz, pak třeba můžeš vidět, že když obrázky hledáš přes google, tak se ti tam ukáže ta hláška "klikni zde pro plné rozlišení". To právě proto, že nemáš u nich nic uloženo, že jsi tu stránku navštívil...

Nahoru Odpovědět
7.5.2017 19:59
Neaktivní uživatelský účet
Avatar
Lava
Člen
Avatar
Lava:9.5.2017 8:24

A ako to rieši shutterstock a podobné obrázkové banky? Aby si si nemohol stiahnuť hocijaký obrázok, ale musel ho kúpiť?

Nahoru Odpovědět
9.5.2017 8:24
Aspartám, sacharín, to je môj vitamín
Avatar
Honza
Člen
Avatar
Odpovídá na Lava
Honza:9.5.2017 8:30

To se často řeší tak, že dají pro náhled obrázek jen v menším rozlišení a taky do něj ještě vloží nějaký vodotisk.

Nahoru Odpovědět
9.5.2017 8:30
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Jiří Fencl
Člen
Avatar
Jiří Fencl:9.5.2017 9:31

Proc neudelas v htaccess jednoduchou podminku na referrer? Pak budou obrazky na webu, ale prime linky nepojednou

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?povolenadomena\.cz [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?dalsipovolenadomena\.cz [NC]
RewriteRule \.(gif|png|jpe?g|js|css)$ - [F,NC,L]
 
Nahoru Odpovědět
9.5.2017 9:31
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:10.5.2017 14:35

Jiří Fencl:
zkusil jsem

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(anime\.|dorama\.|manga\.|neanime\.|postavy\.|odpocet\.|faq\.|hadej\.|j-music\.)mujportal\.cz [NC]
RewriteRule \.(gif|png|jpe?g|js|css)$ - [F,NC,L]

a pak pro jistotu i

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://anime\.mujportal\.cz [NC]
RewriteCond %{HTTP_REFERER} !^http://dorama\.mujportal\.cz [NC]
...
RewriteRule \.(gif|png|jpe?g|js|css)$ - [F,NC,L]

s těmito výsledky:

  1. přímé odkazy k obrázkům mi fungují
  2. překvapivě jsou viditelné obrázky i na některých portálech které jsem nejmenoval
  3. u vyjmenovaných portálů jsou střídavě některé obrázky viditelné a jiné nikoliv (přestože uloženy jsou zhruba na stejném místě)
  4. na portálu na kterém mi nejvíc záleží (hádej) se vůbec nezobrazí obrázky k hádání, přestože je mezi vyjmenovanými, ale přímá cesta k obrázkům funguje

přesto chci věřit, že to nejakým podobným způsobem půjde

Editováno 10.5.2017 14:36
 
Nahoru Odpovědět
10.5.2017 14:35
Avatar
Jiří Fencl
Člen
Avatar
Jiří Fencl:10.5.2017 14:43

Zkus jeste procist dokumentaci promo od apache a zkusit uvozovkovat - me to jde i bez nich, ale nepises nic o konfiguraci serveru

 
Nahoru Odpovědět
10.5.2017 14:43
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:11.5.2017 10:59

Dobře, mám pocit, že vám uniká,, jak fungují prohlížeče, komunikace klient/server a co všechno může klient, proto se pokusím vnést trochu světla do toho, proč to není nic jednoduchého.

  • Jakmile něco zobrazíte klientovi, vždy se najde klient, který si ten obsah prostě vezme - jak mu třeba zabráníte v tom, aby si udělal plugin, co mu udělá screenshot přesně toho vašeho obrázku? Nijak.
  • Mnoho z vás navrhuje, aby se to chránilo různými sessions a perličkami http požadavku. Přitom si vůbec neuvědomujete, že prohlížeč už má obrázek zacachovaný, takže nepošle další http request, místo toho načte, co má v cachi a řekne, že to je to je obrázek na té adrese. To, že by mu server vynadal, pokud by se ho pokusil načíst, už mu je jedno.
  • Server nijak neví, jestli se jedná o renderování uvnitř stránky nebo o zadání do adresního řádku. Ten prostě dostane požadavek na obrázek a až prohlížeč se rozhodne, co s ním udělá.

Ze všech předcházejících důvodů vyplývá, že to nejde nikdy udělat 100% a určitě ne pomocí klasických obrázků (<img>).
Dá se udělat něco, co jsem psal předtím, ale vždy to půjde obejít.

Nahoru Odpovědět
11.5.2017 10:59
the cake is a lie
Avatar
mkub
Tvůrce
Avatar
Odpovídá na Petr Čech
mkub:11.5.2017 11:36

plny suhlas s tymi dovodmi...
server ozaj nedokaze rozlisit, ci dany obrazok bol nacitany bud cez stranku, alebo iba pomocou URL odkazu, o tom rozhoduje jedine klient, cize ani .htaccess tu nebude fungovat a zaroven .htaccess je specialitkou servera Apache, ine webservery nemusia pouzivat tento subor a navyse moze byt v konfiguracii aj vypnuta podpora tohto suboru,..

 
Nahoru Odpovědět
11.5.2017 11:36
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:11.5.2017 22:51

Ok.
Server jede na debianu a .httaccess soubory běžně používáme, takže v tom problém nevidím.
Vím že všemu nezabráním - sám mám linux a takové Shift + PrintScreen prostě neobejdu.
Na drubou stranu nevidím důvod proč bych to neměl zkusit uživatelům ztížit.

Asi nejde požadovat od prohlížeče aby cashe neuchovával, že?

 
Nahoru Odpovědět
11.5.2017 22:51
Avatar
Odpovídá na VelkyBubak
Neaktivní uživatel:11.5.2017 23:58

Tohle tema mam rad.
Chapu to spravne, ze ty ty obrazky poskytujes i jinym webum pro zobrazeni? Nebo to jsou tvoje weby, ty portaly o kterych mluvis?

Libi se mi kam miri Petr Cech. Prijde mi ze jasne vystihuje podstatu problemu.
Hodne komplexne kanonem na komara se to da resit i takhle:
Obrazky nacitas javascriptovou funkci, ktera zasle jmeno souboru na tvuj backend, ten vytvori jedinecny endpoint s omezenou platnosti (casove nebo poctem nacteni), kde vystavi budto obrazek, nebo treba jen obrazek v base64 nebo necem takovym, nebo jako binarni data. JSkova funkce dostane zpet to url a stahne obrazek. Tim by sis osetril to, ze proste kouknou do zdrojaku a copy pastnou url obrazku do google images.

Kdyz to udelas v kombinaci s canvasem, tak nepujde ani obrazek ulozit na lokalu a uploadnout na google images rucne.

Screenshot neosefis, bohuzel. ALE mohl bys, kdybys trosku ustoupil pohodlnosti. Trochu jsem patral a zjistil jsem, ze snapchat resil screenshotovani tak, ze na iOSu screenshot vyvolava zruseni vsech touch eventu, takze oni vynutili aby se user dotykal screenu nebo tak neco. A kdybys to udelal stejne. Pises ze je to hra. Tak by to tolik vadit nemuselo, kdyz to das jako soucast game UX. Sleduj, das JSkovou funkci, ktera zobrazi cernej obdelnik, samozrejme se uz bude na pozadi stahovat ten obrazek ze serveru a tak zejo. Ale jakmile user bude chtit zobrazit obrazek, musi na nej kliknout a drzet mys stisknutou. Tim nemuze porizovat screenshot mysi, ale muze klavesnici, bohuzel nejde ani odchytit stisk klavesy printscreen.

[tohle ber jen jako joke]
ALE napadlo me jeste neco, kdybys udelal to, ze JSkem budes problikavat obrazek a cernou obrazovku hodne casto, je celkem slusna sance, ze kdyz user udela printscreen, sem tam se mu objevi prazdne misto (https://jsfiddle.net/…ll/rqzjy45p/) - akorat asi bude problem s epeleptikama.
[konec joke]

Takze kdyz pouzijes to rozumne co jsem napsal ja a Petr Cech, v podstate bys mel odfiltrovat masivni vetsinu pokusu o obejiti problemu.

Nahoru Odpovědět
11.5.2017 23:58
Neaktivní uživatelský účet
Avatar
Odpovídá na VelkyBubak
Neaktivní uživatel:12.5.2017 7:08

Tohle se bohužel na straně serveru asi nevyřeší. Ve chvíli kdy má uživatel obrázek zobrazený v prohlížeči je už mimo kontrolu, přesně jak psal Petr Čech.

Pokud se jedná o poznávací hru a chceš to ztížit hráčům, můžeš omezit čas na odpověď, generovat náhodnou sadu obrázků/otázek, zakázat right click a podobně. Ale počítej s tím, že pokud uživatel bude chtít tak si cestu najde.

Nahoru Odpovědět
12.5.2017 7:08
Neaktivní uživatelský účet
Avatar
Odpovídá na Lava
Neaktivní uživatel:12.5.2017 7:10

Myslím, že vodoznakem a pro stažení generují náhodnou url.

Nahoru Odpovědět
12.5.2017 7:10
Neaktivní uživatelský účet
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:12.5.2017 8:32

Taskkill:
doménu (je jen jedna) má kompletně na starosti kamarád, včetně instalace serveru
já mám přístup k ftp a mohu měnit scripty a .httaccess
portály jsou vytvořené z vybraných složek v kořenovém adresáři právě pomocí .httaccess, a všechny jsou moje

 
Nahoru Odpovědět
12.5.2017 8:32
Avatar
Neaktivní uživatel:12.5.2017 10:36

Myslím si, že v tomhle případě, je asi nejlepší řešení blob. :)

Nahoru Odpovědět
12.5.2017 10:36
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 21 zpráv z 21.