Readouble

Laravel 4.2 セキュリティー

設定Configuration

Laravelは認証をとてもシンプルに実現する目的を持っています。実際、最初から全てが設定済みです。認証の設定ファイルはapp/config/auth.phpで、認証機能の動作を調整するため、読みやすいコメントをつけた多くのオプションで構成されています。Laravel aims to make implementing authentication very simple. In fact, almost everything is configured for you out of the box. The authentication configuration file is located at app/config/auth.php, which contains several well documented options for tweaking the behavior of the authentication facilities.

LaravelはEloquent認証ドライバーでデフォルトとして使用されるUserモデルをapp/modelsディレクトリーに用意してあります。このモデルのスキーマを作成する場合、パスワードフィールドは最低60文字必要であることを覚えておいてください。By default, Laravel includes a User model in your app/models directory which may be used with the default Eloquent authentication driver. Please remember when building the Schema for this Model to ensure that the password field is a minimum of 60 characters.

もし、アプリケーションでEloquentを使用しないのであれば、database認証ドライバーでクエリービルダーを使ってください。If your application is not using Eloquent, you may use the database authentication driver which uses the Laravel query builder.

注目: 認証を使い始める前に、users(もしくは同様の)テーブルにNULLを許す、100文字のremember_tokenカラムを確実に用意してください。このカラムはアプリケーションで"Remember me"(持続的)セッションのトークンを保存するために使用されます。マイグレーション時に、$table->rememberToken();を使用すれば作成されます。Note: Before getting started, make sure that your users (or equivalent) table contains a nullable, string remember_token column of 100 characters. This column will be used to store a token for "remember me" sessions being maintained by your application. This can be done by using $table->rememberToken(); in a migration.

パスワードの保存Storing Passwords

LaravelのHashクラスは安全なBcryptハッシュを提供しています。The Laravel Hash class provides secure Bcrypt hashing:

Bcryptを使いパスワードをハッシュするHashing A Password Using Bcrypt

$password = Hash::make('secret');

ハッシュに対し、パスワードを確認するVerifying A Password Against A Hash

if (Hash::check('secret', $hashedPassword))
{
	// パスワード一致...
}

パスワードに再ハッシュが必要かチェックするChecking If A Password Needs To Be Rehashed

if (Hash::needsRehash($hashed))
{
	$hashed = Hash::make('secret');
}

ユーザー認証Authenticating Users

あるユーザーをアプリケーションにログインさせる場合は、Auth::attemptメソッドを使います。To log a user into your application, you may use the Auth::attempt method.

if (Auth::attempt(array('email' => $email, 'password' => $password)))
{
	return Redirect::intended('dashboard');
}

emailが必須のオプションでないことに注意してください。主に例を示すために使っているだけです。データベースの中にあるどんなカラム名でも"username"に該当するものを使用できます。 Redirect::intended関数は認証フィルターでキャッチされる前にアクセスしてきた、前のURLへユーザーをリダイレクトさせます。このメソッドにはフォールバックURIを指定機で、リダイレクト先へ転送できない場合に利用されます。Take note that email is not a required option, it is merely used for example. You should use whatever column name corresponds to a "username" in your database. The Redirect::intended function will redirect the user to the URL they were trying to access before being caught by the authentication filter. A fallback URI may be given to this method in case the intended destination is not available.

attemptメソッドが呼び出された時にauth.attemptイベントが発行されます。同様に、認証に成功した場合はauth.loginイベントが発行されます。When the attempt method is called, the auth.attempt event[/docs/4.2/events] will be fired. If the authentication attempt is successful and the user is logged in, the auth.login event will be fired as well.

ユーザーが認証されているか判定するDetermining If A User Is Authenticated

ユーザーが既にアプリケーションへログインしているかをチェックするには、checkメソッドを使います。To determine if the user is already logged into your application, you may use the check method:

if (Auth::check())
{
	// ユーザーはログインしている…
}

ユーザーを認証し、ログインを保つAuthenticating A User And "Remembering" Them

