복붙노트

HTML / PHP로 XSS를 방지하는 방법?

PHP

HTML / PHP로 XSS를 방지하는 방법?

HTML 및 PHP 만 사용하여 XSS (교차 사이트 스크립팅)를 방지하려면 어떻게합니까?

이 주제에 대한 다른 많은 게시물을 보았지만 실제로 XSS를 방지하는 방법을 명확하고 간결하게 명시한 기사를 찾지 못했습니다.

해결법

  1. ==============================

    1.

    기본적으로 htmlspecialchars () 함수는 사용자 입력에서 나온 브라우저에 출력 할 때마다 사용해야합니다.

    이 함수를 사용하는 올바른 방법은 다음과 같습니다.

    echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
    

    Google Code University에는 웹 보안에 대한 다음과 같은 매우 교육적인 비디오가 있습니다.

  2. ==============================

    2.

    내가 좋아하는 OWASP 참조 중 하나는 Cross-Site Scripting 설명이다. 왜냐하면 많은 수의 XSS 공격 벡터가 있지만 몇 가지 규칙 중 대다수를 대단히 방어 할 수 있기 때문이다.

    이것은 PHP 보안 속임수 시트입니다

  3. ==============================

    3.

    가장 중요한 단계 중 하나는 사용자 입력이 처리되거나 브라우저로 다시 렌더링되기 전에 사용자 입력을 삭제하는 것입니다. PHP에는 사용할 수있는 "필터"기능이 있습니다.

    XSS가 일반적으로 공격하는 형태는 사용자를위한 악의적 인 의도가 포함 된 일부 오프 사이트 자바 스크립트에 대한 링크를 삽입하는 것입니다. 자세한 내용은 여기를 참조하십시오.

    또한 사이트를 테스트하고 싶습니다. Firefox 부가 기능 XSS Me를 추천 할 수 있습니다.

  4. ==============================

    4.

    선호 순서대로 :

    또한 입력시가 아니라 출력시 이스케이프 처리를 확인하십시오.

  5. ==============================

    5.

    <?php
    function xss_clean($data)
    {
    // Fix &entity\n;
    $data = str_replace(array('&amp;','&lt;','&gt;'), array('&amp;amp;','&amp;lt;','&amp;gt;'), $data);
    $data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
    $data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
    $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');
    
    // Remove any attribute starting with "on" or xmlns
    $data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);
    
    // Remove javascript: and vbscript: protocols
    $data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
    $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
    $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
    
    // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
    $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
    $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
    $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
    
    // Remove namespaced elements (we do not need them)
    $data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);
    
    do
    {
        // Remove really unwanted tags
        $old_data = $data;
        $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
    }
    while ($old_data !== $data);
    
    // we are done...
    return $data;
    }
    
  6. ==============================

    6.

    오프라인 상태 인 SO Documentation 베타에서 통합 참조로 크로스 게시합니다.

    교차 사이트 스크립팅은 웹 클라이언트가 원격 코드를 의도하지 않게 실행하는 것입니다. 사용자가 입력을 받아 웹 페이지에서 직접 출력하는 경우 모든 웹 응용 프로그램이 XSS에 노출 될 수 있습니다. 입력 내용이 HTML 또는 JavaScript를 포함하면이 내용이 웹 클라이언트에 의해 렌더링 될 때 원격 코드가 실행될 수 있습니다.

    예를 들어 제 3 자 측에 JavaScript 파일이있는 경우 :

    // http://example.com/runme.js
    document.write("I'm running");
    

    그리고 PHP 응용 프로그램은 전달 된 문자열을 직접 출력합니다.

    <?php
    echo '<div>' . $_GET['input'] . '</div>';
    

    검사되지 않은 GET 매개 변수에