Jak na HTTPS (Hypertext Transfer Protocol Secure)?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
i.magine
Člen | 81
+
0
-

S routováním nemám naprosto žádné zkušenosti, každopádně bych potřeboval, aby se při přihlášení přešlo na https. To znamená zadám jméno a heslo, ono se mě to zeptá na certifikát, odkliknu a od teď už se komunikace bude odehrávat pouze v https, dokud se zase neodhlásím. Neví někdo jak na to? Potřeboval bych nakopnout správným směrem.

Routování nemám na serveru žádné, jedu přes normální adresy co mi generuje Nette. Ani nevím jestli je zapnutý mod_rewrite.

Díky

despiq
Člen | 320
+
0
-
<?php
$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'Dashboard',
	'action' => 'default',
	'id' => NULL,
), Route::SECURED);
?>
Ondřej Mirtes
Člen | 1536
+
0
-

Nezapomeň, že je potřeba mít už samotný formulář (před odesláním) na stránce s HTTPS, jinak hrozí, že se heslo pošle po nezabezpečené síti.

Majkl578
Moderator | 1364
+
0
-

Ondřej Mirtes: Pochybuji, že data by se na zabezpečenou stránku poslala nezabezpečeně.

despiq
Člen | 320
+
0
-

to se stejne nestane, kdyz bude mit login formular v ty samy aplikaci tak ho stejne router posle na https hned, a mit udelanej formular mimo tu aplikaci by nedavalo smysl

i.magine
Člen | 81
+
0
-

Ahoj,
abych řekl pravdu tak to úplně nechápu. Tohle

new Route('<presenter>/<action>/<id>',

by mi mělo předělat routy na tvar adresy napr /Auth/default/ … chapu to dobre? Ale já nepotřebuju předělávat tvar adresy, já pouze potřebuju přidat https…

'presenter' => 'Dashboard',

To má znamenat presenter Dashboard který pojede zabezpečeně? Ale co když chci aby po přihlášení jela celá stránka zabezpečeně, to znamená i ta která před přihlášením jela normálně přes http?

Jinak dělám dobře když dávám tyhle routovací příkazy do bootstrap.php?

Díky všem za pomoc

Aurielle
Člen | 1281
+
0
-

Příznak, který zajistí HTTPS, je Route::SECURED. Části array jako presenter, action a id nastavují výchozí presenter a action.

$router[] = new Route('<presenter>/<action>/<id>', array(
        'presenter' => 'Dashboard',
        'action' => 'default',
        'id' => NULL,
), Route::SECURED);
i.magine
Člen | 81
+
0
-

Aha… tak teď už to chápu ..takže jsem v bootstrapu udělal něco takovéhleho:

if ($user->isAuthenticated()){

  $router = $application->getRouter();
  $router[] = new Route('?presenter=<presenter>&action=<action>', array(
          'presenter' => 'Default',
          'action' => 'default',
          'id' => NULL,
  ), Route::SECURED);

}

A funguje dobře, a teď ještě jedna otázka, co když budu chtít zabezpečit ještě presenter Register, když ještě nejsem přihlášen?

Editoval i.magine (25. 4. 2010 10:36)

Aurielle
Člen | 1281
+
0
-

Co prostě přepnout celou aplikaci na HTTPS?

i.magine
Člen | 81
+
0
-

Rozhodně by to bylo jednodušší, ale tohle je školní úkol, a zadání je, že jenom část aplikace poběží pod https… Neptej se mě proč :-).

Majkl578
Moderator | 1364
+
0
-

Pokud nechceš hezké url, použij SimpleRouter.

i.magine
Člen | 81
+
0
-

Ahoj, tak jinak… pokud chci nastavit routovani pouze pro jeden presenter, napr. Register

$router[] = new Route('?presenter=Register', array(
    'presenter' => 'Register',
    'action' => 'default',
), Route::SECURED);

Myslel jsem, že by to mohlo fungovat takhle. Že když vlezu na ?presenter=Register tak mě to přesměruje na zabezpečenou verzi presenteru. Bohužel mi každou stránku přesměruje právě na presenter Register.

Díky za pomoc

redhead
Člen | 1313
+
0
-

