Autor Zpráva
XolyCZ
Profil
Ahoj mám dotaz. Dělám na webu nějaké online účty a když si nepředělám sám adresu na https://..., tak mi tam skáčou upozornění na nezabezpečenou stránku. Ví někdo jak to například pomocí php nebo .htaccess souboru přesměrovat automaticky? Něco mě napadá, ale nejsem si jistý, jestli to nebude vracet vždycky na tu stránku, když někdo zadá adresu a k tomu ještě jméno souboru, který ho odkáže třeba na kontaky nebo něco. Našel jsem třeba tohle, co se píše do htaccess Redirect 301 www.forthewin.cz/index.php?str=uvod. Dá se to takhle použít? Nemůžu si to momentálě vyzkoušet, protože se nemůžu dostat na hosting, ale tipuju, že to bude odkazovat vždycky na ten index.php, když otevřu i jiný soubor.

Další možnost jsem našel tohle
# presmerovani z http na https
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
, ale to mi dělá smyčku na webu a nenačte ho, nevím proč. Díky za rady :D
Beavis
Profil
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
XolyCZ
Profil
Beavis:

Tohle mi to vyhodí
Keeehi
Profil
XolyCZ:
To znamená, že máš někde něco, co tě nejspíše přesměrovává zpět na http a tak vznikla smyčka. To můžou způsobovat nějaká další pravidla co máš v htaccess, nebo to může přesměrovávat samotná aplikace a nebo to klidně může být v prohlížeči nakešované 301 přesměrování které sice dříve bylo v htaccess souboru a ty jsi ho sice smazal, jenže ono zůstalo uložené právě v keši tvého prohlížeče.

Základem je zjistit, jaké poloupnosti URL na sebe přesměrovávají (což by mělo jít ve vývojářských nástrojích prohlížeče) a z toho pak odvodit jaké staré přesměrování ti tam zůstalo, nebo kde v těch nových máš logickou chybu.
XolyCZ
Profil
htaccess soubor měl a má jenom toto:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A600
ExpiresByType text/javascript A31536000
ExpiresByType application/javascript A31536000
ExpiresByType text/css A1
ExpiresByType image/gif A1209600
ExpiresByType image/png A1209600
ExpiresByType image/jpeg A1209600
ExpiresByType image/jpg A1209600
ExpiresByType image/x-icon A1209600
ExpiresByType text/html A1
</IfModule>
<Files index.php>
Header append Cache-Control "public, must-revalidate"
</Files>
# Komprese
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip
#Header append Vary User-Agent
# DeflateCompressionLevel 9
# DeflateFilterNote Input instream
# DeflateFilterNote Output outstream
# DeflateFilterNote Ratio ratio

# presmerovani z http na https
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Aplikací nevím přesně co máš na mysli, ale na index.php žádné přesměrivání při otevření nemám.

Vlezl jsem do těch nástrojů, ale nevím kde to tam mám přesně najít, zrovna tohle jsem nikdy nehledal. Poradíš mi prosím tě? A jestli je to v prohlížeči a je to z těch stránek, tak to znamená, že to mají i všichni ostatní. Takže by to mohl být problém. Tomuhle se mi ale nechce moc věřit :D
Keeehi
Profil
XolyCZ:
htaccess soubor měl a má jenom toto:
Má i teď? Protože teď se nic na nic nespřesměrovává. Momentálně je dostupná všech těchto 4 adresách http://forthewin.cz/ http://www.forthewin.cz/ https://forthewin.cz/ https://www.forthewin.cz/
Pokud htaccess vypadá takto, tak by první dvě možnosti měly být přesměrované na ty dvě další. *

Aplikací nevím přesně co máš na mysli, ale na index.php žádné přesměrivání při otevření nemám.
Ano, aplikací je myšlena tvoje stránka. Nevím jestli ti to běží na nějakém CMS, nebo jestli jsi to napsal celé sám nebo jsi to postavil na nějakém frameworku. Pokud by jsi to stavěl na nějakém připraveném systému tak téměř snad všechny dnes řeší hezké url a proto dle potřeby přesměrovávají. Chybnou konfigurací se mohou dostat do konfliktu s pravidly v htaccess a proto mi přišlo správné to zmínit jelikož je to dost pravděpodobný scénář i když teď po prohlédnutí kódu je nanejvýš pravděpodobné, že jsi to celé napsal sám.

Vlezl jsem do těch nástrojů, ale nevím kde to tam mám přesně najít
Klasicky se to jmenuje Network / Síť. Je tam vypsaný seznam požadavků, které stránka udělala. Například když vlezeš na stránku seznamu bez https na začátku, tak výpis může vypadat takto. Nejdříve tam je ten požadavek na nezabezpečenou verzi ale výsledek byl 302 přesměrování. Takže je tam požadavek na novou url, který skončil úspěšně a tak za ním následují další požadavky na styly, skripty, obrázky a další prvky stránky. V tvém případě by jsi tam měl vidět seznam nejspíše dvou stále se opakujících se požadavků, které neustále přesměrovávají jeden na druhý. Když si na ten pořadavek klikneš, tak uvidíš další podrobnosti. Zejména tě zajímá na jakou url ten požadavek poslal a jaká byla odpověď.

