포럼
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
제가 문제를 일으킨 코드를 걸러내는 애드온입니다.
2015.10.16 02:43
soo_replace_content.zip
다운 받으셔서 압축을 푸신 후 애드온으로 설치하시면 됩니다.
기능은 단순합니다.
기능1
/\<img[^>]+src\=[^>]+act=(disp|proc)[^>]+\>/im 구문이 <span class="misol_dummy"></span> 로 치환됩니다. 공백이 아닌 이유는 공백이 되면서 새로운 CSRF 코드가 완성될 수도 있기 때문입니다.
기능2
알려진 브라우저 ACCEPT 헤더를 가진 브라우저에서 해당 코드가 있는 페이지를 방문하더라도 실제 실행되지 않도록 했습니다.
사용권
사용권은 MIT 라이선스를 따릅니다.
<?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[^>]+src\=[^>]+act=(disp|proc)[^>]+\>/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=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(); } } ?>