>백엔드 개발 >PHP 튜토리얼 >크로스 사이트 스크립팅 공격 (XSS)

크로스 사이트 스크립팅 공격 (XSS)

William Shakespeare
William Shakespeare원래의
2025-02-27 09:12:10524검색

Cross-Site Scripting Attacks (XSS) 키 포인트

XSS (Cross-Site Scripting Attack)는 사용자 데이터 검증 (일반적으로 웹 양식을 통해 하이퍼 링크를 삽입하거나 조작하는)으로 인해 발생하는 일반적인 코드 주입 공격입니다. 이를 통해 유해한 클라이언트 코드가 서버에 저장되거나 사용자의 브라우저에서 실행될 수 있습니다. XSS 공격은 두 가지 유형으로 나눌 수 있습니다. 비가 강한 XSS (악성 코드는 서버를 통해 전달되고 피해자에게 제시됨)와 영구 XSS (유해한 코드를 우회하고 웹 사이트의 데이터 저장소에 저장되며 정보가 웹 사이트에 표시 될 때 실행됩니다).

XSS 공격 방지는 사용자 또는 타사 소스의 데이터를 신뢰할 필요가없고 입력시 모든 데이터를 확인하고 출력시이를 피해야합니다. 여기에는 데이터 검증, 데이터 정리 및 출력 이스케이프 측정 구현이 포함됩니다.

    많은 PHP 프레임 워크가 내장 보안 조치를 제공하지만 최신 XSS 테스트 벡터로 유효성 검사 코드를 지속적으로 테스트하는 것이 중요합니다.

  • 크로스 사이트 스크립팅 공격은 인터넷에서 매일 발생하는 5 가지 주요 보안 공격 중 하나이며 PHP 스크립트가 아끼지 않을 수 있습니다. XSS라고도하는이 공격은 기본적으로 사용자 데이터의 잘못된 검증으로 인해 가능한 코드 주입 공격으로, 일반적으로 웹 양식을 통해 페이지에 삽입되거나 변경된 하이퍼 링크를 사용합니다. 주입 된 코드는 JavaScript, VBScript, HTML, CSS, Flash 등과 같은 악의적 인 클라이언트 코드 일 수 있습니다. 이 코드는 서버에 유해한 데이터를 저장하거나 사용자 브라우저에서 악의적 인 작업을 수행하는 데 사용됩니다. 불행히도, 개발자가 안전한 코드를 제공하지 못하기 때문에 주로 간단한 스크립팅 공격이 발생합니다. 모든 PHP 프로그래머가 PHP 스크립트를 공격하여 가능한 보안 취약점을 악용하는 방법을 이해하는 것은 책임입니다. 이 기사를 읽으면 크로스 사이트 스크립팅 공격과 코드를 방지하는 방법에 대해 자세히 알아보십시오.
  • 예를 통해 배우십시오
  • 다음 코드 스 니펫을 살펴 보겠습니다.
  • 여기에 데이터 입력을위한 텍스트 상자와 제출 버튼이있는 간단한 양식이 있습니다. 양식을 제출 한 후 처리를 위해 데이터를 post.php에 제출합니다. post.php를 가정합니다. 아래와 같이 데이터 만 출력하십시오
필터링이 없으면 해커는 양식을 통해 다음을 제출할 수 있으며, 이는 "Hacked"메시지와 함께 브라우저에서 팝업을 생성합니다.

이 예는 본질적으로 악의적이지만 많은 해를 입지 않는 것 같습니다. 그러나 JavaScript 코드가 사용자의 쿠키를 훔치고 민감한 정보를 추출하기 위해 작성된 경우 어떻게되는지 생각해보십시오. Simple Alert () 호출보다 XSS 공격이 악화됩니다.

크로스 사이트 스크립팅 공격은 악의적 인 페이로드를 제공하는 방법에 따라 두 가지 범주로 나눌 수 있습니다. 각 유형에 대해 자세히 논의 할 수 있습니다. 비 연개 xss 반사 XSS 공격으로도 알려진 는 악의적 인 코드가 실제로 서버에 저장되지는 ​​않지만 피해자에게 전달되어 제시되며, 이는 두 가지 전달 방법 중에서 더 인기있는 XSS 전략입니다. 공격은 이메일 또는 타사 웹 사이트와 같은 외부 소스에서 시작됩니다. 다음은 간단한 검색 결과 스크립트의 일부입니다. 이 예제는 검색 쿼리가 사용자에게 다시 표시되는 매우 안전하지 않은 결과 페이지 일 수 있습니다. 여기서 문제는 변수가 확인되거나 탈출되지 않았으므로 공격자는 다음 링크를 피해자에게 보낼 수 있다는 것입니다.

확인이 필요하지 않으며 페이지에는 다음이 포함됩니다

영속성 xss
<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>
이 유형의 공격은 악의적 인 코드가 검증 프로세스를 통과하고 데이터 저장소에 저장 될 때 발생합니다. 이것은 댓글, 로그 파일, 알림 메시지 또는 사용자 입력이 필요한 웹 사이트의 다른 부분 일 수 있습니다. 나중에이 특정 정보가 웹 사이트에 표시되면 악성 코드가 실행됩니다. 다음 예제를 사용하여 기본 파일 기반 주석 시스템을 작성하겠습니다. 이전에 도입 한 것과 동일한 양식을 가정하면 수신 스크립트가 데이터 파일에 주석을 추가합니다.

$_GET["query"] 다른 장소, comments.txt의 내용이 방문자에게 표시됩니다.

사용자가 주석을 제출하면 데이터 파일에 저장됩니다. 그런 다음 전체 파일 (따라서 전체 주석 시리즈)을 리더에게 표시합니다. 악의적 인 코드가 제출되면 유효성 검사 나 탈출이없는 상태에서 저장 및 표시됩니다.
<code class="language-php"><?php echo $_POST["comment"]; ?></code>
크로스 사이트 스크립팅 공격 방지

운 좋게도, XSS가 보호되지 않은 사이트를 공격하는 것만 큼 쉽고 예방하기가 쉽습니다. 그러나 코드 라인을 작성하기 전에 예방은 항상 명심해야합니다. 웹 환경 (개발, 준비 또는 제작이든)을 "강제"해야하는 첫 번째 규칙은 사용자 나 다른 타사 소스의 데이터를 결코 신뢰하지 않는 것입니다. 이것은 너무 강조 될 수 없습니다. 각 데이터 입력은 출력시 확인 및 탈출해야합니다. 이것은 XSS를 방지하기위한 황금률입니다. XSS 공격을 방지하기위한 신뢰할 수있는 보안 조치를 구현하려면 데이터 검증, 데이터 정리 및 출력 탈출에주의를 기울여야합니다.

데이터 검증
<code class="language-javascript">alert("hacked")</code>
데이터 검증은 응용 프로그램이 올바른 데이터로 실행되도록하는 프로세스입니다. PHP 스크립트가 사용자가 정수를 입력 할 것으로 예상되는 경우 다른 유형의 데이터는 폐기됩니다. 수신 된 각 사용자 데이터가 확인 프로세스에 실패하면 유형이 정확하고 폐기되도록 확인해야합니다. 예를 들어, 전화 번호를 확인하려면 전화 번호에 숫자 만 포함되어 있으므로 문자가 포함 된 문자열을 폐기합니다. 또한 문자열의 길이를 고려해야합니다. 약간 느슨해지기를 원한다면 대상 로케일에 특정한 전화 번호를 포맷하는 데 사용되는 플러스 표지판, 괄호 및 대시와 같은 제한된 특수 문자 세트를 허용 할 수 있습니다.

<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>
데이터 청소 데이터 청소는 데이터를 조작하는 데 중점을 두어 데이터에서 원치 않는 비트를 제거하고 올바른 형태로 정규화하여 안전 할 수 있도록 안전합니다. 예를 들어, 일반 텍스트 문자열을 사용자 입력으로 예상하면 HTML 태그를 제거 할 수 있습니다.

때로는 데이터 검증 및 청소/정규화를 동시에 수행 할 수 있습니다.

출력 탈출
<code class="language-php"><?php echo $_POST["comment"]; ?></code>
디스플레이/출력 데이터의 무결성을 보호하려면 데이터가 사용자에게 제시 될 때 탈출해야합니다. 이로 인해 브라우저가 예상치 못한 의미를 찾을 수있는 특수 문자 순서에 적용하는 것을 방지합니다.

함께
<code class="language-javascript">alert("hacked")</code>
함께!

데이터 처리의 세 가지 측면을 더 잘 이해하기 위해 이전 파일 기반 주석 시스템을 다시 살펴보고 보안을 보장하기 위해이를 수정합시다. 코드의 잠재적 취약점은

가 hinde.txt 파일에 맹목적으로 첨부 된 다음 사용자에게 직접 표시된다는 사실에서 비롯됩니다. 안전을 위해 파일에 추가하기 전에

스크립트는 먼저 들어오는 주석을 확인하여 사용자가 0이 아닌 길이의 문자열을 제공했는지 확인합니다. 결국, 빈 댓글은 그다지 흥미롭지 않습니다. 데이터 검증은 잘 정의 된 컨텍스트에서 수행해야합니다. 즉, 사용자로부터 정수를 얻을 것으로 예상하면 데이터를 정수로 변환하여 정수로 처리하여 그에 따라 검증됩니다. 이로 인해 잘못된 데이터가 발생하면 버리고 사용자에게 알리십시오. 그런 다음 스크립트는 포함될 수있는 HTML 태그를 제거하여 주석을 정리합니다. 마지막으로, 검색, 필터 및 표시 주석을 표시하십시오. 일반적으로 함수는 브라우저에서 볼 수 있도록 출력을 필터링하기에 충분합니다. 그러나 웹 페이지에서 사용중인 캐릭터 인코딩이 ISO-8859-1 또는 UTF-8이 아닌 경우
<code class="language-php"><?php // 根据查询获取搜索结果
echo "You searched for: " . $_GET["query"];

// 列出搜索结果
...</code>
를 사용해야 할 수도 있습니다. 이 두 기능에 대한 자세한 내용은 공식 PHP 문서의 각 설명을 읽으십시오. 웹과 같은 진화하는 매체에서 100% 안전한 단일 솔루션이 없음을 기억하십시오. 최신 XSS 테스트 벡터로 검증 코드를 철저히 테스트하십시오. 다음 소스의 테스트 데이터를 사용하면 코드가 여전히 XSS 공격에 취약한 지 여부가 표시됩니다.

rsnake xss 치트 시트 (코드를 테스트하는 데 사용할 수있는 상당히 포괄적 인 xss 벡터 목록) Zend Framework의 XSS 테스트 데이터

xss 치트 시트 (HTML5 기능 사용) $_POST["comment"] 요약 $_POST["comment"]

이 기사에서 크로스 사이트 스크립팅 공격이 무엇인지, 코드에서 발생하지 못하게하는 방법을 잘 설명하기를 바랍니다. 사용자 또는 다른 타사 소스의 데이터를 신뢰하지 마십시오. 잘 정의 된 컨텍스트에서 들어오는 값을 검증하고, 코드를 보호하기 위해 데이터를 정리하고, 사용자를 보호하기 위해 출력을 피함으로써 자신을 보호 할 수 있습니다. 코드를 작성한 후 가능한 한 철저하게 코드를 테스트하여 올바르게 작동해야합니다.

(Inge Schepers / Shutterstock의 그림)

이 게시물을 좋아한다면, 당신은 마스터로부터 새로운 기술과 기술을 배울 수있는 장소를 좋아할 것입니다. 회원은 Jump Start PHP와 같은 모든 SitePoint의 전자 책 및 대화식 온라인 과정에 즉시 액세스 할 수 있습니다.

이 기사에서 댓글이 닫혔습니다. PHP에 대해 궁금한 점이 있습니까? 포럼에서 질문하는 이유는 무엇입니까?

PHP 보안 및 크로스 사이트 스크립팅 공격 (XSS)에 대한 FAQ (FAQ) (FAQ)

PHP 응용 프로그램에 대한 크로스 사이트 스크립팅 (XSS) 공격의 영향은 무엇입니까?

XSS (Cross-Site Scripting) 공격은 PHP 응용 프로그램에 큰 영향을 줄 수 있습니다. 데이터 도난, 세션 납치, 웹 사이트 부패 및 사용자에게 악의적 인 코드를 배포 할 수 있습니다. XSS는 웹 애플리케이션의 악용 취약성을 공격하여 악의적 인 스크립트를 주입 한 다음 사용자의 브라우저에서 실행합니다. 이는 응용 프로그램과의 사용자 상호 작용을 위태롭게 할 수 있으며 민감한 정보를 공개 할 수 있습니다. 내 PHP 응용 프로그램에서 잠재적 XSS 취약점을 식별하는 방법은 무엇입니까? PHP 응용 프로그램에서 잠재적 XSS 취약점을 식별하려면 수동 코드 검토와 자동 테스트가 필요합니다. 사용자 입력이 적절한 청소 나 검증없이 출력에 직접 포함 된 코드에서 영역을 찾으십시오. XSS 스캐너와 같은 자동화 도구는 다양한 XSS 공격 벡터를 테스트하여 잠재적 취약점을 식별하는 데 도움이 될 수 있습니다.

XSS 공격에 사용되는 몇 가지 일반적인 방법은 무엇입니까?

