HTTP リクエスト
Nette は HTTP リクエストを分かりやすい API を持つオブジェクトにカプセル化し、同時にサニタイズフィルタを提供します。
HTTP リクエストは Nette\Http\Request
オブジェクトによって表されます。Nette
を使用している場合、このオブジェクトはフレームワークによって自動的に作成され、依存性注入
を使用して渡すことができます。Presenter では、単に $this->getHttpRequest()
メソッドを呼び出すだけです。Nette Framework の外部で作業している場合は、RequestFactory を使用してオブジェクトを作成できます。
Nette の大きな利点は、オブジェクトを作成する際に、すべての入力パラメータ GET、POST、COOKIE、および URL から制御文字と無効な UTF-8 シーケンスを自動的にクリーンアップすることです。その後、これらのデータを安全にさらに処理できます。クリーンアップされたデータは、Presenter とフォームで使用されます。
Nette\Http\Request
このオブジェクトはイミュータブル(不変)です。セッターはなく、withUrl()
というウィザーが 1
つだけあり、これはオブジェクトを変更せず、変更された値を持つ新しいインスタンスを返します。
withUrl (Nette\Http\UrlScript $url): Nette\Http\Request
異なる URL を持つクローンを返します。
getUrl(): Nette\Http\UrlScript
リクエストの URL を UrlScript オブジェクトとして返します。
$url = $httpRequest->getUrl();
echo $url; // https://doc.nette.org/cs/?action=edit
echo $url->getHost(); // nette.org
注意:ブラウザはサーバーにフラグメントを送信しないため、$url->getFragment()
は空の文字列を返します。
getQuery (?string $key=null): string|array|null
GET リクエストのパラメータを返します。
$all = $httpRequest->getQuery(); // URL からのすべてのパラメータの配列を返します
$id = $httpRequest->getQuery('id'); // GET パラメータ 'id' を返します(または null)
getPost (?string $key=null): string|array|null
POST リクエストのパラメータを返します。
$all = $httpRequest->getPost(); // POST からのすべてのパラメータの配列を返します
$id = $httpRequest->getPost('id'); // POST パラメータ 'id' を返します(または null)
getFile (string|string[] $key): Nette\Http\FileUpload|array|null
アップロードを Nette\Http\FileUpload オブジェクトとして返します:
$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // 何かファイルがアップロードされましたか?
$file->getUntrustedName(); // ユーザーによって送信されたファイル名
$file->getSanitizedName(); // 危険な文字を含まない名前
}
ネストされた構造にアクセスするには、キーの配列を指定します。
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
外部からのデータを信頼できず、したがってファイル構造の形式に依存できないため、例えば
$request->getFiles()['my-form']['details']['avatar']
のように失敗する可能性がある方法よりも、この方法の方が安全です。
getFiles(): array
正規化された構造ですべてのアップロードのツリーを返します。そのリーフは Nette\Http\FileUpload オブジェクトです:
$files = $httpRequest->getFiles();
getCookie (string $key): string|array|null
クッキーを返すか、存在しない場合は null
を返します。
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
すべてのクッキーを返します。
$cookies = $httpRequest->getCookies();
getMethod(): string
リクエストが行われた HTTP メソッドを返します。
$httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod (string $method): bool
リクエストが行われた HTTP メソッドをテストします。パラメータは大文字と小文字を区別しません。
if ($httpRequest->isMethod('GET')) // ...
getHeader (string $header): ?string
HTTP ヘッダーを返すか、存在しない場合は null
を返します。パラメータは大文字と小文字を区別しません。
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
すべての HTTP ヘッダーを連想配列として返します。
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
接続は暗号化されていますか(HTTPS)?正しく機能させるためには、プロキシの設定が必要になる場合があります。
isSameSite(): bool
リクエストは同じ(サブ)ドメインから来ており、リンクのクリックによって開始されましたか?Nette
は検出にクッキー _nss
(以前は nette-samesite
)を使用します。
isAjax(): bool
AJAX リクエストですか?
getRemoteAddress(): ?string
ユーザーの IP アドレスを返します。正しく機能させるためには、プロキシの設定が必要になる場合があります。
getRemoteHost(): ?string
ユーザーの IP アドレスの DNS 解決を返します。正しく機能させるためには、プロキシの設定が必要になる場合があります。
getBasicCredentials(): ?string
Basic HTTP authentication の認証情報を返します。
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
HTTP リクエストの本文を返します。
$body = $httpRequest->getRawBody();
detectLanguage (array $langs): ?string
言語を検出します。パラメータ $lang
として、アプリケーションがサポートする言語の配列を渡し、訪問者のブラウザが最も好む言語を返します。これは魔法ではなく、単に
Accept-Language
ヘッダーを使用します。一致するものがない場合は
null
を返します。
// ブラウザは例えば Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3 を送信します
$langs = ['hu', 'pl', 'en']; // アプリケーションがサポートする言語
echo $httpRequest->detectLanguage($langs); // en
RequestFactory
Nette\Http\RequestFactory
クラスは、現在の HTTP リクエストを表す Nette\Http\Request
インスタンスを作成するために使用されます。(Nette を使用している場合、HTTP
リクエストオブジェクトはフレームワークによって自動的に作成されます。)
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
fromGlobals()
メソッドは、現在の PHP
グローバル変数($_GET
、$_POST
、$_COOKIE
、$_FILES
、$_SERVER
)に基づいてリクエストオブジェクトを作成します。オブジェクトを作成する際に、すべての入力パラメータ
GET、POST、COOKIE、および URL から制御文字と無効な UTF-8
シーケンスを自動的にクリーンアップし、これらのデータをさらに処理する際の安全性を確保します。
RequestFactory は fromGlobals()
を呼び出す前に設定できます:
$factory->setBinary()
メソッドで、入力パラメータから制御文字と無効な UTF-8 シーケンスの自動クリーニングを無効にします。$factory->setProxy(...)
メソッドで、プロキシサーバーの IP アドレスを指定します。これは、ユーザーの IP アドレスを正しく検出するために必要です。
RequestFactory を使用すると、リクエスト URL の一部を自動的に変換するフィルタを定義できます。これらのフィルタは、例えば、さまざまなウェブサイト上のコメントシステムの不適切な実装によって挿入される可能性のある、URL からの不要な文字を削除します:
// パスからスペースを削除
$requestFactory->urlFilters['path']['%20'] = '';
// URI の末尾からドット、カンマ、または右括弧を削除
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// パスから重複したスラッシュをクリーンアップ(デフォルトフィルタ)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
最初のキー 'path'
または 'url'
は、フィルタが適用される URL
の部分を指定します。2番目のキーは検索する正規表現であり、値は見つかったテキストの代わりに使用される置換です。
アップロードされたファイル
Nette\Http\Request::getFiles()
メソッドは、正規化された構造ですべてのアップロードの配列を返します。そのリーフは Nette\Http\FileUpload
オブジェクトです。これらは、フォーム要素 <input type=file>
によって送信されたデータをカプセル化します。
構造は HTML の要素の命名を反映しています。最も単純なケースでは、次のように送信された単一の名前付きフォーム要素である可能性があります:
<input type="file" name="avatar">
この場合、$request->getFiles()
は配列を返します:
[
'avatar' => /* FileUpload インスタンス */
]
FileUpload
オブジェクトは、ユーザーがファイルを送信しなかった場合や送信が失敗した場合でも作成されます。ファイルが送信されたかどうかは
hasFile()
メソッドが返します:
$request->getFile('avatar')->hasFile();
配列表記を使用する要素名の場合:
<input type="file" name="my-form[details][avatar]">
返されるツリーは次のようになります:
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload インスタンス */
],
],
]
ファイルの配列を作成することもできます:
<input type="file" name="my-form[details][avatars][]" multiple>
この場合、構造は次のようになります:
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload インスタンス */,
1 => /* FileUpload インスタンス */,
2 => /* FileUpload インスタンス */,
],
],
],
]
ネストされた配列のインデックス 1 にアクセスする最良の方法は次のとおりです:
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
外部からのデータを信頼できず、したがってファイル構造の形式に依存できないため、例えば
$request->getFiles()['my-form']['details']['avatars'][1]
のように失敗する可能性がある方法よりも、この方法の方が安全です。
FileUpload
メソッドの概要
hasFile(): bool
ユーザーがファイルをアップロードした場合に true
を返します。
isOk(): bool
ファイルが正常にアップロードされた場合に true
を返します。
getError(): int
ファイルアップロード時のエラーコードを返します。これは UPLOAD_ERR_XXX 定数の 1
つです。アップロードが正常に行われた場合、UPLOAD_ERR_OK
を返します。
move (string $dest)
アップロードされたファイルを新しい場所に移動します。宛先ファイルが既に存在する場合、上書きされます。
$file->move('/path/to/files/name.ext');
getContents(): ?string
アップロードされたファイルの内容を返します。アップロードが成功しなかった場合、null
を返します。
getContentType(): ?string
アップロードされたファイルの MIME
コンテンツタイプを、その署名に基づいて検出します。アップロードが成功しなかった場合、または検出が失敗した場合、null
を返します。
PHP 拡張機能 fileinfo
が必要です。
getUntrustedName(): string
ブラウザが送信した元のファイル名を返します。
このメソッドによって返される値を信頼しないでください。クライアントは、アプリケーションを破損またはハッキングする意図で悪意のあるファイル名を送信した可能性があります。
getSanitizedName(): string
サニタイズされたファイル名を返します。ASCII 文字 [a-zA-Z0-9.-]
のみを含みます。名前にそのような文字が含まれていない場合、'unknown'
を返します。ファイルが JPEG、PNG、GIF、WebP、または AVIF
形式の画像である場合、正しい拡張子も返します。
PHP 拡張機能 fileinfo
が必要です。
getSuggestedExtension(): ?string
検出された MIME タイプに対応する適切なファイル拡張子(ドットなし)を返します。
PHP 拡張機能 fileinfo
が必要です。
getUntrustedFullPath(): string
フォルダのアップロード時にブラウザが送信した元のファイルパスを返します。完全なパスは PHP 8.1 以降でのみ利用可能です。以前のバージョンでは、このメソッドは元のファイル名を返します。
このメソッドによって返される値を信頼しないでください。クライアントは、アプリケーションを破損またはハッキングする意図で悪意のあるファイル名を送信した可能性があります。
getSize(): int
アップロードされたファイルのサイズを返します。アップロードが成功しなかった場合、0
を返します。
getTemporaryFile(): string
アップロードされたファイルの一時的な場所へのパスを返します。アップロードが成功しなかった場合、''
を返します。
isImage(): bool
アップロードされたファイルが JPEG、PNG、GIF、WebP、または AVIF 形式の画像である場合に
true
を返します。検出はその署名に基づいて行われ、ファイル全体の整合性は検証されません。画像が破損していないかどうかは、例えば読み込みを試みることで確認できます。
PHP 拡張機能 fileinfo
が必要です。
getImageSize(): ?array
アップロードされた画像の寸法を含むペア [幅, 高さ]
を返します。アップロードが成功しなかった場合、または有効な画像でない場合、null
を返します。
toImage(): Nette\Utils\Image
画像を Image
オブジェクトとして読み込みます。アップロードが成功しなかった場合、または有効な画像でない場合、Nette\Utils\ImageException
例外をスローします。