반응형

ref

배경

  • phpMyFAQ - Open Source FAQ web application for PHP 7+ and MySQL, PostgreSQL and other databases
  • phpMyFAQ 는 사용자를 대상으로 하는 FAQ 어플리케이션이다.
  • sprintf 로 화면에 표시할때 태그를 포함한 데이터를 입력 가능하다.

분석

//phpmyfaq/ajaxservice.php
->setType($type)
->setUsername($username)
->setEmail($mailer)
**->setComment(nl2br($comment))**
->setDate($_SERVER['REQUEST_TIME']);
  • 화면에 표시되는 코드는 다음과 같다.
//phpmyfaq/src/phpMyFAQ/Comments.php
						$output .= sprintf(
                '<strong><a href="mailto:%s">%s</a></strong>',
                $mail->safeEmail($item->getEmail()),
                $item->getUsername()
            );
            $output .= sprintf(' <span class="text-muted">(%s)</span>', $date->format($item->getDate()));
            $output .= '     </div>';위의ㅇㅇㅇㅇ
  • 위의 코드는 strip_tags를 이용하여 태그를 제거하는 방식으로 수정되었다.
//phpmyfaq/ajaxservice.php
->setType($type)
->setUsername($username)
->setEmail($mailer)
**->setComment(nl2br(strip_tags($comment)))**
->setDate($_SERVER['REQUEST_TIME']);

  • Strings::htmlentities 는 적용가능한 모든 html을 entity로 변환한다.
						$output .= sprintf(
                '<strong><a href="mailto:%s">%s</a></strong>',
                $mail->safeEmail($item->getEmail()),
                Strings::htmlentities($item->getUsername())
            );
            $output .= sprintf(' <span class="text-muted">(%s)</span>', $date->format($item->getDate()));
            $output .= '     </div>';

<?php
$str = "A 'quote' is <b>bold</b>";

// 출력: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// 출력: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>
  • sprintf를 사용하여 데이터를 저장 후 변수로 전달한다면 그 전에 화면에 표현이 되는 데이터에 대해 어떤 데이터를 허용할지 검토를 해야한다.

테스트

  • 테스트 환경 phpMyFAQ 3.1.11 설치하고 초기 설정을 완료 한다.
  • FaQ입력 창에 html 태그를 입력한다.

  • html이 적용되어 화면에 보인다.

패치 방법

  • 패치 제공 phpMyFAQ ≥ 3.1.12 이상을 설치한다.
반응형

+ Recent posts