설치 및 사용방법
1) 다운로드
개요
<img>, <image>, <source>, <object>, <embed> 태그의 src 또는 href 속성을 이용한 CSRF 가 가능하다는 것을 알게 되었습니다.
최근 알게된 이 문제에 대해서 방어하는 애드온입니다. 조만간 XE Core 공식 업데이트가 있을 것이라 예상하지만, 그 사이에 있을 수 있는 공격을 예방합니다.
기능
- 글 작성시 문제가 될 수 있는 <img> 요소를 무의미한 <span> 요소로 치환합니다.
- 이미 작성된 CSRF 공격 글에 대해 IE, FireFox, Chrome 브라우저의 HTTP ACCEPT 헤더 정보를 이용해 최대한 방어합니다.
사용권
이 프로그램의 사용권은 MIT 라이선스를 따릅니다.
애드온 코드 정보
다음은 이 애드온의 핵심 코드입니다. 참고할 수 있도록 게시글에 포함합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?php /** * @file soo_replace_content.addon.php * @author MinSoo Kim <misol.kr@gmail.com> * @brief Replace image tag CSRF text. */ // Stop if non-logged-in user is if (!defined( '__XE__' )) exit (); /** * Replace content * */ if (( $this ->act === 'procBoardInsertDocument' || $this ->act === 'procBoardInsertComment' || $this ->act === 'procTextyleInsertComment' ) && $called_position == 'before_module_init' && is_string (Context::get( 'content' ))) { $board_content = '' ; $board_content = strval (Context::get( 'content' )); $board_content = preg_replace( "/\<(img|image|source|object|embed)[^>]+(src|href|data)\=[^>]+act\=(disp|proc)[^>]+\>([^<]*?\<\/(image|source|object|embed)\>)?/im" , '<span class="misol_dummy"></span>' , $board_content ); Context::set( 'content' , $board_content ); } /** * if XE is requested... with img tag close. **/ if (( stripos ( $this ->act, 'proc' ) !== FALSE || stripos ( $this ->act, 'disp' ) !== FALSE) && $called_position == 'before_module_init' ) { $http_img_accept_headers = array ( 'image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5' , // InternetExplorer IMG 'image/png,image/svg+xml,image/jxr,image/*;q=0.8,*/*;q=0.5' , // InternetExplorer 11, MS Edge IMG 'image/png,image/*;q=0.8,*/*;q=0.5' , // FireFox IMG 'image/webp,*/*;q=0.8' , //Chrome IMG 'image/webp,image/*,*/*;q=0.8' , //Chrome IMG 'audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6;*/*;q=0.5' , // FireFox VIDEO 'video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5' , //FireFox AUDIO 'video/webm,video/ogg,video/*;q=0.9,application/ogg=0.7,audio/*;q=0.6;*/*;q=0.5' //FireFox AUDIO ); if (in_array( str_replace ( array ( ' ' , ' ' ), array ( '' , '' ), $_SERVER [ 'HTTP_ACCEPT' ]), $http_img_accept_headers )) { Context::close(); exit (); } } ?> |