Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月23日 at 16:03

菱川さん >

考慮いたただきましてありがとうございます!

某セキュリティ会社のセキュリティチェックで「MIDDLE」の指摘を受けたところで、
「ログイン以降はhttpsにする」ということで対策を宣言したのですが、
つまずいてしまった次第です。


一旦、こちらでもとりあえずの回避をしたので、共有します。
resolverをいじって、httpsアクセスの時の判定に追加しました。


▼ CanonicalUrlResolver.php
/application/src/Url/Resolver/CanonicalUrlResolver.php へ

・namespace変更

・resolve変更
public function resolve(array $arguments, $resolved = null) {
$url = Url::createFromUrl('');

$url->setHost(null);
$url->setScheme(null);

----ここから追加 -------
$ssl = false;
$u = new \User();
try {
$ssl = $u->isLoggedIn();
} catch (\Exception $e) {
}

$request = \Request::getInstance();
if ($request && strpos($request->getPath(), "/login") === 0){
$ssl = true;
}

----ここからまで -------

if (\Config::get('concrete.seo.canonical_url')) {
$canonical = UrlImmutable::createFromUrl(\Config::get('concrete.seo.canonical_url'));

----ここから追加 -------
if ($ssl && \Config::get('concrete.seo.canonical_ssl_url')) {
$canonical = UrlImmutable::createFromUrl(\Config::get('concrete.seo.canonical_ssl_url'));
}
----ここからまで -------
$url->getHost()->set($canonical->getHost());
$url->getScheme()->set($canonical->getScheme());
if (intval($canonical->getPort()->get()) > 0) {
$url->getPort()->set($canonical->getPort());
}




▼application/bootstrap/app.php
以下を追加
--------------------------------
// CanonicalUrlResolver override
Core::singleton(
'url/canonical/resolver',
function () {
return new \Application\Src\Url\Resolver\CanonicalUrlResolver();
});
Core::singleton(
'url/canonical',
function () {
return \Core::make('url/canonical/resolver')->resolve(array());
});
--------------------------------


▼application/config/concrete.php

・secure属性を有効に(Cookie名/httponlyも変えています)
-----------------------------------
'session' => array(
'name' => 'ssid',
'handler' => 'file',
'save_path' => null,
'max_lifetime' => 7200,
'cookie' => array(
'cookie_path' => false, // set a specific path here if you know it, otherwise it'll default to relative
'cookie_lifetime' => 0,
'cookie_domain' => false,
- 'cookie_secure' => false,
+ 'cookie_secure' => true,
'cookie_httponly' => true
)
),
-----------------------------------

Re: 管理画面へのアクセスを「httpsのみ」にしたい

2015年9月23日 at 16:08
リゾルバいじっちゃいますか…ログインページへのリンクをhttpsにするってことですかね?

本題とは関係ないですが、 User::isLoggedIn() というふうに Facade を使って記述した方が、いちいち User オブジェクトのインスタンスを生成するより省メモリですよ。