제가 문제를 일으킨 코드를 걸러내는 애드온입니다.
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();
}
}
?>
/**
* @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();
}
}
?>
댓글 26
고생하셨습니다. :p
이제 좀 쉬세요~ ㅎㅎ
style태그를 통한 background:url()의 경우는 어떨까요? (리무브핵으로 막히나..)
아무튼 고생하셨습니다.
절대 잘못하신 거 없으시니, 마음 무겁게 가지지 마세요..ㅎㅎ 미솔님꼐서 일으킨 문제라뇨..
당치도 않습니다! XE 문제인거죠!!
이 애드온을 적용한다면 이 모듈은 사용할 수 없겠네요...;;
if($this->act == 'copytrack' ) return;
에드온 받아서 설치했습니다.
다운 받아 압축풀고 업로드하고 설정하니
5분 정도 소요되었네요
근데 이 5분을 위해 대체 몇시간을 고생하셨을지를 생각하면...
그저 감사하단 말로는 너무 부족한 듯 하지만.
그래도
감사합니다!
감사합니다!!
감사합니다!!!
감사합니다!!!!
감사합니다!!!!!