A jestli je to v prohlížeči a je to z těch stránek, tak to znamená, že to mají i všichni ostatní.
Tak to znamená, že stejný problém mohou mít i jiní lidé. Museli však na tvou stránku přijít a jejich prohlížeč si tu informaci musel uložit. Pokud na tvé stránce nikdy nebyli a nebo se ta informace o přesměrování do jejich prohlížeče neuložila či se smazala, pak ten problém nemají. Celé to platí ale pouze za předpokladu, že to přesměrování je způsobené jen jeho uložením v keši prohlížeče. Pokud je to něčím jiným, pak ten problém mohou mít i další lidé včetně těch, co na tvé stránce nikdy nebyly.
Jestli je to způsobené keší prohlížeče se dá většinou lehce ověřit tak, že si otevřeš anonymní okno a v něm se podíváš na tu stránku. Při použití anonymního okna prohlížeč nepoužívá data z kaší před jeho spuštěním jelikož existují metody, jak by se z těchto keší daly vytáhnout určité identifikátory a to by pak anonymní moc nebylo.


*Když už jsme u toho tak nejen že by jsi měl http přesměrovávat na https ale i variantu bez www na variantu s www. Kvůli bezpečnosti v pořadí nejdříve protokol (http) a pak následně ještě jedno přesměrování pro kanonizaci domény (www).
XolyCZ
Profil
No já jsem to z tama akorát smazal, aby ta stránka byla dostupná, protože by to dělalo každému, když mi to teda nejde ani v tom anonymním režimu.

Díval jsem se na ten výpis té sítě, zrovna do totoho už jsem párkrát lezl, ale asi jsem to od tebe špatně pochopil, nevadí. Je tam pořád ten samý odkaz.


Chápu co tím chceš říct, ale já z mých zkušeností nevím co s tím mám dělat, protože zas tak pokročilý nejsem. Ten web jsem si psal celý sám a je to na hostingu od Acive24.


*A věděl bys co s tím? Protože já jsem hledal různě a fakt nevím. Nikdy jsem tohle nedělal.
Keeehi
Profil
XolyCZ:
Dobře. Podle toho obrázku nejde o přesměrovávání mezi dvěma a více stránkami, ale jen o jednu která přesměrovává stále sama na sebe. Přesměrování pomocí 302 se nekešuje, takže tím se keš dá vyloučit a kód 302 je defaultní přesměrování v htaccess pokud u rewriterule u flagu R neuvedeš kód. Takže problém bude na 99% právě s htaccess souborem a jen s ním. Zřejmě je podmínka RewriteCond %{HTTPS} off splněná i když je web na https. To se může stát u složitěji poskládaných sítí. Například pokud se na jednom serveru dešifrují všechny požadavky a ty jsou následně už nešifrovaně předávány dovnitř sítě na webservery které je odbavují. Což bude případ právě i tvého hostingu, ostatně to píšou na svém webu. faq.active24.com/cz/098327-htaccess-editace-specifika#HTTPShtacces
Nevím, proč v tom příkladu mají stále řádek RewriteCond %{HTTPS} !on když píšou, že nefunguje. Sice tam ničemu nevadí ale je zbytečný.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,QSA,NE]

Až to otestuješ, můžeš k flagům přidat R=301 které zajistí, že přesměrování se nakešuje. Což pomáhá bezpečnosti, protože ten první požadavek je nezabezpečený a dá se při něm spojení unést. Při příštím přístupu se už automaticky použije https varianta, takže se spojení nebude dát unést. Samozřejmě do doby, než platnost v keši vyprší.

Pro následné přesměrování z varianty bez www na tu s www přidej za to
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,QSA,NE]
Po ověření funkčnosti můžeš zase přidat R=301. Už to sice není o zvýšení bezpečnosti ale ušetří to požadavek na server.
XolyCZ
Profil
Jo, už to něco dělá. Problém je ale s R=301 a s tím přesměrováním na www. Když tam přidám to přesměrování na www, hodí to chybu, že to server neumí zpracovat. Když se na to ale dívám, tak ten server asi přesměrovává na www sám, protože se mi to tam objeví automaticky i s https. Druhá věc je to R=301, kdy to hodí tu samou chybu. Jinak ta stránka posílá požadavek 302, kdyby to bralo to R=301, bude to posílat 301, jestlito chápu dobře? Ale asi zpětně. Nebo teda nevím, jestli se to píše jako 4. flag nebo ne, nevím totiž co ty flagy znamenají :D.
mckay
Profil
XolyCZ:
Jestliže stránka má být dostupná pouze přes HTTPS, určitě zvažte přidání Strict-Transport-Security hlavičky po tom, co Vám začnou běhat redirecty. PHP kód, který to zavede by mohl vypadat takto:

<?php 
// Musí být provedeno dříve než je vypsán jakýkoliv výstup (tedy i před jakýmkoliv bílým znakem)
header('strict-transport-security: max-age:31536000; includeSubDomains');
?>

Hlavička zajistí, že nebude umožněno uživatelům používat stránku přes HTTP (a tedy útočníci v síti nebudou moci číst jejich komunikaci se stránkou, ani nebudou schopní provést protokol downgrade útoky). Hodnota max-age je nastaven na dobu jednoho roku - a tak dlouho si prohlížeč bude pamatovat, že má na stránku rovnou chodit přes HTTPS (automatický 301 redirect na straně prohlížeče pro případ, že uživatel pokusí přijít na stránku přes HTTP). Hodnota includeSubDomain říká, že by to mělo být respektováno i pro subdomény (a pokud si nepřejete/nemůžete zajistit, že subdomény budou mít validní HTTPS certifikát, tento parametr neuvádějte).

Posledním doporučitelným krokem by bylo přidat ještě třetí hodnotu, za středník preload a vyplnit aplikaci pro přidání na preload list dle pokynů na hstspreload.org. Přidání preloadu způsobí, že moderní prohlížeče už budou rovnou vědět, že Vaše doména má být servírována pouze přes HTTPS a tedy uživatelům rovnou upgradeují požadavky, které nešly přes HTTPS.
XolyCZ
Profil
mckay:
Dal jsem to tam. Ještě se tak blbě zeptám, stačí to v souboru index.php?
Keeehi
Profil
XolyCZ:
Nebo teda nevím, jestli se to píše jako 4. flag nebo ne, nevím totiž co ty flagy znamenají :D.
Většinou se píše na začátek ale na pořadí flagů by nemělo záležet. [R=301,L,QSA,NE]

Když se na to ale dívám, tak ten server asi přesměrovává na www sám, protože se mi to tam objeví automaticky i s https.
Ne, momentálně se přesměrovává jen z http na https. Když do adresního řádku ručně napíšu http://forthewin.cz a zmáčknu enter, tak se po přesměrování objevím na https://forthewin.cz. Na tom obrázku je vidět, že první požadavek šel na verzi s www a proto byl přesměrován také na verzi s www.

HSTS hlavička se dá přidat už v htaccess souboru a nemusí se tím zatěžovat PHP.
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Nicméně má to své stinné stránky. Předně si musíš být jistý, že http verzi prakticky nikdy nebudeš chtít vrátit, protože to budeš moci udělat nejdříve až za rok po té co by jsi tu hlavičku ze serveru odstranil. Pokud by jsi tam přidal ten preload, tak to nemůžeš už udělat nikdy. V důsledku to znamená že vždy budeš muset být schopný technicky https zajistit. Tedy máš na výběr jen z hostingů které https podporují, musíš spoléhat na to, že LetsEncrypt bude fungovat nebo být připraven na to, že když by náhodou skončili, tak si budeš muset certifikáty kupovat.
HSTS je dobrá věc, jen je potřeba si být jistý, protože jak to jednou zapneš už se to těžko vrací zpět.
XolyCZ
Profil
Keeehi:
No, tak už jsem to tam vložil. Ale tak aspoň o tom teda vím :D. To přesměrovávání na www mělo problém s mezerama za čárkou u těch tagů, teď jsem to oddělal a funguje to, takže se to přesměruje i z https na www. Díky moc :)
Keeehi
Profil
XolyCZ:
No, tak už jsem to tam vložil. Ale tak aspoň o tom teda vím :D
Pokud ti tam zatím nikdo nepříšel, tak to můžeš stále ještě beztrestně odstranit. A těm pár co tam přišli to v prohlížeči vydrží rok. Samozřejmě rozhodnutí je na tobě.

To přesměrovávání na www mělo problém s mezerama za čárkou u těch tagů,
OK, psal jsem to spíš z hlavy, takže tu a tam se nějaká chybička vyskytne. Hlavně že ti to už funguje. Původní příspěvky jsem opravil aby to už nikoho nezmátlo.
XolyCZ
Profil
Keeehi:
Ještě prosím tě, když je to tu rozjeté, jak jednoduše ověřím, že v nějaké proměnné není žádná hodnota? Například z <input>. Vím, že je to přes podmínku, která se musí rovnat nebo nerovnat nečemu, ale nevím s čím to mám porovnat. Když jsem tam dal prázdné apostrofy, nefungovalo mi to.
Keeehi
Profil
XolyCZ:
Zda někdo něco vyplnil do inputu se nejlépe ověří pomocí empty
if(!empty($_POST["name"])) {
    // něco tam je
} else {
    // nic tam není
}

Ještě prosím tě, když je to tu rozjeté
Témata by se neměla míchat. Na nové nesouvisející problémy by jsi měl vždy zakládat nové téma. Tato diskuze má výpis všech témat nezávisle na jejich kategorií řazený podle nejnovějších příspěvků. Takže ti co to sledují vidí veškeré změny na celém fóru. Nemusíš se bát, že by se tvůj dotaz v novém vláknu ztratil.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: