몇일간 모듈 공부를 했는데, 시간이 안 되어서..

일단 이번에는 하던데로, 외부페이지로 개발해야겠습니다.

 

다음 그림과 같이 간단한 폼을 만들었습니다.

0020.jpg

 

이 폼의 소스(외부페이지)는 다음과 같습니다.

<?php

    $strVal1 = htmlentities(Context::get('txtVal1'), ENT_QUOTES, 'UTF-8');

    $strVal2 = htmlentities(Context::get('txtVal2'), ENT_QUOTES, 'UTF-8');
    $strVal3 = htmlentities(Context::get('txtVal3'), ENT_QUOTES, 'UTF-8');
    $strVal4 = htmlentities(Context::get('txtVal4'), ENT_QUOTES, 'UTF-8');

?>

<div>
    <form name="frm1" action="<?php echo htmlspecialchars("/mypage");?>" method="post">
        <fieldset>
            <legend>그룹1</legend>
            <label for="txtVal1">값1</label><input id="txtVal1" name="txtVal1" type="text" title="값1" value="<?=$strVal1?>">
            <label for="txtVal2">값2</label><input id="txtVal2" name="txtVal2" type="text" title="값2" value="<?=$strVal2?>">
        </fieldset>
        <fieldset>
            <legend>그룹2</legend>
            <label for="txtVal3">값3</label><input name="txtVal3" type="text" title="값3" value="<?=$strVal3?>">
            <label for="txtVal4">값4</label><input name="txtVal4" type="text" title="값4" value="<?=$strVal4?>">
            <input type="submit" value="확인">
        </fieldset>


    </form>

</div>

 

값을 입력하고 '확인' 버튼을 클릭하면 다음과 같은 오류메시지가 표시됩니다.

 

0010.jpg

 

page.view.php 파일의 176행 근처는 다음과 같은 내용이 있습니다.

        // Kick out anyone who tries to exploit RVE-2022-2.
        foreach (Context::getRequestVars() as $key => $val)
        {
            if (preg_match('/[\{\}\(\)<>\$\'"]/', $key) || preg_match('/[\{\}\(\)<>\$\'"]/', $val))
            {
                throw new Rhymix\Framework\Exceptions\SecurityViolation();
            }
        }

 

입력란에 몇 몇 특수문자가 들어가면 오류가 발생되도록 처리한 것 같은데..

 

이 문제는 어떻게 해결하면 되겠습니까?

(입력값을 뭔가 라이믹스 함수를 이용해서 둘러싸주면 될 것 같은데 말이죠..)

  • ?

    $strVal1 = htmlentities(Context::get('txtVal1'), ENT_QUOTES, 'UTF-8');

    $strVal1 = addslashes($strVal1);

  • profile

    1. 외부페이지에서는 심각한 보안취약점이 발생할 우려가 있어 일부 특수문자 사용이 막혀 있습니다.

     

    2. 모듈은 이런 제한이 없습니다만, 모듈로 만드시기 곤란하다면 외부페이지를 쓰지 말고 그냥 php 파일을 만들어서 거기로 POST하세요. 외부페이지로 불러오지 않은 일반 php 파일이라도 autoload.php를 인클루드하고 Context::init() 만 해주면 라이믹스 함수와 모듈들을 자유롭게 호출할 수 있습니다.

     

    3. 꼭 외부페이지를 사용하셔야 한다면 특수문자가 들어갈 만한 필드는 모두 별도의 방법으로 인코딩하여 필터에 걸리지 않도록 처리하셔야 합니다. 즉, 폼을 submit하기 전에 js로 내용을 변환하고, 받는 쪽에서 거꾸로 복원하는 과정이 필요합니다. htmlentities()는 중괄호 등 일반적인 특수문자를 변환해 주지 않으므로, urlencode()에 준하는 상당히 과격한 인코딩이 필요할 것으로 보입니다.

     

    (이 문제가 아니더라도 htmlentities() 함수를 보안 목적으로 사용해서는 안됩니다. 위 댓글에 언급된 addslashes()도 마찬가지로 폐급 함수입니다. 2023년 현재 이런 함수를 쓰는 예제는 99%의 확률로 쓰레기라고 봐도 무방합니다.)

  • profile ?
    htmlentities 사용하셨기에 그에 대한 답변을 드린거였는데 공부하는 취지로 보안 보다는 원리를 알고자 하시는듯하여 보안 부분에 대한 제 생각이 짧았던 부분 죄송합니다.
  • ? profile

    addslashes 관련해서 제가 표현이 좀 심했네요. 죄송합니다. 보안 함수와 관련된 카고컬트가 워낙 많은데다 PHP는 20여년 전부터 내려온 이상한 예제들도 많아서, 그 부분에 피로감을 느끼고 있는 것 같습니다... ㅠ