導入
近年、ウェブアプリケーションのセキュリティがますます重要視されています。特に、データの取り扱いやユーザーのプライバシー保護に関しては、開発者が意識しておくべきポイントが多く存在します。この記事では、TypeScriptを用いた具体的なセキュリティの実装例を通じて、セキュリティ基礎を学びます。
教科書レベルの解説(セキュリティ基礎)
重要な概念の整理
アプリケーションのセキュリティには、認証、認可、データの暗号化など、さまざまな要素が含まれます。特に、ユーザーからの入力を適切に扱うことは、セキュリティの観点から非常に重要です。ここでは、SQLインジェクションを防ぐための対策に焦点を当てます。
コード例(TypeScript)
import { Pool } from 'pg';
const pool = new Pool({
user: 'user',
host: 'localhost',
database: 'mydb',
password: 'password',
port: 5432,
});
async function getUserById(userId: number) {
const query = 'SELECT * FROM users WHERE id = $1';
const values = [userId];
const res = await pool.query(query, values);
return res.rows[0];
}
コードの行ごとの解説
- import { Pool } from ‘pg’;
PostgreSQL用のクライアントライブラリをインポートします。 - const pool = new Pool(…);
データベースへの接続プールを作成します。接続情報は環境に応じて設定します。 - async function getUserById(userId: number) {
ユーザーIDを引数に取り、非同期関数を定義します。 - const query = ‘SELECT * FROM users WHERE id = $1’;
SQLクエリを定義します。プレースホルダーを使用することで、SQLインジェクションを防ぎます。 - const values = [userId];
クエリに渡す値を配列に格納します。 - const res = await pool.query(query, values);
クエリを実行し、結果を取得します。 - return res.rows[0];
取得したユーザー情報を返します。
練習問題編
以下の練習問題に挑戦して、セキュリティの理解を深めてください。
- SQLインジェクションを防ぐための他の手法を挙げてください。
模範解答: ORMの使用、ホワイトリスト方式の入力検証、ストアドプロシージャの利用など。 - TypeScriptでユーザーのパスワードを安全に保存する方法は何ですか?
模範解答: bcryptなどのハッシュ化ライブラリを使用して、パスワードをハッシュ化して保存する。 - セキュリティにおけるCORSの役割について説明してください。
模範解答: CORSは、異なるオリジン間でのリソース共有を制御し、悪意のあるリクエストを防ぐための仕組み。 - ユーザーの入力を検証する際に注意すべき点は何ですか?
模範解答: 入力の型、長さ、範囲、フォーマットを検証し、サニタイズを行うことが重要。
まとめ
- SQLインジェクション対策としてプレースホルダーを使用することが効果的です。
- ユーザーのパスワードはハッシュ化して保存し、平文で保存しないことが基本です。
- セキュリティ対策は、アプリケーション開発の初期段階から組み込むことが望ましいです。