Q&A

외부페이지에서 MySQL 쿼리시 잘못 계산되는 문제

2023.06.14 04:49
1,532
0
CMS/프레임워크 Rhymix 2.0
개발 언어 PHP 7.4

아주 골치아픈 문제에 부딪쳤습니다.

다음과 같은 쿼리를, HeidiSQL에서 실행하면 정상적으로 '1'이 나옵니다.

SELECT COUNT(*) record_count FROM tTest WHERE (1 = 1)  AND (LOWER(Remarks) LIKE '%<script>%')

(tTest 테이블에 Remarks 필드는 대부분 비어 있지만, '<script>' 라는 텍스트가 포함된 레코드는 1개 있습니다.)

 

그런데 동일한 쿼리를, PHP에서 실행하면 '0'이 나옵니다.

하도 이상해서, 이 때의 query 호출 결과 변수를 var_dump 해 보면 다음과 같이 나옵니다.

object(mysqli_result)#227 (5) {
    ["current_field"]=> int(0)
    ["field_count"]=> int(1)
    ["lengths"]=> array(1) {
        [0]=> int(1)
    }
    ["num_rows"]=> int(1)
    ["type"]=> int(0)
}

 

 

제가 만들고 있는 페이지는 라이믹스의 '외부 페이지' 기능을 이용해서 만든 페이지입니다.

여기에서만 '0'이 나오고..

혹시나 해서, 라이믹스 '외부 페이지' 기능을 사용하지 않고 생 PHP에서 실행해 보면 '1'이 잘 나옵니다.

 

다음과 같이 쿼리하면, 외부 페이지든 일반 php 페이지든 잘 나옵니다.

SELECT COUNT(*) record_count FROM tTest WHERE (1 = 1)  AND (LOWER(Remarks) LIKE '%script%')

 

'<' 혹은 '>'이 들어간 쿼리를, 외부 페이지에서 돌리면 문제가 발생하는 것입니다.

 

'외부 페이지'에서 뭘 자동으로 처리해 주는 것이 있는 것 같은데..

 

뭐가 문제일까요?

정밀 미치고 팔짝뛸 노릇입니다. ^^

 

MySQL connection시의 charset은 'utf8mb4' 입니다.

tTest 테이블과 Remarks 열의 collation은 'utf8mb4_unicode_ci' 입니다.

댓글 2

  • 2023.06.14 05:13 #1768632

    외부페이지에서 구체적으로 어떤 문법을 사용해서 쿼리를 실행하고 계신가요?

     

    템플릿 문법과 섞어서 사용하신다면 <script>처럼 태그로 보이는 내용이 잘못 해석될 가능성이 있습니다. 아무래도 보안상 민감한 태그이기도 하니까요. 만약 템플릿 문법이 필요하지 않다면 해당 페이지에서 템플릿 문법을 해석하지 않도록 설정해 보세요. 아니면 태그로 해석되지 않도록 <, script, >를 각각 구분된 문자열로 넣어서 합쳐 보세요.

     

    라이믹스 2.0에서는 mysqli를 사용하지 않는데, mysqli_result가 나오는 것만 봐도, DB 접속부터 시작해서 상당량의 커스텀 코드가 있는 것으로 보입니다. 어떤 코드를 사용했는지 보여주지 않고 원인을 찾아달라고 하시면 초능력이 없는 일반인은 대답하기가 곤란합니다. 라이믹스 디버그 기능이 먹히지 않으니까 쿼리 결과만 볼 수 있을 뿐, 실제로 어떤 SQL문이 DB에 전달되었는지 알 수도 없고요. 라이믹스 환경에서 작업을 하신다면 라이믹스에서 공식 지원하는 커스텀 쿼리를 사용하여 SQL문을 작성하셔야 디버깅하기 편리합니다. (예전 XE에서 사용을 강제하던 XML 쿼리와는 무관합니다.)

  • 2023.06.14 06:17 #1768637
    우선, 죄송합니다.
    불특정 다수가 사용하는 사이트가 아니라, 사이트 공개도 어렵고 그런 상황이네요.

    일단 외부페이지에서는 mysqli를 이용해서 쿼리를 실행합니다.
    다음과 같이요.

    $sql_stmt = "SELECT COUNT(*) record_count FROM tTest WHERE (1 = 1) AND (LOWER(Remarks) LIKE '%<script>%')";
    $query1 = mysqli_query($connection, $sql_stmt);
    if(!$query1) {
    $err_msg = "목록의 개수를 계산할 수 없습니다.\n" . xfnErrFormat(mysqli_errno($connection), mysqli_error($connection));
    echo($err_msg);
    return;
    }
    $row = mysqli_fetch_array($query1);
    var_dump($row['record_count']);

    라이믹스 외부 페이지 설정인, '외부 문서 후처리'는 'PHP 코드 실행'에만 체크되어 있습니다.
    '템플릿 해석'은 체크되어 있지 않습니다.
    템플릿 코드 역시 전혀 사용하고 있지 않습니다.

    그냥 PHP를 사용하고 싶은데, 로그인과 메뉴 그리고 게시판 등등의 기능이 필요해서 라이믹스를 사용한 것 입니다.

    원래는 라이믹스 모듈로 개발하려 했었는데, 시간이 너무 없어서.. 외부페이지로 선회했던 것입니다.
    역시 막히는 부분이 많네요.