안녕하세요~

 

예전에도 한차례 질문드렸지만 답이 없어서 포기했었는데..

 

혹시나 해서 한번더 질문드리고 싶어요 ㅠㅠ

 

제가 질문답변 게시판을 많이 이용중입니다. 그래서 확장변수를 통해 완료,대기로 내용이 보여져요.

 

다만 이상하게 짧은주소로는 안된다는거예요... 긴주소로하면 작동이 되지만 짧은주소는 오류를 뿜네요 

 

제발 한번만 봐주셔요 ㅠ

 

<block cond="$logged_info->member_srl==$oDocument->get('member_srl')||$logged_info->is_admin=='Y'">
                    {@ $url = getenv('REQUEST_URI')}
                    <block cond="$click">
                    {@
                     $oDB = &DB::getInstance();
                     $query = $oDB->_query('update xe_document_extra_vars set value = "'.$click.'" where document_srl = '.$document_srl.' and module_srl = '.$module_info->module_srl.' and eid = "qst"');
                     $url = preg_replace("/\&click\=답변완료|\&click\=대기/", "", $url);
                    }
                    <script>location.href="{str_replace('amp;', '', getUrl('click', ''))}"</script>                    
                    </block>


                    <a onClick="location.href='{$url}&click=답변완료'">완료</a>
                    <a onClick="location.href='{$url}&click=대기'">대기</a>
                </block>

 

짧은주소에도 이용이 되게 수정좀 부탁드려요~

 

  • Lv37

    주소에 "click=답변완료" 또는 "click=대기"가 들어 있는지 확인하는 것 같은데요.

    짧은주소라면 그런 지저분한 변수은 당연히 안 붙는 거 아닌가요?

    아니면 짧은주소 뒤에 임의로 붙여서 쓰시는 건가요?

     

    짧은주소 뒤에 임의로 붙여서 쓰신다고 가정하고... 아무튼 몇 가지 문제가 있습니다.

     

    1. 주소에 한글을 넣으면 REQUEST_URI에서는 urlencode된 상태로 전달됩니다. "click=대기"라고 붙이면

    실제로 서버에서는 "click=%EB%8C%80%EA%B8%B0"로 보이지요.

    따라서 저런 정규식이 먹힐 리가 없습니다.

     

    2. 주소에 "click=대기"라고 붙이면 템플릿에서 $click이라는 변수에 이미 "대기"라는 값이 들어가 있습니다.

    따라서 REQUEST_URI를 뜯어서 정규식으로 분석하고 자시고 할 필요가 없습니다.

     

    3. 짧은주소 뒤에 "click=대기"라는 값을 임의로 붙였다면 "도메인/mid/1234?click=대기"가 됩니다.

    주소에 붙이는 첫 번째 변수는 &가 아니라 ?로 구분된다는 점을 기억하세요.

     

    4. location.href 주소를 생성하는 것도 마찬가지입니다. 상황에 따라 &와 ?를 적절히 사용하지 못하면

    이상한 주소가 나옵니다. 위에서 쓴 것처럼 getUrl 함수를 사용하여 자동으로 맞춰지도록 하세요.

     

    4. SQL 인젝션 공격하기 딱 좋아 보이네요.

  • Lv37 Lv4
    네 답변 너무 감사합니다. 사실 제가 답변의 내용을 이해하지못하는 상황이예요..

    혹시 다른 방법이라도 있을까요? 확장변수를 버턴씩으로 조건을 걸어 보여지는 내용이 다르게
    말이예요..
  • Lv4 ? Lv5
    주소줄로 직접 DB에 데이터를 입력하는것은 바람직 하지 않습니다.
    GET 방식은 view 용도로 그리고 controller는 POST 등으로 하시는것이 바람직합니다.

    그렇기 떄문에 버튼을 따로 빼셔 ajax로 데이터를 post 전송하여 구현하는 방법이 가장 현실적으로 간단해 보입니다.
  • Lv4 Lv37
    원하시는 작동 방식이 어떤 건지 알 수 없어서 더 도와드리기는 힘듭니다. 위의 내용은 눈에 보이는 코드만 보고 말씀드린 거고요...
  • ? Lv5 Lv37
    바람직하지 않은 정도를 넘어서서, 만약 저런 쿼리가 들어있는 스킨이라면 지금 당장 없애버려야 할 것 같습니다. 저 쿼리 하나만으로도 사이트를 폭파시켜 버릴 수 있습니다 ㄷㄷㄷ
  • Lv37 Lv4
    그저.. 확장변수로 답변완료 , 대기 를 만들고 특정유저가 질문을 했을시 답변완료 를 하려면 게시글 수정을 통해 확장변수를 변경해야되는 번거로움을 덜고자 본문에 답변완료 버턴을 만들어 클릭하면 수정없이 리스트,분문등에 답변완료 조건을 달고 싶었던거였어요..
  • ? Lv8
    지금 상황에서 수정하려면..
    {@ $url = getenv('REQUEST_URI')} 와
    $url = preg_replace("/\&click\=답변완료|\&click\=대기/", "", $url);
    둘다 필요 없고

    몇군데를...
    <script>location.href="{getNotEncodedUrl('click', '')}"</script>

    <a onClick="location.href='{getNotEncodedUrl('click','답변완료')}'">완료</a>
    <a onClick="location.href='{getNotEncodedUrl('click','대기')}'">대기</a>
    로 바꾸면 될듯하네요

    눈으로만 보고 한거여서 틀릴 수도 있습니다.
  • ? Lv8 Lv4
    세진님 정말 덕분에 짧은 주소를 사용할수 있게 되었습니다. 너무나도 감사드립니다.
    몇년전 xe에서 세진님에게 답변받고 정말 고마웠는데 이처럼 또다시 해결해주시니 너무 감동이네요 ㅠㅠ
    윗분들 댓글도 고맙지만.. 제가 이해를 못해서 슬펏네요..