이 글에서는 주로 Yii2의 XSS 공격 예방 전략을 소개하고, XSS 공격의 원리와 그에 따른 Yii2의 예방 전략을 좀 더 자세히 분석합니다. 예를 들어. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다. XSS 취약점 복구원칙: 고객이 입력한 데이터를 신뢰하지 마세요참고: 공격 코드가 반드시 < /script><p><br>① 중요합니다. 쿠키는 http로만 표시되므로 Javascript의 document.cookie 문은 쿠키를 얻을 수 없습니다. </p>② 사용자는 예상한 데이터만 입력할 수 있습니다. 예: 연령 텍스트 상자에는 사용자가 숫자만 입력할 수 있습니다. 숫자 이외의 문자는 필터링됩니다. <p>3 데이터의 HTML 인코딩 처리 <br>4 스크립트, iframe, < for <, > " for<br>⑤ JavaScript 이벤트 태그와 같은 특수 HTML 태그를 필터링하거나 제거합니다. 예를 들어 "onclick=", "onfocus" 등이 있습니다. <br><br></p>Yii<p><strong></strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><?php echo CHtml::encode($user->name) ?></pre><div class="contentsignin">로그인 후 복사</div></div><p class="jb51code"></p><p>이 방법의 소스 코드: </p><p></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;">/** * 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); }</pre><div class="contentsignin">로그인 후 복사</div></div><p class="jb51code"></p><p>htmlspecialchars & htmlentities & urlencode 세 가지의 차이점: </p><p>http://php.net/ manual/ zh/function.htmlspecialchars.php</p>http://php.net/manual/zh/function.htmlentities.php<p>http://cn2.php.net/manual/zh/function.urlencode.php<br/><br/>사용 가능 플래그 상수 </p>상수 이름 설명<p>ENT_COMPAT는 큰따옴표를 변환하고 작은따옴표는 그대로 둡니다.<br/>ENT_QUOTES 큰따옴표와 작은따옴표를 모두 변환합니다.<br/>ENT_NOQUOTES 큰따옴표와 작은따옴표를 모두 변환하지 않은 상태로 둡니다.<br/>ENT_IGNORE 대신 잘못된 코드 단위 시퀀스를 자동으로 삭제합니다. » 보안에 영향을 미칠 수 있으므로 이 플래그를 사용하지 않는 것이 좋습니다.<br/>ENT_SUBSTITUTE 빈 문자열을 반환하는 대신 유효하지 않은 코드 단위 시퀀스를 유니코드 대체 문자 U+FFFD(UTF-8) 또는 FFFD로 바꾸십시오. <br/>ENT_DISALLOWED 해당 문서 유형에 대해 유효하지 않은 코드 포인트를 그대로 두는 대신 유니코드 대체 문자 U+FFFD(UTF-8) 또는 FFFD(그렇지 않은 경우)로 대체합니다. 외부 콘텐츠가 포함된 XML 문서입니다.<br/>ENT_HTML401 코드를 HTML 4.01로 처리합니다.<br/>ENT_XML1 코드를 XML 1로 처리합니다.<br/>ENT_XHTML 코드를 XHTML로 처리합니다.<br/>ENT_HTML5 코드를 HTML 5로 처리합니다.<br/><br/></p>htmlspecialchars<p><strong></strong>변환 형식 HTML 엔터티에 대한 특수 문자</p><p></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;">string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ] ] ] )</pre><div class="contentsignin">로그인 후 복사</div></div><p class="jb51code"></p><p>수행된 번역은 다음과 같습니다.</p><p>&(앰퍼샌드)는 &</p>"(큰따옴표)는 ENT_NOQUOTES가 설정되지 않은 경우 "가 됩니다.<p>'(작은따옴표)는 '(또는 ' ) ENT_QUOTES가 설정된 경우에만 적용됩니다.<br/><(보다 작음)은 <<br/>>(보다 큼)은 ><br/><br/></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;"><?php $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); echo $new; // <a href='test'>Test</a> ?></pre><div class="contentsignin">로그인 후 복사</div></div><p class="jb51code"></p><p></p>htmlentities<p><strong></strong>해당되는 모든 문자를 HTML 엔터티로 변환합니다. </p><p> </p><p class="jb51code"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;">string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ] ] ] )</pre><div class="contentsignin">로그인 후 복사</div></div></p><p></p><p class="jb51code">urlencode</p><p></p>URL 인코딩은 URL 사양을 준수합니다. 표준 URL 사양에서는 URL에 중국어와 많은 문자가 포함될 수 없기 때문입니다. <p><strong>예를 들어 바이두에서 "한자 테스트"를 검색해 보세요. URL은 </strong>http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477</p><p>소위 URL 인코딩은 다음과 같습니다. : 영숫자가 아닌 문자는 퍼센트 기호(%)와 2개의 16진수 숫자로 대체되며 공백은 더하기 기호(+)로 인코딩됩니다. </p> 이 문자열에서 -_를 제외한 모든 문자는 영숫자가 아닌 문자로 대체됩니다. 퍼센트 기호(%) 뒤에 두 개의 16진수 숫자, 공백이 더하기 기호(+)로 인코딩됩니다. 이 인코딩은 WWW 형식 POST 데이터의 인코딩과 동일하며 application/x-www-form-urlencoded 미디어 유형과 동일한 인코딩입니다. 역사적인 이유로 이 인코딩은 더하기 기호(+)로 인코딩 공간이 있는 RFC1738 인코딩(rawurlencode() 참조)과 다릅니다. <p><br/></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;"><?php $str = "A 'quote' is <b>bold</b>"; // Outputs: A 'quote' is <b>bold</b> echo htmlentities($str); // Outputs: A 'quote' is <b>bold</b> echo htmlentities($str, ENT_QUOTES); ?></pre><div class="contentsignin">로그인 후 복사</div></div><p><br/></p><p class="jb51code"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;"><?php echo '<a href="mycgi?foo=', urlencode($userinput), '">'; ?></pre><div class="contentsignin">로그인 후 복사</div></div><p></p> <p class="jb51code"></p>위 내용은 모두의 학습에 도움이 되기를 바랍니다. <p></p>관련 권장 사항: <p class="art_xg"></p> <p>Yii 캐시 정리 구현 방법</p> <p></p> <p><a href="http://www.php.cn/php-weizijiaocheng-403898.html" target="_blank">Yii2.0 기본 코드에서 이스케이프된 라우팅 링크를 처리하는 방법</a><br></p> <p><a href="http://www.php.cn/php-weizijiaocheng-403874.html" target="_blank"></a><br></p> <p></p>