" いいね " なライフをつくる。

うそはつかない。"いいね"をつくる。じゆーうな日記です。

XSSとは?LaravelのXSS対策について。

環境、対象

  • Laravel5.6
  • PHP7

要点

  • XSSとは入力値にjsコード等を入れてサイトやユーザーに攻撃すること
  • LaravelのXSS対策は {{ }}でくくって出力をするだけ

記事にする理由

  • 仕事でXSS周りの不具合修正の対応を行った際に知ったことを忘れないため!

内容

事象

  • 入力フォームにjsコードを書かれ、XSS対策をしないまま出力するとコードが実行されてしまう。

入力フォーム↓

<script> window.alert('hoge'); </script>

例えば、alertを入力されるとそのページにアクセスした人全員にalertが表示されるようになるといった状態になります。 (これをどう駆使してサイトに攻撃を仕掛けるのかは、技術力と想像力が足りないので、分かりませんが、alertを無限実行などされたら困りますよね。)

原因

  • viewへの出力時に、エスケープしていないこと

viewで入力内容を出力する際に、エスケープをしていないことから、入力内容にhtmlやjsが含まれていたらそれをそのままコードとして受け取り、 内容を実行してしまいます。

そこで、出力時にエスケープをかけてあげることでコードとしてではなく、文字列としてタグを受け取ってくれるので上記のように、alertが実行されるようなことは無くなります。

解決策

  • viewの出力箇所を {{ }} でくくってあげることで解消、対策が自動的に行われます。

これはLavravelのviewであるbladeの仕組みで、コントローラから受け取ったデータを出力する際に {{ $message }}のように出力すると、自動的にhtmlentites関数をかけた後に出力してくれるので、XSS対策を行うことができます。

コントローラー

 $message = "<script> window.alert('hoge'); </script>"

ブレード(View)

メッセージ:{{ $message }}

このように書いてあげると、自動的にタグは文字列として変換されるのでXSS対策が行われるということになります。

また、XSS対策を行わずにむしろタグなどをそのまま実行して表示してしまいたい場合には、

{!! $message !!}

このように書いてあげると、そのままタグをタグとして実行してくれます。


おさらい

  • XSSとは入力値にjsコード等を入れてサイトやユーザーに攻撃すること
  • LaravelのXSS対策は {{ }}でくくって出力するだけ

ひとこと

  • Laravelでは {{ }}で出力を基本はせざるを得ないので意識しなくても大丈夫だと思いますが、ただ意識しなくて良いがゆえにあまり理解しようともせず、モヤモヤする部分となりがちだとおもいます。どこかのタイミングで調べてみてください。

Laravelの日本語公式ドキュメントの閲覧バージョンを指定すると、 該当バージョンへ自動遷移してくれるChromeアプリを作成したので、ぜひ!

bit.ly

Laravel5.6 エラー "The page has expired due to inactivity. Please refresh and try again." と出た時の対処法

環境 Laravel5.6

下記のメッセージとともに何も動かなくなってしまうエラーに遭遇しました。

このエラー、ログにも原因が表示されず解決策が分かりませんでした。 ググったらすぐに解消したのですが、焦りました。

エラー内容

The page has expired due to inactivity.

Please refresh and try again.

こんな画面 f:id:tusukurukun:20180412000900p:plain

原因

  • postで送信した際に、formにcsrfを設定していなかったことが原因

解決策

  • formにcsrfを設定する。

下記のbladeに、@csrfを書き加える

<form action="/test" method="post">
    <input type="text" name="name">
    <input type="submit" value="送信">
</form>

↓↓↓

<form action="/test" method="post">
    @csrf
    <input type="text" name="name">
    <input type="submit" value="送信">
</form>

これにて解消。

参考ページ

Laravelの日本語公式ドキュメントの閲覧バージョンを指定すると、 該当バージョンへ自動遷移してくれるアプリを作成したので、ぜひご活用ください。

bit.ly

Laravel CRUD作成でよく使うコマンド

LaravelのCRUD処理を作成する際によく使うコマンド一覧を作成しました

migration作成

$php artisan make:migration テーブル名

migrate実行

// マイグレーションを実行
$php artisan migrate

// マイグレーションを巻き戻す
$php artisan migrate:rollback

model作成

$php artisan make:model モデル名

controller作成

$php artisan make:controller コントローラー名 --resource

おまけ1:ルーティングの書き方 routes/web.php

Route::resource('conversation', 'ConversationController');

おまけ2:ルーティングURLの表示

$php artisan route:list

gitコマンド省略形 設定方法

gitコマンドの省略形を設定する方法です。

省略するにはgit configコマンドを使用します。

gitのbranchコマンドを、"br"と省略設定するコマンド

$ git  config --global alias.br branch

実行例

$ git  config --global alias.br branch
$ git br
* master

設定されているgitコマンドを確認する。

$ git config --global --list

実行例

$ git config --global --list
alias.st=status
alias.br=branch
alias.cm=commit
alias.ch=checkout

ちなみに --globalと言うのは、このgitユーザーでgitコマンドを使った場合に適用すると言う意味です。 他には、マシン全体に適用する --systemや、リポジトリ固有にするには空欄にすることで設定もできます。

githubに草が生えない場合に確認すべき点

githubに草が生えてこない場合に確認すべき点

原因可能性

  • メールアドレス設定
  • 日時設定

メールアドレス設定
ローカルと、githubアカウントのメールアドレス設定は同一でなければなりません。

コマンド

現在設定されているメールアドレスを確認 $ git config --global user.email

アドレスを設定

$ git config --global user.email "example@example.com" 
example@example.com

日時設定

設定日時の確認

$ date
Sun Apr  1 18:04:19 JST 2018

↑この日時がずれていたら設定を見直してみてください。

参考:Homesteadの日時設定方法

qiita.com