アプリケーションで"Remember me"機能を提供したい場合、attemptメソッドの第2引数にtrueを渡す必要があります。それにより無期限に(もしくは手動でログアウトされるまで)認証が維持されます。もちろんusersテーブルに、"Remember me"トークンを保存するために使用する、文字列のremember_tokenカラムを用意しておく必要があります。If you would like to provide "remember me" functionality in your application, you may pass true as the second argument to the attempt method, which will keep the user authenticated indefinitely (or until they manually logout). Of course, your users table must include the string remember_token column, which will be used to store the "remember me" token.

if (Auth::attempt(array('email' => $email, 'password' => $password), true))
{
	// このユーザーは覚えられた...
}

注意:attemptメソッドがtrueを返す場合、そのユーザーはアプリケーションにログイン中だと考えられます。Note: If the attempt method returns true, the user is considered logged into the application.

ユーザーがRemember meで認証されているかを判定するDetermining If User Authed Via Remember

ユーザーのログインを覚えておく設定の場合、viaRememberメソッドを使用し、そのユーザーが"remember me"(ログインしたままにする)クッキーを使用して認証されているのかを判定できます。If you are "remembering" user logins, you may use the viaRemember method to determine if the user was authenticated using the "remember me" cookie:

if (Auth::viaRemember())
{
	//
}

条件付きのユーザー認証を行うAuthenticating A User With Conditions

認証のクエリーに条件を追加することも可能です。You also may add extra conditions to the authenticating query:

if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1)))
{
    // このユーザーは存在しており、アクティブで、使用停止ではない
}

**注目:**Session Fixation攻撃に対抗するため、認証後はセッションIDが自動的に再生成されます。Note: For added protection against session fixation, the user's session ID will automatically be regenerated after authenticating.

ログインしたユーザーにアクセスするAccessing The Logged In User

一度ユーザーが認証されると、Userモデル/レコードにアクセスできます。Once a user is authenticated, you may access the User model / record:

$email = Auth::user()->email;

認証済みのユーザーのIDを取得するには、idメソッドを使用します。To retrieve the authenticated user's ID, you may use the id method:

$id = Auth::id();

アプリケーションにユーザーをIDでログインさせたい時は、loginUsingIdメソッドを使用してください。To simply log a user into the application by their ID, use the loginUsingId method:

Auth::loginUsingId(1);

ログインしないで認証内容をチェックするValidating User Credentials Without Login

validateメソッドでアプリケーションへ実際にログインさせずに、認証内容が正しいかをチェックできます。The validate method allows you to validate a user's credentials without actually logging them into the application:

if (Auth::validate($credentials))
{
	//
}

そのセッションの間だけユーザーをログインさせるLogging A User In For A Single Request

そのリクエスト一回の間だけユーザーをログインさせるonceメソッドも使用できます。これにはセッションもクッキーも使用されません。You may also use the once method to log a user into the application for a single request. No sessions or cookies will be utilized.

if (Auth::once($credentials))
{
	//
}

アプリケーションからログアウトするLogging A User Out Of The Application

Auth::logout();

ユーザーの手動ログインManually Logging In Users

既に存在しているユーザーをアプリケーションにログインさせる場合、そのインスタンスを指定し、loginメソッドを呼び出してください。If you need to log an existing user instance into your application, you may simply call the login method with the instance:

$user = User::find(1);

Auth::login($user);

これはユーザー情報をもとにログインさせるattemptと同じ状態になります。This is equivalent to logging in a user via credentials using the attempt method.

ルートの保護Protecting Routes

特定のルートへ認証済みのユーザーだけがアクセスできるように、ルートフィルターを使用できます。Laravelはデフォルトのauthフィルターをapp/filters.phpで定義しています。Route filters may be used to allow only authenticated users to access a given route. Laravel provides the auth filter by default, and it is defined in app/filters.php.

ルートを保護するProtecting A Route

Route::get('profile', array('before' => 'auth', function()
{
	// 認証済みのユーザーのみ入れる...
}));

CSRFからの保護CSRF Protection

LaravelはCSRFからアプリケーションを簡単に守る手段を提供しています。Laravel provides an easy method of protecting your application from cross-site request forgeries.

CSRFトークンをフォームへ埋め込むInserting CSRF Token Into Form

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

送信されてきたCSRFトークンをバリデートするValidate The Submitted CSRF Token

