htmlspecialchars_decode 를 쓰면 보안상 문제가 없을까요?

 

htmlspecialchars로는 글자 볼드나 색깔 입력시 

 

태그가 그대로 노출이 되어서

 

다른 위젯 뜯어보니 이런 식으로 처리하고 있던데

 

괜찮을까요?

  • profile

    전혀 괜찮지 않습니다. 함부로 decode하면 잘못 인코딩된 것뿐 아니라 보안상 문제가 될 수 있는 것까지 모두 디코딩되어 버립니다.

     

    위젯 스킨에서 처음부터 htmlspecialchars($제목변수, ENT_COMPAT, 'UTF-8', false); 이렇게 제대로 처리한다면 별도로 decode를 해줄 필요가 없습니다. 꼭 decode를 해야겠다면 decode한 후에 이 코드를 다시 한 번 적용해 주세요. 마지막에 false가 제일 중요합니다.

  • profile ?
    믿고 듣는 기진곰 님의 말씀대로 바로 수정하겠습니다.
  • profile ?
    그런데 답변처럼 위젯을 수정하니까 제목 볼드나 span 색상 태그가 노출이 되는데 이건 위젯이 뭔가 잘못 코드가 짜여져 있어서 그런 걸까요?
  • profile ?
    자문 자답입니다. 이런 코드가 있어서
    if(count($attrs)) $title = sprintf("<span style=\"%s\">%s</span>", implode(';', $attrs), htmlspecialchars($title));

    if(count($attrs)) $title = sprintf(htmlspecialchars($title));
    이렇게 수정하니까 정상 작동하네용
  • profile ?

    @기진곰
    추가 질문입니다. 제가 사용하는 최근글 위젯 대다수가 아래와 같은 클래스 코드이던데
    이러면 기진곰님이 말씀하신 대로 수정할 필요 없이 그냥 위젯을 사용하면 될까요?

    비교적 최근 자료인데도 이런 걸 봐서는 비슷한 보안이 되어 있나 싶어서

    여쭈어 봅니다.

    function getTitle($cut_size = 0, $tail='...')
    {
    $title = strip_tags($this->get('title'));

    if($cut_size) $title = cut_str($title, $cut_size, $tail);

    $attrs = array();
    if($this->get('title_bold') == 'Y') $attrs[] = 'font-weight:bold';
    if($this->get('title_color') && $this->get('title_color') != 'N') $attrs[] = 'color:#'.$this->get('title_color');

    if(count($attrs)) $title = sprintf("<span style=\"%s\">%s</span>", implode(';', $attrs), htmlspecialchars($title));

    return $title;
    }

     

    아니면 위젯 클래스 php 파일에서

    if($this->get('title_bold') == 'Y') $attrs[] = 'font-weight:bold';
    if($this->get('title_color') && $this->get('title_color') != 'N') $attrs[] = 'color:#'.$this->get('title_color');

    if(count($attrs)) $title = sprintf("<span style=\"%s\">%s</span>", implode(';', $attrs), htmlspecialchars($title));


    이 부분을 아예 지워버리고 기진곰님이 말씀하신 코드로 변경하는 건 어떨까요?

    위 소스 때문에 위젯 스킨 적용시 기진곰님 소스를 쓰면 글자 볼드나 색상이 들어가면 태그가 그대로 노출되네요 ㅠ

  • ? profile

    현존하는 최근글 위젯 대다수가 엉터리입니다. 예전에 엉터리로 만든 XE 기본 content 위젯을 베꼈거든요. XE 기본 위젯은 패치가 되었는데 서드파티 위젯들은 옛날 상태 그대로입니다.

    이유를 불문하고 htmlspecialchars를 사용할 때 제가 위에서 언급한 4개의 옵션(처리할 변수, ENT_ 옵션, UTF-8 문자셋, 마지막 false)을 모두 넣지 않았다면 잘못 작성된 코드입니다.

    제목 색깔이나 진하게 표현을 할 필요가 없다면 함수 윗부분 cut_str 바로 아래에서

        return htmlspecialchars($this->get('title'), ENT_QUOTES, 'UTF-8', false);

    해버리면 됩니다.

  • profile ?

    덕분에 잘 고쳤습니다!