외부링크를 새창으로 띄우기 위해 애드온을 사용중입니다.

 

원래 애드온 사용 목적이 자신의 도메인이 아닌 경우는 모두 새창으로 뜨우는 것 이어서 애드온 설정에 자신의 도메인 일부를 입력하여 이 입력된 문자와 일치하지 않는 모든 링크는 새창으로 띄우게 되어 있습니다. 

 

그런데 최근 #user_content_ 링크를 사용하게 되면서 이 링크의 경우 도메인이 없어서 새창으로 띄워지게 되는데요.

 

그래서 애드온 설정에 입력 한개를 더 만들어서 자신의 도메인, user_content  두개가 없는 경우 새창으로 띄우게 애드온을 수정하려 합니다.

 

if($called_position == 'before_display_content' && Context::getResponseMethod() == 'HTML') {
    $inurl = $addon_info->inurl;

    $inurlext= $addon_info->inurlext;  // 새롭게 추가할 예정입니다.
    if($inurl) {
        $pos_regx = "!<\!--AfterDocument\(([0-9]+),([0-9]+)\)-->!is";
        $addHTML .= "<script>
jQuery(document).ready(function(){
    jQuery('.xe_content[class^=document_] a, .xe_content[class^=comment_] a').each(function() {
    var a = jQuery(this).attr('href');
    var b = /(".$inurl.")/g;
    if(!b.test(a))
{
    jQuery(this).attr('target', '_blank');
    } 
    });
});
</script>";

 

 

 

파란색 부분이 바뀌어야 할 것 같은데 어떻게 바꿔야 할지 모르겠습니다.

 

  • Lv30
    제대로 한건지 모르겠지만...

    var a = jQuery(this).attr('href');
    var b = /(".$inurl.")/g;
    var c = /(".$inurlext.")/g;
    if(!b.test(a) && !c.test(a)) {
    jQuery(this).attr('target', '_blank');
    }
    });


    이렇게 하니 되네요.
  • Lv37

    $inurl이나 $inurlext에 /, [, ], $, +, 마침표(.) 등 정규식에서 특별한 의미를 갖는 문자가 들어가면

    이상하게 해석되거나 스크립트 오류가 발생할 수도 있으니 주의하시기 바랍니다.

    xetown.com이 포함되어 있는지 체크하려다가 xetown-com.net까지 통과하는 수가 있어요.

     

    굳이 정규식을 사용할 필요가 없다면 b, c 모두 제거하고

        if(a && a.indexOf(".json_encode($inurl).") < 0 && a.indexOf(".json_encode($inurlext).") < 0) {

    이렇게 문자열 그대로 비교하도록 하면 나중에 어떤 설정을 넣더라도 걱정할 필요가 없겠네요.

        - JS의 indexOf는 PHP의 strpos 함수와 같은 기능이지만, 문자열을 찾지 못한 경우 -1을 반환합니다.

        - 처음에 a && 조건을 붙이는 이유는 href 속성이 아예 없는 경우를 제외하기 위해서입니다.

        - json_encode 함수를 사용하면 특수문자가 모두 JS 방식으로 인코딩되고 양쪽에 따옴표까지 붙어서

          스크립트에 넣기에 완벽한 형태로 변환됩니다.

     

    이번에 나온 target="_blank" 관련 보안패치까지 고려한다면

        jQuery(this).attr('target', '_blank').attr('rel', 'noopener');

    이렇게 해주는 것이 더 좋겠습니다.

     

    그런데

        http://다른사이트.com/xe/index.php?hack=님사이트주소&mid=foo&document_srl=1234

    이런 주소를 억지로 만들어 쓰면 새창에 뜨는 것을 피할 수 있겠네요 ㅎㅎ

    보안 기능이 아닌 편의 기능이라면 별 문제는 없겠지만...

  • Lv37 Lv30
    오... 뭔가 어려운것 같지만 말씀하신대로 고쳐서 쓰겠습니다. 감사합니다.