脆弱性からの保護

次々と主要なWebサイトでセキュリティホールが報告されたり、悪用されたりしています。これは不快なことです。Webアプリケーションのセキュリティを重視するなら、Nette Frameworkは間違いなく最良の選択肢です。

Cross-Site Scripting (XSS)

クロスサイトスクリプティングは、エスケープされていない出力を悪用してWebサイトを侵害する手法です。攻撃者はページに独自のコードを挿入し、それによってページを変更したり、訪問者の機密情報を取得したりすることができます。XSSに対する防御は、すべての文字列を徹底的かつ正確にエスケープすることによってのみ可能です。しかし、コーダーが一度でもこれを怠ると、Webサイト全体がすぐに侵害される可能性があります。

攻撃の例としては、ユーザーに改変されたURLを送りつけ、それを使ってページに自分のコードを注入することが挙げられます。アプリケーションが出力を適切にエスケープしない場合、スクリプトはユーザーのブラウザで実行されます。これにより、例えばユーザーのIDを盗むことができます。

https://example.com/?search=<script>alert('XSS攻撃成功');</script>

Nette Frameworkは、画期的な技術であるContext-Aware Escapingを提供しており、これによりクロスサイトスクリプティングのリスクから永久に解放されます。すべての出力は自動的にエスケープされるため、コーダーが何かを忘れることはありえません。例?コーダーがこのテンプレートを作成します:

<p onclick="alert({$message})">{$message}</p>

<script>
document.title = {$message};
</script>

{$message}という記述は変数の出力を意味します。他のフレームワークでは、各出力を明示的にエスケープする必要があり、しかも場所ごとに異なる方法でエスケープする必要があります。Nette Frameworkでは、何もエスケープする必要はありません。すべてが自動的に、正しく、一貫して行われます。変数に$message = '幅 1/2"'を代入すると、フレームワークは次のHTMLコードを生成します:

<p onclick="alert(&quot;幅 1\/2\&quot;&quot;)">幅 1/2&quot;</p>

<script>
document.title = "幅 1\/2\"";
</script>

Cross-Site Request Forgery (CSRF)

クロスサイトリクエストフォージェリ攻撃は、攻撃者が被害者をあるページに誘い込み、そのページが被害者のブラウザで、被害者がログインしているサーバーに対して密かにリクエストを実行するというものです。サーバーは、そのリクエストが被害者自身の意思によって実行されたものと誤認します。そして、被害者のアイデンティティの下で、被害者が知らないうちに特定の操作(データの変更や削除、メッセージの送信など)を実行します。

Nette Frameworkは、Presenter内のフォームとシグナルを自動的にこの種の攻撃から保護します。これは、異なるドメインからの送信や呼び出しを防ぐことによって行われます。保護を無効にしたい場合は、フォームで次のように使用します:

$form->allowCrossOrigin();

または、シグナルの場合は @crossOrigin アノテーションを追加します:

/**
 * @crossOrigin
 */
public function handleXyz()
{
}

Nette Application 3.2では、属性を使用することもできます:

use Nette\Application\Attributes\Requires;

#[Requires(sameOrigin: false)]
public function handleXyz()
{
}

URL攻撃、制御コード、無効なUTF-8

攻撃者がWebアプリケーションに悪意のある入力を送り込もうとする試みに関連するさまざまな用語。その結果は非常に多様で、XML出力の破損(例:機能しないRSSフィード)から、データベースやパスワードからの機密情報の取得までさまざまです。防御策は、個々のバイトレベルですべての入力を一貫してサニタイズすることです。そして正直に言って、これをしている人はどれくらいいるでしょうか?

Nette Frameworkはこれを自動的に行います。何も設定する必要はなく、すべての入力がサニタイズされます。

セッションハイジャック、セッション盗用、セッション固定

セッション管理には、いくつかのタイプの攻撃が関連しています。攻撃者は、ユーザーのセッションIDを盗むか、または自分のセッションIDをユーザーに送りつけ、それによってユーザーのパスワードを知らなくてもWebアプリケーションにアクセスできるようになります。その後、ユーザーが知らないうちにアプリケーションで何でも実行できます。防御策は、サーバーとPHPを正しく設定することです。

Nette FrameworkはPHPを自動的に設定します。したがって、プログラマーはセッションを正しく保護する方法を考える必要がなく、アプリケーションの作成に完全に集中できます。ただし、これにはini_set()関数が有効になっている必要があります。

SameSite cookiesは、ページの読み込みにつながった原因を認識するメカニズムを提供します。これはセキュリティにとって絶対に不可欠です。

SameSiteフラグは、LaxStrictNone(これはHTTPSが必要)の3つの値を持つことができます。ページへのリクエストがWebサイトから直接来た場合、またはユーザーがアドレスバーに直接入力するかブックマークをクリックしてページを開いた場合、ブラウザはすべてのCookie(つまり、LaxStrictNoneフラグを持つもの)をサーバーに送信します。ユーザーが別のWebサイトからのリンクをクリックしてWebサイトにアクセスした場合、LaxおよびNoneフラグを持つCookieがサーバーに送信されます。リクエストが他の方法で発生した場合、例えば別のWebサイトからのPOSTフォームの送信、iframe内での読み込み、JavaScriptによるものなどでは、Noneフラグを持つCookieのみが送信されます。

NetteはデフォルトですべてのCookieをLaxフラグ付きで送信します。

バージョン: 4.0