初めてのWebアプリ開発C# 知っておくべきセキュリティガイドライン
今回は自分が開発しているWebアプリでセキュリティ脆弱性がどれだけ見つかるか、トライアルであるツールを利用させて頂きホワイトボックス型のテストを行いました。そもそもWebアプリを作成するのが現在初めての取り組みであり、セキュリティに対する知識もなく開発をおこなっていました。とても心配で、自分が開発しているソフトは大丈夫なのか不安でした。今回テストを行って引っかかったのは、XSSとCSRFの二つが主でした。また、参照しているパッケージの更新も引っかかりました。これからWeb開発をしようと考えている方がいましたらご一読いただき参考になればなと思います。
よくある脆弱性と対策方法
クロスサイトスクリプティング (XSS)
クロスサイトスクリプティング(XSS)は、悪意のあるユーザーがウェブページに不正なスクリプトを埋め込む攻撃です。このスクリプトは、他のユーザーのブラウザで実行され、そのユーザーのデータを盗んだり、操作したりすることができます。
エスケープ
エスケープはHTMLやJavaScriptの特殊文字を安全な形式に変換します。ASP.NET CoreのRazorビューでは自動的にHTMLエスケープが行われますが、注意が必要なケースもあります。
例: Razorビューでのエスケープ
@Html.Encode(Model.InputText)
サニタイズ
サニタイズとは、入力データから不要または危険な要素を除去するプロセスです。HTMLコンテンツを許容する場合は、信頼できるライブラリを使用してサニタイズしましょう。
・HtmlSanitizer: HTMLをクリーンな状態に保つ
・サニタイズ処理のサンプル:
var sanitizer = new HtmlSanitizer();
var sanitizedHtml = sanitizer.Sanitize(userInput);
エスケープとサニタイズの使い分け
- エスケープ: 主に表示目的で使用(例: ユーザーの名前やコメントをそのまま出力する場合)。
- サニタイズ: 安全に一部のHTMLタグを許容する必要がある場合(例: ユーザーがフォーマット可能な投稿を行う機能)。
クロスサイトリクエストフォージェリ (CSRF)
クロスサイトリクエストフォージェリ(CSRF)は、悪意のあるウェブサイトが、ユーザーがログインしている他のサイトに不正なリクエストを送信させる攻撃です。具体的には、ユーザーが他のウェブサイトにログインしている状態で、攻撃者が意図的にそのユーザーを操作して不正な操作(例えば、パスワード変更や送金)をさせることができます。
意図しないリクエストを防ぐために、CSRFトークンを活用する
フォーム例
<form asp-action="Submit" method="post">
@Html.AntiForgeryToken()
<input type="text" name="example" />
<button type="submit">Submit</button>
</form>
コントローラー例
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Submit(ExampleModel model)
{
// 処理
}
認証とセッション管理
セッションの乗っ取りを防ぐには、ASP.NET Identityを使用し、クッキーに適切なフラグ(HttpOnly
やSecure
)を付けることが重要。
例:クッキー設定
services.ConfigureApplicationCookie(options =>
{
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // HTTPSでのみ送信
options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
});
まとめ
今回は、Webアプリ開発初心者の私が脆弱性診断をおこなった結果として、指摘された脆弱性についてまとめました。私が開発したソフトのコードでは、XSS攻撃に対する脆弱性の指摘がほとんどでした。CSRFに関しては、私が取り扱っている情報は攻撃者には有用な情報はほとんど取り扱っていないため、そこまで深刻度は高くありませんでした。トライアル時にお世話になった担当の方の経験では、CSRFに関しては、情報が抜き取られても有用な情報でない場合は、対応しないという判断を下した会社もあるようです。このように、開発リソースは限られていることが大半なので、何の対策はおこない、何の対策はおかなわないと開発チームであらかじめ決めておくのは大切かと思いました。