fix: harden unicode safety checks

This commit is contained in:
Affaan Mustafa
2026-03-29 08:59:06 -04:00
parent dd675d4258
commit 866d9ebb53
239 changed files with 3780 additions and 3962 deletions

View File

@@ -21,13 +21,13 @@ description: 認証の追加、ユーザー入力の処理、シークレット
### 1. シークレット管理
#### 絶対にしないこと
#### FAIL: 絶対にしないこと
```typescript
const apiKey = "sk-proj-xxxxx" // ハードコードされたシークレット
const dbPassword = "password123" // ソースコード内
```
#### 常にすること
#### PASS: 常にすること
```typescript
const apiKey = process.env.OPENAI_API_KEY
const dbUrl = process.env.DATABASE_URL
@@ -107,14 +107,14 @@ function validateFileUpload(file: File) {
### 3. SQLインジェクション防止
#### 絶対にSQLを連結しない
#### FAIL: 絶対にSQLを連結しない
```typescript
// 危険 - SQLインジェクションの脆弱性
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
await db.query(query)
```
#### 常にパラメータ化されたクエリを使用
#### PASS: 常にパラメータ化されたクエリを使用
```typescript
// 安全 - パラメータ化されたクエリ
const { data } = await supabase
@@ -139,10 +139,10 @@ await db.query(
#### JWTトークン処理
```typescript
// 誤りlocalStorageXSSに脆弱
// FAIL: 誤りlocalStorageXSSに脆弱
localStorage.setItem('token', token)
// 正解httpOnly Cookie
// PASS: 正解httpOnly Cookie
res.setHeader('Set-Cookie',
`token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)
```
@@ -299,18 +299,18 @@ app.use('/api/search', searchLimiter)
#### ロギング
```typescript
// 誤り:機密データをログに記録
// FAIL: 誤り:機密データをログに記録
console.log('User login:', { email, password })
console.log('Payment:', { cardNumber, cvv })
// 正解:機密データを編集
// PASS: 正解:機密データを編集
console.log('User login:', { email, userId })
console.log('Payment:', { last4: card.last4, userId })
```
#### エラーメッセージ
```typescript
// 誤り:内部詳細を露出
// FAIL: 誤り:内部詳細を露出
catch (error) {
return NextResponse.json(
{ error: error.message, stack: error.stack },
@@ -318,7 +318,7 @@ catch (error) {
)
}
// 正解:一般的なエラーメッセージ
// PASS: 正解:一般的なエラーメッセージ
catch (error) {
console.error('Internal error:', error)
return NextResponse.json(

View File

@@ -24,7 +24,7 @@
#### 最小権限の原則
```yaml
# 正解:最小限の権限
# PASS: 正解:最小限の権限
iam_role:
permissions:
- s3:GetObject # 読み取りアクセスのみ
@@ -32,7 +32,7 @@ iam_role:
resources:
- arn:aws:s3:::my-bucket/* # 特定のバケットのみ
# 誤り:過度に広範な権限
# FAIL: 誤り:過度に広範な権限
iam_role:
permissions:
- s3:* # すべてのS3アクション
@@ -65,14 +65,14 @@ aws iam enable-mfa-device \
#### クラウドシークレットマネージャー
```typescript
// 正解:クラウドシークレットマネージャーを使用
// PASS: 正解:クラウドシークレットマネージャーを使用
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
const client = new SecretsManager({ region: 'us-east-1' });
const secret = await client.getSecretValue({ SecretId: 'prod/api-key' });
const apiKey = JSON.parse(secret.SecretString).key;
// 誤り:ハードコードまたは環境変数のみ
// FAIL: 誤り:ハードコードまたは環境変数のみ
const apiKey = process.env.API_KEY; // ローテーションされず、監査されない
```
@@ -99,7 +99,7 @@ aws secretsmanager rotate-secret \
#### VPCとファイアウォール設定
```terraform
# 正解:制限されたセキュリティグループ
# PASS: 正解:制限されたセキュリティグループ
resource "aws_security_group" "app" {
name = "app-sg"
@@ -118,7 +118,7 @@ resource "aws_security_group" "app" {
}
}
# 誤り:インターネットに公開
# FAIL: 誤り:インターネットに公開
resource "aws_security_group" "bad" {
ingress {
from_port = 0
@@ -142,7 +142,7 @@ resource "aws_security_group" "bad" {
#### CloudWatch/ロギング設定
```typescript
// 正解:包括的なロギング
// PASS: 正解:包括的なロギング
import { CloudWatchLogsClient, CreateLogStreamCommand } from '@aws-sdk/client-cloudwatch-logs';
const logSecurityEvent = async (event: SecurityEvent) => {
@@ -177,7 +177,7 @@ const logSecurityEvent = async (event: SecurityEvent) => {
#### 安全なパイプライン設定
```yaml
# 正解安全なGitHub Actionsワークフロー
# PASS: 正解安全なGitHub Actionsワークフロー
name: Deploy
on:
@@ -237,7 +237,7 @@ jobs:
#### Cloudflareセキュリティ設定
```typescript
// 正解セキュリティヘッダー付きCloudflare Workers
// PASS: 正解セキュリティヘッダー付きCloudflare Workers
export default {
async fetch(request: Request): Promise<Response> {
const response = await fetch(request);
@@ -281,7 +281,7 @@ export default {
#### 自動バックアップ
```terraform
# 正解自動RDSバックアップ
# PASS: 正解自動RDSバックアップ
resource "aws_db_instance" "main" {
allocated_storage = 20
engine = "postgres"
@@ -327,10 +327,10 @@ resource "aws_db_instance" "main" {
### S3バケットの露出
```bash
# 誤り:公開バケット
# FAIL: 誤り:公開バケット
aws s3api put-bucket-acl --bucket my-bucket --acl public-read
# 正解:特定のアクセス付きプライベートバケット
# PASS: 正解:特定のアクセス付きプライベートバケット
aws s3api put-bucket-acl --bucket my-bucket --acl private
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
```
@@ -338,12 +338,12 @@ aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
### RDS公開アクセス
```terraform
# 誤り
# FAIL: 誤り
resource "aws_db_instance" "bad" {
publicly_accessible = true # 絶対にこれをしない!
}
# 正解
# PASS: 正解
resource "aws_db_instance" "good" {
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.db.id]