htmlspecialchars () 는 XSS를 방지하는 기능입니다 (크로스 사이트 스크립팅 공격). 그 목적은 html (예 : < , > , " , & )의 특수 문자를 HTML 엔티티로 변환하여 페이지에서 사용자가 제출 한 악성 스크립트가 페이지에서 실행되는 것을 방지하는 것입니다.
<?php
$user_input = '<script>alert("XSS")</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>
출력 결과는 다음과 같습니다.
<script>alert("XSS")</script>
이 코드는 HTML에 악의적 인 JavaScript 주입을 효과적으로 방지하지만 이는 CSRF 공격 방어와 직접적인 관계가 거의 없습니다.
CSRF는 사용자의 "기록 된 상태"를 사용합니다. 공격자는 사용자가 링크를 클릭하거나 이미지/iframe에 액세스하도록 유도하고 특정 웹 사이트에서 사용자의 현재 로그인 상태를 사용하여 요청합니다. 예를 들어:
<img src="https://m66.net/delete_account.php" />
사용자가 m66.net 에 로그인하고 서버가 확인을 수행하지 않은 경우이 요청은 실제로 사용자 계정을 삭제할 수 있습니다.
이 공격의 핵심은 사용자가 상태 변경에 대한 요청을 수행하지 않았으며 서버가 요청을 신뢰한다는 것입니다.
htmlspecialchars () 는 "출력 단계"에서 작용하고 주로 브라우저가 악성 스크립트를 구문 분석하는 것을 방지합니다. CSRF 공격은 사용자의 브라우저에서 자동으로 시작되거나 유도 된 요청이며 페이지에 출력이 없어도 트리거 될 수 있습니다.
다시 말해, CSRF는 "사용자의 신원 위장 요청"이며 출력 컨텐츠가 피해 졌는지 여부와 관련이 없습니다. 따라서 htmlspecialchars ()는 CSRF 공격을 방지하지 않습니다.
CSRF 토큰 사용
가장 효율적인 방법은 무작위로 생성 된 CSRF 토큰을 양식에 추가하고 요청을 처리 할 때 확인하는 것입니다. 예를 들어:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<form method="POST" action="https://m66.net/update_profile.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" />
<!-- 다른 형태의 필드 -->
<button type="submit">제출하다</button>
</form>
<?php
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("불법 요청!");
}
// 업데이트 작업을 수행하십시오
}
?>
참조 또는 원점 헤더를 확인하십시오
완전히 의존 할 수는 없지만 일부 시나리오에서 요청이 합법적인지 판단하는 데 도움이 될 수 있습니다. 예를 들어:
<?php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (parse_url($referer, PHP_URL_HOST) !== 'm66.net') {
die("불법 출처");
}
?>
Samesite 쿠키 속성을 사용하십시오
현대식 브라우저는 Samesite = strict 또는 samesite = lax 의 쿠키 속성을 설정하여 제 3자가 쿠키를 요청하는 것을 방지합니다.
setcookie('session_id', $value, [
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);