安全性について

システム構築前に安全性について調べてみる。

ログイン

jetstreamでは、メール確認のできる登録機能と、2段階認証のログイン機能が用意されている。

フロントと管理者というようなマルチ認証は追加で構築する必要がある。

実際にはフロントのログインではスマホを使った2段階認証は現実的ではない。管理者サイトでの利用はよいと思われる。

2段階認証ではユーザー名とパスワードが一致した後に、スマホのAuthenticatorで示されるその時点の番号6桁を入力するもの。なので、ユーザー名とパスワードが破られたら、残りは数字6桁。(30秒だけなので安全性は高いけど)
ユーザー名とパスワードが一致しなくても、Authineticator番号を入れないといけないという仕組みなら、パスワードが破られたことを悟られないと思うけど。

(それ以前に、マルチログインで追加した管理画面で、2段階認証ができるかどうか調査中。)

ユーザーのログインを安全なものにするには、桁数を長くするのが一番有効。

次には、DDoSみたいに連続して試されるのを防ぐために、入力するのにタイムラグを設けるのが効果的らしい。乗っ取る側にしてみたら、時間がかかって非常に効率が悪いことになる。

Laravelではログインパスワードの失敗回数が制限されており、(5回)それをすぎるとしばらく 429 TOO MANY REQUESTS となってアクセスできない。

(この回数と不応期の時間は調整できることになっているが、まだわからない。)

XSS

クロスサイトスクリプティング。
<script>location.href='http://www.exmaple.com"</script>
と入力欄に書き込まれて、それを表示すると、example.comにジャンプしてしまう。
あるいはウィルスの入ったファイルのダウンロードを開始させられるようにも書ける。
変数を表示する際には、htmlspecialcharsで意味のある文字をつぶしておくのが対策となる。
laravelのbladeでは、変数は{{ $item}}のように{{ }}で囲む。このときに自動的にhtmlspecialchars関数を通される。

{!! !!}とするとhtmlspecialchars関数を通さないらしいが、使うことはないと考えられる。

CSRF

クロスサイト・リクエスト・フォージェリ。
ユーザ操作によってデータが作成/更新されたり、メールが送信されたりする画面で、見えないようにフォームが仕掛けられていて、本人の知らない間に知らないところに投稿させられる。

対策としては「トークン」を用いる。
送信前の画面でランダムな文字列(トークン)を生成し、セッションに格納しつつ、画面の input type=hidden 等にセット。
送信後の画面で、POSTされたトークンと、セッションに格納されたトークンが一致するかをチェックし、不一致であればエラーとする仕組み。

laravelではフォームを作成する際に、@csrf Bladeディレクティブを含めないとエラーになることになっているので、基本的にトークンを利用することになる。

SQLインジェクション

たとえば、検索文字にwhere句をいれて、必ず成立させるようにする。
select * from orders where stasus = 1 or 1 = 1;
全件取得できる。

ストアドプロシージャ、PDOだとプリペアードステートメントを使う。
SQLに渡されるのは型を伴うパラメータになるので、悪いコードでも動作しない。
上の例だと、シンプルに文字としての'1=1'となり、1=1を判断しない。

laravelではEloquent ORMを利用することになるので、まず大丈夫。
 でもない。

$inputs = $request->all();
App\User::find($self)->update($inputs);

だと、想定外の項目を更新するように改変できるらしい。ポイントとか。

Modelで、入力できない項目として、$guardsプロパティをセットしておくか、項目別にパラメータを渡すように注意する。

フレームワークの利用

フレームワークは絶対安全というわけではないらしい。

データベースをダイレクトに更新するなどの処理には十分注意が必要。

検討事項(設定方法の調査など)

Laravel認証システム

Laravelの認証システムの主な問題の1つは、デフォルトでは、ユーザーがログアウトしたときにセッションが無効にならないこと。 これは、.envファイルでセッションタイムアウトを0に設定することで簡単に修正可能、と書いてあったが、envファイルにそのような項目はない。要調査。

レート制限リクエスト

設定調査中

すべてをログに記録する

Laravelは、組み込みのログ機能を使用して、アプリケーションのすべてのアクティビティを簡単にログに記録できる。

設定方法不明。

利用可能なすべてのセキュリティヘッダーを送信する

Laravelは、組み込みのミドルウェアを使用してこれらのヘッダーを簡単に送信する方法を提供。

設定方法不明。

クッキー保護

HttpOnlyフラグとSecureフラグを使用すると、Cookieの保護に役立つ。

設定方法不明。

他にもいろいろとあるようだが、全部は無理かも。