<script>//<![CDATA[
    var imgInjection = xe.createPlugin("img_injection", {
        API_BEFORE_VALIDATE : function(sender, params) {
            jQuery(params).find('input[name=content]').val().replace(/<img(.*)src=\"(.*)act=(disp|proc)(.*)>/gi, '');
        }
    });
    
    var oImgInjection = new imgInjection();
    var oImgValidator = xe.getApp("Validator")[0];
    oImgValidator.registerPlugin(oImgInjection);
//]]></script>

 

레이아웃이든 어디든 좋습니다. 위 스크립트를 추가하세요. 그러면 글 등록 시 알아서 해당 이미지 태그를 지워 줍니다.

 

저는 이 문제를 근본적으로 해결하는 방법이 xml_js_filter.js legacy_filter()에서 필터링 하는거라고 생각합니다.

물론 서버사이드에서 정규식으로 지워도 되겠지만... 입력 모듈이 document모듈 하나만 있는것도 아니고 다른 개발자가 만드는 모듈도 있을테니, 하지만 filter 기능을 쓰게 되면 모든 검사로직이 legacy_filter()로 모이게 되니 이곳이 어떻게 보면 효율적인 최종 방어라인이 아닐까 생각되네요.

 

위 스크립트는 XE가 행복한고니님이 제작한 JAF 방식을 사용 하고 있기 때문에 폼이 넘어가기전에 인터셉트하는 방법입니다.

  • ?
    만약에요.. 자바스크립트를 비활성화 한 상태에서 글을 쓴다면 글이 아예 안써질까요? input name=content 의 값은 소스 수정을 통해서 채울 수도 있지 않을까요? 그 다음 폼 제출을 한다면.. 물론 POST 로 전송되겠지만요. (XML이 아니라.)
  • ? profile

    위 스크립트는 지금 문제되는 것을 임시로 처방한거고요. :)

    근본적으로는 위에 설명된 함수에서 죄다 검사하는게 좋을 거 같아요. 그리고 따로 개발된 모듈이 자바 스크립트 의존하지 않고 FORM으로 그냥 넘기는 경우도 대비해서 서버에서도 처리하는게 좋겠고요.

     

    현재 XE에서 제공하고 있는 입력폼은 자바스크립트 없이 document에 등록 못할 거 같은데요?

  • ? profile

    별로 좋아하지 않는 코어 수정방법입니다만,,

     

    ./config/func.inc.php 파일을 열으셔서

     

    약 1084 줄 쯤에 function removeHackTag($content) 있는데. (removeHackTag 검색)

     

     

     purifierHtml($content); 바로 위에 (밑에도 상관은 없음)

     

     $content = preg_replace('/<(img|iframe)(.*)src=\"(.*)act=(disp|proc)(.*)>/gi','',$content);

     

    이거 한 줄 추가해주시면 됩니다.

     

    글작성이라던지, 댓글 작성의 경우 무조건 removeHackTag를 실행해서 체크하니.. 여기에 넣어주면 동시 적용됩니다.

    (아마 서명도 될겁니다.)

     

    다만, 관리자는 removeHackTag을 거치지 않으니, 반영되지 않습니다.

  • profile profile
    ==b 버그하나 나오니까 해결책이 막 나오네요 ㅋㅋ
  • profile profile
    정규식은 그저 라르게덴님꺼 썼습니다 크크
  • profile ?
    하...이것도 저에게는 새로운 문제입니다. T.T 위 라르게덴님 팁을 적용하고 이걸 추가로 적용 해야 하나요. T.T ? 아님 하늘희님 팁만 적용하는 건가요?
  • ?

    제가 잘 몰라서 그런데요.. 이 패치를 하면 아래 콘노리님 패치를 안해도 되나요? 아님 콘노리님 패치도 적용하고 라르게덴님팁+ 하늘희님 팁을 적용해야 하나요?

  • ? profile
    우선 안전관련 문제는 코노리님 것만 적용하면 됩니다.

    다만 로그아웃 같은 단순한 애교 수준은 GET이 허용되어 있기 때문에 본문을 읽자마자 로그아웃되는 장난은 가능합니다.

    따라서 위까지 적용하면 그런 행위까지 차단된다고 보시면 됩니다.(글 등록 하기 전 해당 문법이 있을 경우 강제로 지워버립니다.)
  • profile ?
    아. 답변 감사합니다. 그럼 라르게덴님 팁 + 하늘희님 팁 모두 추가로 적용 하면 되겠죠?
  • ? profile
    네 중복 적용해도 됩니다.

    참고로 라르게덴님 코드는 자바로 처리하는 것이고,

    저는 실제 db에 저장되기 전 php에서 처리하는 것입니다.

    굳이 중복으로 할 필요는 없지만, 이중 삼중으로 해도.. 나쁠 건 없지요 :)
  • profile ?
    아하. 네. 시원한 답변 감사합니다. :-)
  • ? profile
    무슨 문제인지 모르겠으나,,

    현재 제가 알려드린 방법을 적용하면 안됩니다...!!!

    저도 지금 막 알았는데, 댓글이나, 본문 내용 자체가 날라가버립니다... (헉)