SHT30 온습도 모니터링 시스템 전체 소스(서버 PHP, STM32 펌웨어, SQL, 테스트). 전체 코드리뷰에서 도출된 보안 하드닝 10건 반영: - 요청 서명 HMAC-SHA256 전환(펌웨어 sig.c/서버 config.php/호스트 패리티 동시) - 재전송 방어 + 기본 API_KEY fail-closed + 디바이스 문자열 정제(api/sensor_data.php) - 오프라인 SMS 중복 발송 경합 제거(cron_heartbeat.php, 원자적 선점) - CSV 수식 주입 방지(monthly_report.php), 감사로그 회전 락(retention_cleanup.php) - 브루트포스 카운터 원자화(login.php), 예시 TOTP 비밀키 무효화, 마이그레이션 멱등화 _backup/(하드코딩 실 비밀값 포함)·config.local.php·런타임 상태는 .gitignore 제외.
49 lines
2.3 KiB
ApacheConf
49 lines
2.3 KiB
ApacheConf
# =============================================================================
|
|
# .htaccess - 누수감지 시스템 보안 설정
|
|
# 배포 경로: pores.kr/raspi_leck_detecter/
|
|
# =============================================================================
|
|
|
|
# ─── HTTPS 강제 리다이렉트 ─────────────────────────────────
|
|
# cafe24 호스팅 관리자 패널에서 SSL 리다이렉트 설정 사용
|
|
# (.htaccess 리다이렉트는 리버스 프록시 환경에서 무한 루프 유발)
|
|
|
|
<IfModule mod_rewrite.c>
|
|
RewriteEngine On
|
|
|
|
# var/ 디렉토리 접근 차단
|
|
RewriteRule ^var/ - [F,L]
|
|
|
|
# [v2] uploads/ 디렉토리 PHP 실행 차단
|
|
RewriteRule ^uploads/.*\.ph(p[3457]?|t|tml)$ - [F,L]
|
|
|
|
# 불필요 HTTP 메소드 차단
|
|
RewriteCond %{REQUEST_METHOD} ^(TRACE|DELETE|PUT|PATCH) [NC]
|
|
RewriteRule .* - [F,L]
|
|
</IfModule>
|
|
|
|
# ─── 민감 PHP 파일 직접 접근 차단 ─────────────────────────
|
|
<FilesMatch "^(config|config\.local|config\.local\.example|sms_send|incidents|ops_checks|setup_hash|test_mobile)\.php$">
|
|
<IfModule mod_authz_core.c>
|
|
Require all denied
|
|
</IfModule>
|
|
<IfModule !mod_authz_core.c>
|
|
Order deny,allow
|
|
Deny from all
|
|
</IfModule>
|
|
</FilesMatch>
|
|
|
|
# ─── 보안 헤더 ───────────────────────────────────────────
|
|
<IfModule mod_headers.c>
|
|
Header always set X-Content-Type-Options "nosniff"
|
|
Header always set X-Frame-Options "DENY"
|
|
Header always set X-XSS-Protection "1; mode=block"
|
|
Header always set Referrer-Policy "strict-origin-when-cross-origin"
|
|
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none'; form-action 'self'"
|
|
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
|
|
Header always unset X-Powered-By
|
|
</IfModule>
|
|
|
|
# ─── 디렉토리 목록 비활성화 ──────────────────────────────
|
|
<IfModule mod_autoindex.c>
|
|
Options -Indexes
|
|
</IfModule>
|