Route::post('register', array('before' => 'csrf', function()
{
    return '有効なCSRFトークンです!';
}));

HTTP基本認証HTTP Basic Authentication

HTTP基本認証は専用の「ログイン」ページを作成しなくても手軽にユーザーを認証できる手法です。これを使用するにはauth.basicフィルターをルートに追加してください。HTTP Basic Authentication provides a quick way to authenticate users of your application without setting up a dedicated "login" page. To get started, attach the auth.basic filter to your route:

HTTP基本認証でルートを保護するProtecting A Route With HTTP Basic

Route::get('profile', array('before' => 'auth.basic', function()
{
	// 認証済みのユーザーのみ入れる...
}));

デフォルトで、basicフィルターはユーザーレコードのemailカラムを認証に使用します。ユーザーの他のカラムを使用する場合は、app/filters.phpの中で、そのカラム名をbasicメソッドの最初の引数として渡してください。By default, the basic filter will use the email column on the user record when authenticating. If you wish to use another column you may pass the column name as the first parameter to the basic method in your app/filters.php file:

Route::filter('auth.basic', function()
{
	return Auth::basic('username');
});

ステートレスなHTTP基本フィルターをセットするSetting Up A Stateless HTTP Basic Filter

またHTTP基本認証はセッションのユーザー識別クッキーをセットせず使用することができます。これは特にAPI認証に便利です。使用するには、onceBasicメソッドをリターンするフィルターを書いてください。You may also use HTTP Basic Authentication without setting a user identifier cookie in the session, which is particularly useful for API authentication. To do so, define a filter that returns the onceBasic method:

Route::filter('basic.once', function()
{
	return Auth::onceBasic();
});

PHP FastCGIを使用している場合、デフォルトでHTTP基本認証は正しく動作しません。.htaccessファイルに以下の行を追加してください。If you are using PHP FastCGI, HTTP Basic authentication will not work correctly by default. The following lines should be added to your .htaccess file:

RewriteCond %{HTTP:Authorization} ^(. )$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

パスワードリマインダーとリセットPassword Reminders & Reset

モデルとテーブルModel & Table

ほとんどのWebアプリケーションはユーザーが忘れてしまったパスワードをリセットする手段を提供しています。それぞれのアプリケーションに毎回実装する代わりに、Laravelはパスワードリマインダーを送信し、パスワードをリセットする便利なメソッドを提供しています。最初にIlluminate\Auth\Reminders\RemindableInterfaceUserモデルへ確実に実装されていることを確認してください。もちろん、フレームワークに含まれるUserモデルには、このインターフェイスが最初から実装されています。そしてインターフェイスの実装に必要なメソッドを含んでいる、Illuminate\Auth\Reminders\RemindableTraitを使用しています。Most web applications provide a way for users to reset their forgotten passwords. Rather than forcing you to re-implement this on each application, Laravel provides convenient methods for sending password reminders and performing password resets. To get started, verify that your User model implements the Illuminate\Auth\Reminders\RemindableInterface contract. Of course, the User model included with the framework already implements this interface, and uses the Illuminate\Auth\Reminders\RemindableTrait to include the methods needed to implement the interface.

RemindableInterfaceを実装するImplementing The RemindableInterface

use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements RemindableInterface {

	use RemindableTrait;

}

リマインダーテーブルのマイグレーションを生成するGenerating The Reminder Table Migration

次に、パスワードリセットトークンを保存するテーブルを生成します。このテーブルのマイグレーションを生成するためには、単にArtisanコマンドのauth::remindersを実行するだけです。Next, a table must be created to store the password reset tokens. To generate a migration for this table, simply execute the auth:reminders-table Artisan command:

php artisan auth:reminders-table

php artisan migrate

パスワードリマインダーコントローラーPassword Reminder Controller

これでパスワードリマインダーコントローラーを生成する準備が整いました。auth:reminders-controller Artisanコマンドを使用し、コントローラーを自動的に生成しましょう。app/controllersディレクトリー中に、RemindersController.phpを生成します。Now we're ready to generate the password reminder controller. To automatically generate a controller, you may use the auth:reminders-controller Artisan command, which will create a RemindersController.php file in your app/controllers directory.