To je také správně, nepochopil jsi funkci toho pole. To pole určuje pouze jaké hodnoty se mají nastavit (defaultní) pokud nejsou uvedeny v URL. Ten ?presenter=Register sám o sobě nic neznamená, totiž neví, že se jedná o parametr určující presenter, čili se použije defaultní Register.

Zkus něco takového:

$router[] = new Route('?presenter=<presenter Register>', array(
    'action' => 'default',
), Route::SECURED);

Ta routa by měla být první v pořadí. Ještě je potřeba 2. routa pro ostatní presentery a to by měla být ta standardní.

Ale nevím, jestli teď nebude https fungovat jenom pro Register..

Editoval redhead (26. 4. 2010 17:20)

i.magine
Člen | 81
+
0
-

Tak jo, něco jsem dal dohromady:

    $router[] = new Route('?presenter=<presenter Register>', array(
    'presenter'=>'Default',
    'action' => 'default',
), Route::SECURED);

  $router[] = new Route('?presenter=<presenter>&action=<action>', array(
          'presenter' => 'Default',
          'action' => 'default',
          'id' => NULL,
  ));

Chtěl jsem tam dát jenom samotnou action ale řvalo to, že chybí presenter tak jsem ho tam dopsal.
No ale pořád to nešlape, teď jede zase celá aplikace v https. A to ať tam tu druhou routu dám anebo ne…

Etch
Člen | 403
+
0
-
$router[] = new Route('?presenter=<presenter Register>', array(
'action' => 'default',
), Route::SECURED);

$router[] = new Route('?presenter=<presenter>&action=<action>', array(
      'presenter' => 'Default',
      'action' => 'default',
      'id' => NULL,
));
i.magine
Člen | 81
+
0
-

Etch:

Tohle už jsem zkoušel a hází tohle…

InvalidStateException
Missing presenter in route definition.

Tak už fakt nevím… to opravdu neexistuje něco jak zabezpečit jednu samostatnou stránku v nette? Opravdu nerad bych psal do protokolu, že to v nette prostě nejde …

i.magine
Člen | 81
+
0
-

Zdravím tak jsem se trochu díval po Routingu v Nette a rozjel Routing Debugger, a možná že jsem narazil na jádro pudla:

Na stránce ?presenter=Register (má být pod https) ukazuje:

Matched by Route "?presenter=<presenter Register>&action=<action>"
Matched?   Class	Mask						Defaults
yes	   Route	?presenter=<presenter Register>&action=<action>	action = default
may	   Route	?presenter=<presenter>&action=<action>		presenter = Default action = default

A na stránce ?presenter=Default (nemá být pod https) ukazuje:

Matched by Route "?presenter=<presenter Register>&action=<action>"
Matched?	Class	Mask						Defaults
yes		Route	?presenter=<presenter Register>&action=<action>	action = default
may		Route	?presenter=<presenter>&action=<action>		presenter = Default action = default

Otázka tedy je proč se to matchuje tou první routou a ne tou druhou? „?presenter=<presenter Register>&action=<action>“ by měl přece vzít jenom stránku která ma jako první parametr Register, nebo ne? Připomínám, použité routy :

$router[] = new Route('?presenter=<presenter Register>', array(
'action' => 'default',
), Route::SECURED);

$router[] = new Route('?presenter=<presenter>&action=<action>', array(
      'presenter' => 'Default',
      'action' => 'default',
      'id' => NULL,
));

Editoval i.magine (28. 4. 2010 15:20)

Etch
Člen | 403
+
0
-

Problém bych viděl pravděpodobně v ? na začátku routy.

Pokud by si použil routy ala:

$router[] = new Route('<presenter register>/<action>/<id>',array(
	'action' => 'default',
	'id' => NULL),
	Route::SECURED);

$router[] = new Route('<presenter>/<action>/<id>',array(
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL));

tak by to fungovalo zcela normálně

Jan Tvrdík
Nette guru | 2595
+
0
-
$router[] = new Route('?presenter=register', array(
    'presenter' => 'Register',
    'action' => 'default',
), Route::SECURED);

$router[] = new Route('?presenter=<presenter>&action=<action>', array(
    'presenter' => 'Default',
    'action' => 'default',
    'id' => NULL,
));