XSS 공격은 일반적으로 다른 사용자가 보는 웹 페이지에 악의적 인 스크립트를 주입하는 것이 포함됩니다. 스크립트를 URL 매개 변수에 포함, 양식 입력 및 쿠키까지 포함시키는 등 다양한 방식으로 수행 할 수 있습니다. 그런 다음 악의적 인 스크립트는 세션 쿠키를 훔치거나 웹 페이지 컨텐츠를 조작하는 등 사용자를 대신하여 작업을 수행 할 수 있습니다. 내 PHP 응용 프로그램에서 XSS 공격을 방지하는 방법은 무엇입니까? PHP 응용 프로그램에서 XSS 공격 방지에는 사용자 입력을 확인하고 청소하고 인코딩 된 출력 및 적절한 HTTP 헤더를 사용하는 것이 포함됩니다. 항상 사용자 입력을 신뢰할 수없는 것으로 취급하고 허용 가능한 값의 허용 가능한 목록에 대해 검증하십시오. 유해한 문자 나 코드를 제거하려면 입력을 청소하십시오. 유해한 캐릭터가 무해하게되도록하기 위해 출력이 인코딩됩니다. 컨텐츠 보안 정책과 같은 HTTP 헤더를 사용하여 스크립트 및 기타 리소스 소스를 제한하십시오.

XSS 공격을 방지하는 데 컨텐츠 보안 정책이 어떤 역할을합니까?

CSP (Content Security Policy) HTTP 헤더는 XSS 공격을 방지하는 데 중요한 역할을합니다. 브라우저가 유효한 실행 가능한 스크립트 소스로 간주 해야하는 도메인을 지정할 수 있습니다. 즉, 공격자가 웹 페이지에 스크립트를 주입 할 수 있더라도 스크립트의 소스가 CSP에서 화이트리스트에 없으면 브라우저가 실행되지 않습니다.

스토리지 XSS 공격과 반사 XSS 공격의 차이점은 무엇입니까?

스토리지 XSS 공격에는 대상 서버에 영구적으로 저장된 악성 스크립트를 주입하는 것이 포함됩니다. 그런 다음 사용자가 특정 페이지를 보면 스크립트가 사용자에게 제공됩니다. 반면에 반사 XSS 공격은 URL 또는 양식 입력을 통해 스크립트를 주입하는 것이 포함되며, 서버는 즉시 응답을 반환하고 사용자의 브라우저에서 실행합니다.

XSS 공격을 방지하기 위해 PHP의 내장 기능을 사용하는 방법은 무엇입니까?

PHP는 XSS 공격을 방지하는 데 도움이되는 몇 가지 내장 기능을 제공합니다. 예를 들어, 함수는 사용자 입력에서 특수 문자를 인코딩하는 데 사용하여 잠재적 스크립트를 무해하게 만듭니다. 기능을 사용하여 사용자 입력을 정리, 유해 문자 삭제 또는 인코딩 할 수 있습니다.

XSS 공격을 방지하는 데 Httponly 쿠키가 어떤 역할을합니까?

httponly 쿠키는 클라이언트 스크립트를 통해 액세스 할 수없는 쿠키입니다. 이는 공격자가 웹 페이지에 스크립트를 주입 할 수 있더라도 스크립트를 사용하여 httponly 쿠키를 읽거나 수정할 수 없음을 의미합니다. 이는 XSS 공격에 의해 민감한 정보 (예 : 세션 식별자)가 도난 당하지 않도록 보호하는 데 도움이 될 수 있습니다.

XSS 공격을 사용하여 CSRF 보호를 우회 할 수 있습니까?

예, XSS 공격은 CSRF (Cross-Site Request Properery) 보호를 우회하는 데 사용될 수 있습니다. 공격자가 웹 페이지에 스크립트를 주입 할 수있는 경우이를 사용하여 사용자를 대신하여 작업을 수행하여 구현 한 CSRF 보호를 우회 할 수 있습니다. 이것이 바로 XSS 및 CSRF 공격으로부터 보호하는 것이 중요합니다.

XSS 공격에 대한 내장 보호를 제공하는 PHP 프레임 워크는 무엇입니까?

예, 많은 PHP 프레임 워크는 XSS 공격에 대한 내장 보호 기능을 제공합니다. 예를 들어 Laravel은 XSS 공격을 방지하기 위해 출력을 자동으로 인코딩합니다. Symfony 및 Codeigniter와 같은 다른 프레임 워크는 사용자 입력 및 인코딩 된 출력을 청소하는 기능을 제공합니다. 그러나 프레임 워크가 완전한 보호를 제공 할 수 없으며 XSS 공격을 방지하기위한 모범 사례를 계속 따라야한다는 점을 기억해야합니다. htmlspecialchars()

위 내용은 크로스 사이트 스크립팅 공격 (XSS)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.