>  기사  >  백엔드 개발  >  Yii2 XSS 공격 예방 전략 분석_php 예시

Yii2 XSS 공격 예방 전략 분석_php 예시

WBOY
WBOY원래의
2016-08-17 13:02:331144검색

이 글에서는 Yii2의 XSS 공격 예방 전략을 예시로 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

XSS 취약점 수정

원칙: 고객이 입력한 데이터를 신뢰하지 마세요
참고: 공격 코드가 반드시 3f1c4e4b6b16bbbd69b2ee476dc4f83a2cacc6d41bbb37262a98f745aa00fbf0

에 있을 필요는 없습니다.

① 중요한 쿠키를 http 전용으로 표시하여 Javascript의 document.cookie 문이 쿠키를 얻을 수 없도록 합니다.
② 사용자가 우리가 기대하는 데이터만 입력하도록 허용합니다. 예: 연령 텍스트 상자에는 사용자가 숫자만 입력할 수 있습니다. 숫자 이외의 문자는 필터링됩니다.
③ 데이터의 HTML 인코딩 처리
④ script, iframe, 28c3eb80c946d8b4265b6b4121a45f91, " for
와 같은 특수 HTML 태그를 필터링하거나 제거합니다. ⑤ 자바스크립트 이벤트 태그를 필터링합니다. 예를 들어 "onclick=", "onfocus" 등이 있습니다.

Yii의 XSS 방지

<&#63;php echo CHtml::encode($user->name) &#63;>

이 메소드의 소스 코드:

/**
* Encodes special characters into HTML entities.
* The [[\yii\base\Application::charset|application charset]] will be used for encoding.
* @param string $content the content to be encoded
* @param boolean $doubleEncode whether to encode HTML entities in `$content`. If false,
* HTML entities in `$content` will not be further encoded.
* @return string the encoded content
* @see decode()
* @see http://www.php.net/manual/en/function.htmlspecialchars.php
*/
public static function encode($content, $doubleEncode = true)
{
  return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, Yii::$app->charset, $doubleEncode);
}

htmlspecialchars와 htmlentities와 urlencode의 차이점:

http://php.net/manual/zh/function.htmlspecialchars.php
http://php.net/manual/zh/function.htmlentities.php
http://cn2.php.net/manual/zh/function.urlencode.php

사용 가능한 플래그 상수
상수명 설명
ENT_COMPAT는 큰따옴표를 변환하고 작은따옴표를 그대로 둡니다.
ENT_QUOTES는 큰따옴표와 작은따옴표를 모두 변환합니다.
ENT_NOQUOTES 큰따옴표와 작은따옴표 모두 변환되지 않은 상태로 둡니다.
ENT_IGNORE 빈 문자열을 반환하는 대신 잘못된 코드 단위 시퀀스를 자동으로 삭제합니다. 이 플래그는 보안에 영향을 미칠 수 있으므로 사용하지 않는 것이 좋습니다.
ENT_SUBSTITUTE 빈 문자열을 반환하는 대신 잘못된 코드 단위 시퀀스를 유니코드 대체 문자 U+FFFD(UTF-8) 또는 FFFD;(그렇지 않은 경우)로 바꿉니다.
ENT_DISALLOWED 해당 문서 유형에 대해 유효하지 않은 코드 포인트를 그대로 두는 대신 유니코드 대체 문자 U+FFFD(UTF-8) 또는 FFFD;(그렇지 않은 경우)로 대체합니다. -외부 콘텐츠가 포함된 XML 문서의 형식
ENT_HTML401 코드를 HTML 4.01로 처리합니다.
ENT_XML1 코드를 XML 1로 처리합니다.
ENT_XHTML 코드를 XHTML로 처리합니다.
ENT_HTML5 코드를 HTML 5로 처리합니다.

html특수문자

특수문자를 HTML 엔터티로 변환

string htmlspecialchars ( 
      string $string 
      [, int $flags = ENT_COMPAT | ENT_HTML401 
      [, string $encoding = ini_get("default_charset") 
      [, bool $double_encode = true ]
    ]
  ] 
)

수행된 번역은 다음과 같습니다.

&(앰퍼샌드)는 &가 됩니다
ENT_NOQUOTES가 설정되지 않은 경우 "(큰따옴표)는 "가 됩니다.
'(작은따옴표)는 ENT_QUOTES가 설정된 경우에만 '(또는 ')가 됩니다.
이 됩니다. >(보다 큼)은 >

이 됩니다.
<&#63;php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // <a href=&#039;test&#039;>Test</a>
&#63;>

html엔티티

해당되는 모든 문자를 HTML 엔터티로 변환

string htmlentities ( 
      string $string 
      [, int $flags = ENT_COMPAT | ENT_HTML401 
      [, string $encoding = ini_get("default_charset") 
      [, bool $double_encode = true ]
    ]
  ] 
)

<&#63;php
$str = "A 'quote' is <b>bold</b>";
// Outputs: A 'quote' is <b>bold</b>
echo htmlentities($str);
// Outputs: A &#039;quote&#039; is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
&#63;>

urlencode

URL 인코딩은 URL 사양을 준수합니다. 표준 URL 사양에서는 URL에 중국어와 많은 문자가 포함될 수 없기 때문입니다.

예를 들어 Baidu에서 '한자 테스트'를 검색해 보세요. URL은
이 됩니다. http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477

일명 URL 인코딩은 다음과 같습니다. 영숫자가 아닌 모든 문자는 퍼센트 기호(%) 뒤에 2개의 16진수 숫자로 대체되고 공백은 더하기 기호(+)로 인코딩됩니다.
-_를 제외하고 이 문자열에서 영숫자가 아닌 모든 문자는 퍼센트 기호(%)와 두 개의 16진수 숫자로 대체되며 공백은 더하기 기호(+)로 인코딩됩니다. 이 인코딩은 WWW 형식 POST 데이터의 인코딩과 동일하며 application/x-www-form-urlencoded 미디어 유형과 동일한 인코딩입니다. 역사적인 이유로 이 인코딩은 더하기 기호(+)로 인코딩 공간이 있는 RFC1738 인코딩(rawurlencode() 참조)과 다릅니다.

<&#63;php
echo '<a href="mycgi&#63;foo=', urlencode($userinput), '">';
&#63;>

<&#63;php
$query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
echo '<a href="mycgi&#63;' . htmlentities($query_string) . '">';
&#63;>

Yii와 관련된 더 많은 콘텐츠에 관심이 있는 독자는 이 사이트의 특별 주제인 "Yii 프레임워크 소개 및 일반 기술 요약", "우수한 PHP 개발 프레임워크 요약", "시작하기 위한 기본 튜토리얼"을 확인할 수 있습니다. with Smarty Templates", "php 객체지향 프로그래밍" 디자인 입문 튜토리얼", "php 문자열(문자열) 사용법 요약", "php+mysql 데이터베이스 조작 입문 튜토리얼" 및 "php 공통 데이터베이스 조작 기술 요약"

이 기사가 Yii 프레임워크를 기반으로 하는 모든 사람의 PHP 프로그램 설계에 도움이 되기를 바랍니다.

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