php artisan auth:reminders-controller

生成されたコントローラーには、あなたが表示したパスワードリマインダーフォームを処理する、getRemindメソッドが既に用意されています。あなたが行う必要があるのは、password.remindビューを作成することだけです。このビューはemailフィールドを持つ、基本的なフォームです。フォームはRemindersController@postRemindアクションへPOSTする必要があります。The generated controller will already have a getRemind method that handles showing your password reminder form. All you need to do is create a password.remind view[/docs/4.2/responses#views]. This view should have a basic form with an email field. The form should POST to the RemindersController@postRemind action.

シンプルなpassword.remindビューは以下のようになるでしょう。A simple form on the password.remind view might look like this:

<form action="{{ action('RemindersController@postRemind') }}" method="POST">
	<input type="email" name="email">
	<input type="submit" value="Send Reminder">
</form>

getRemindに加えて、生成されたコントローラーはpostRemindメソッドも持っています。これはパスワードリマインダーメールをユーザーに送信する処理を行います。このメソッドは、POST変数にemailフィールドが存在していることを期待しています。リマインダーメールがユーザーへ無事に送られれば、statusメッセージがフラッシュデーターとしてセッションに保存されます。送信に失敗すれば、errorメッセージが保存されます。In addition to getRemind, the generated controller will already have a postRemind method that handles sending the password reminder e-mails to your users. This method expects the email field to be present in the POST variables. If the reminder e-mail is successfully sent to the user, a status message will be flashed to the session. If the reminder fails, an error message will be flashed instead.

postRemindコントローラーメソッドの中では、ユーザーへ送信する前に、メッセージインスタンスを更新することができます。Within the postRemind controller method you may modify the message instance before it is sent to the user:

Password::remind(Input::only('email'), function($message)
{
	$message->subject('Password Reminder');
});

ユーザーはコントローラーのgetResetメソッドへルーティングされるリンクを含んだメールを受け取ります。指定されたパスワードリマインダーを識別するために使用されるパスワードリマインダートークンも一緒に送信されてきます。アクションにはpassword.resetビューを返すように、予めコードされていますが、このビューも作成して下さい。トークンはビューに渡され、tokenという名前の隠しフォーム隠しフィールドとして設置されなくてはなりません。このtokenに加え、パスワードリセットフォームにはemailpasswordpassword_confirmationフィールドが必要です。フォームはRemaindersController@postResetメソッドへPOSTで送信して下さい。Your user will receive an e-mail with a link that points to the getReset method of the controller. The password reminder token, which is used to identify a given password reminder attempt, will also be passed to the controller method. The action is already configured to return a password.reset view which you should build. The token will be passed to the view, and you should place this token in a hidden form field named token. In addition to the token, your password reset form should contain email, password, and password_confirmation fields. The form should POST to the RemindersController@postReset method.

シンプルなpassword.resetビューは下のようになるでしょう。A simple form on the password.reset view might look like this:

<form action="{{ action('RemindersController@postReset') }}" method="POST">
	<input type="hidden" name="token" value="{{ $token }}">
	<input type="email" name="email">
	<input type="password" name="password">
	<input type="password" name="password_confirmation">
	<input type="submit" value="Reset Password">
</form>

最後に、postResetメソッドがストレージ上のパスワードを実際に変更する責任を負います。このコントローラーアクションの中で、Password::resetメソッドに渡されたクロージャーは、Userpassword属性をセットし、saveメソッドを呼び出しています。もちろん、このクロージャーは、UserモデルがEloquentモデルであると想定しています。しかしながら、アプリケーションのデータベース保管システムに適するように、必要に応じて自由に変更して下さい。Finally, the postReset method is responsible for actually changing the password in storage. In this controller action, the Closure passed to the Password::reset method sets the password attribute on the User and calls the save method. Of course, this Closure is assuming your User model is an Eloquent model[/docs/4.2/eloquent]; however, you are free to change this Closure as needed to be compatible with your application's database storage system.

パスワードがうまくリセットし終えたら、ユーザーはアプリケーションのルートへリダイレクトされます。このリダイレクトURLも自由に変更して下さい。パスワードリセットが失敗したら、ユーザーはリセットフォームへ戻るようにリダイレクトされます。そして、errorメッセージがセッションにフラッシュデーターとして保存されます。If the password is successfully reset, the user will be redirected to the root of your application. Again, you are free to change this redirect URL. If the password reset fails, the user will be redirect back to the reset form, and an error message will be flashed to the session.

パスワードのバリデーションPassword Validation

デフォルトでは、Password::resetメソッドは確認領域と同一であることと、6文字以上であることを確認します。クロージャーを使うPassword::validatorメソッドで、このルールを変更できます。クロージャーの中でどんなパスワードバリデーションも実行できます。パスワードが確認フィールドと一致するかを調べる必要がないことに注意して下さい。これはフレームワークにより、自動的に調べられます。By default, the Password::reset method will verify that the passwords match and are >= six characters. You may customize these rules using the Password::validator method, which accepts a Closure. Within this Closure, you may do any password validation you wish. Note that you are not required to verify that the passwords match, as this will be done automatically by the framework.

Password::validator(function($credentials)
{
	return strlen($credentials['password']) >= 6;
});

Note: デフォルトでは、パスワードのリセットトークンは1時間で無効になります。app/config/auth.phpファイルのreminder.expireオプションにより、この時間を変更できます。Note: By default, password reset tokens expire after one hour. You may change this via the reminder.expire option of your app/config/auth.php file.

暗号化Encryption

Laravelはmcrypt PHP拡張による、強力なAES暗号化機能を提供しています。Laravel provides facilities for strong AES encryption via the mcrypt PHP extension:

値を暗号化するEncrypting A Value

$encrypted = Crypt::encrypt('secret');

注目:app/config/app.phpファイルのkeyオプションに16文字か24文字、32文字のランダムな文字列を確実に設定してください。そうしないと、暗号化された値は安全ではありません。Note: Be sure to set a 16, 24, or 32 character random string in the key option of the app/config/app.php file. Otherwise, encrypted values will not be secure.

値を解読するDecrypting A Value

$decrypted = Crypt::decrypt($encryptedValue);

手法とモードを設定するSetting The Cipher & Mode

暗号化に使用する手法とモードもセットできます。You may also set the cipher and mode used by the encrypter:

Crypt::setMode('ctr');

Crypt::setCipher($cipher);

認証ドライバーAuthentication Drivers

Laravelでは最初から、databaseeloquent認証ドライバーが用意されています。他の認証ドライバーを追加するための情報は、認証の拡張に関するドキュメントをご覧ください。Laravel offers the database and eloquent authentication drivers out of the box. For more information about adding additional authentication drivers, check out the Authentication extension documentation[/docs/4.2/extending#authentication].

章選択

Artisan CLI

設定

明暗テーマ
light_mode
dark_mode
brightness_auto システム設定に合わせる
テーマ選択
photo_size_select_actual デフォルト
photo_size_select_actual モノクローム(白黒)
photo_size_select_actual Solarized風
photo_size_select_actual GitHub風(青ベース)
photo_size_select_actual Viva(黄緑ベース)
photo_size_select_actual Happy(紫ベース)
photo_size_select_actual Mint(緑ベース)
コードハイライトテーマ選択

明暗テーマごとに、コードハイライトのテーマを指定できます。

テーマ配色確認
スクリーン表示幅
640px
80%
90%
100%

768px以上の幅があるときのドキュメント部分表示幅です。

インデント
無し
1rem
2rem
3rem
原文確認
原文を全行表示
原文を一行ずつ表示
使用しない

※ 段落末のEボタンへカーソルオンで原文をPopupします。

Diff表示形式
色分けのみで区別
行頭の±で区別
削除線と追記で区別

※ [tl!…]形式の挿入削除行の表示形式です。

Pagination和文
ペジネーション
ペギネーション
ページネーション
ページ付け
Scaffold和文
スカフォールド
スキャフォールド
型枠生成
本文フォント

総称名以外はCSSと同様に、"〜"でエスケープしてください。

コードフォント

総称名以外はCSSと同様に、"〜"でエスケープしてください。

保存内容リセット

localStrageに保存してある設定項目をすべて削除し、デフォルト状態へ戻します。

ヘッダー項目移動

キーボード操作