도와주세요

그누보드 게시글 자동 작성 php 파일 관련해서 질문 드려요 ^^

이니스프리2017.12.12 18:57조회 수 458댓글 10

    • 글자 크기

안녕하세요?

 

제가 장래에 홈페이지를 만들게 되면

 

홈페이지 홍보가 되기 전에 어느 정도 게시글이 있어야 될 것 같기도 하고,

 

친구가 자신의 사무실 홈페이지의 Q&A 게시판에 글이 많이 있었으면 좋겠다고 해서요.

 

그런데 나중에 알고 보니 XE로 제작된 홈페이지더군요 ㅠㅠ

 

 

저번에 게시판에 올렸던 허접한 오토핫키 자동 댓글 쓰기 매크로는 

 

네모 님 말씀대로 너무 우회적인 것 같아서요 ㅜㅜ

 

이번에는 다음의 두 글을 참조하여 자동으로 그누보드 게시판에 글을 작성하는 php 파일을 작성했는데요. 

 

우선 두 분께 진심으로 감사드립니다 ^^

 

그누커뮨 말러83님의 글

http://gnucomun.net/bbs/board.php?bo_table=study&wr_id=52

 

sir 명랑폐인 님의 팁

https://sir.kr/g5_tip/6762

 

 

그래서 다음과 같은 두 가지 방식으로 시도해봤는데요.

 

<?php
define('_INDEX_', true);
include_once('./_common.php');
function board_write($bo_table, $subject, $content, $mb_id) 
{
    global $g5;
    $write_table = "g5_write_{$bo_table}";
    $wr_num = get_next_num($write_table);
    $wr_reply = '';
    $ca_name = "";
    $html = ""; $secret=""; $mail = "";
    $wr_subject = $subject;
    $wr_content = $content;
    $wr_link1 = "";
    $wr_link2 = "";
    $wr_email = "";
    $wr_name = $bo[bo_use_name] ? $mb[mb_name] : $mb[mb_nick];
    $sql = " insert into $write_table
                     set wr_num = '$wr_num',
                     wr_reply = '$wr_reply',
                     wr_comment = 0,
                     ca_name = '$ca_name',
                     wr_option = '$html,$secret,$mail',
                     wr_subject = '$wr_subject',
                     wr_content = '$wr_content',
                     wr_link1 = '$wr_link1',
                     wr_link2 = '$wr_link2',
                     wr_link1_hit = 0,
                     wr_link2_hit = 0,
                     wr_hit = 0,
                     wr_good = 0,
                     wr_nogood = 0,
                     mb_id = '$mb_id',
                     wr_password = '',
                     wr_name = '$wr_name',
                     wr_email = '$wr_email',
                     wr_homepage = '',
                     wr_datetime = '".G5_TIME_YMDHIS."',
                     wr_last = '".G5_TIME_YMDHIS."',
                     wr_ip = '{$_SERVER['REMOTE_ADDR']}',
                     wr_1 = '',
                     wr_2 = '',
                     wr_3 = '',
                     wr_4 = '',
                     wr_5 = '',
                     wr_6 = '',
                     wr_7 = '',
                     wr_8 = '',
                     wr_9 = '',
                     wr_10 = '' ";
    sql_query($sql);
    $wr_id = sql_insert_id();
    sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
    sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '{$bo_table}', '{$wr_id}', '{$wr_id}', '".G5_TIME_YMDHIS."', '$mb_id' ) ");
    sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'");
    return true;
}

$bo_table = "1001"; // 게시판 테이블 입력
$filename = "subject.txt";
$fp = fopen($filename, "r");
$subject = fgets($fp, '50');
fclose($fp);
 
$filename = "content.txt";
$fp = fopen($filename, "r");
$content = fread($fp, filesize($filename));
fclose($fp);
 
$mb_id="guest1"; 
$result =  board_write($bo_table, $subject, $content, $mb_id);

?> 

 

<?php 
define('_INDEX_', true); 
include_once('./_common.php'); 

function board_write($bo_table, $subject, $content, $mb_id, $nickname) 
{ 
    global $g5; 

    $write_table = "g5_write_{$bo_table}"; 
    $wr_num = get_next_num($write_table); 
    $wr_reply = ''; 
    $ca_name = ""; 
    $html = ""; $secret=""; $mail = ""; 
    $wr_subject = $subject; 
    $wr_content = $content; 
    $wr_link1 = ""; 
    $wr_link2 = ""; 
    $wr_email = ""; 
    $wr_name = $nickname; 

    $sql = " insert into $write_table 
                    set wr_num = '$wr_num', 
                    wr_reply = '$wr_reply', 
                    wr_comment = 0, 
                    ca_name = '$ca_name', 
                    wr_option = '$html,$secret,$mail', 
                    wr_subject = '$wr_subject', 
                    wr_content = '$wr_content', 
                    wr_link1 = '$wr_link1', 
                    wr_link2 = '$wr_link2', 
                    wr_link1_hit = 0, 
                    wr_link2_hit = 0, 
                    wr_hit = 0, 
                    wr_good = 0, 
                    wr_nogood = 0, 
                    mb_id = '$mb_id', 
                    wr_password = '', 
                    wr_name = '$wr_name', 
                    wr_email = '$wr_email', 
                    wr_homepage = '', 
                    wr_datetime = '".G5_TIME_YMDHIS."', 
                    wr_last = '".G5_TIME_YMDHIS."', 
                    wr_ip = '{$_SERVER['REMOTE_ADDR']}', 
                    wr_1 = '', 
                    wr_2 = '', 
                    wr_3 = '', 
                    wr_4 = '', 
                    wr_5 = '', 
                    wr_6 = '', 
                    wr_7 = '', 
                    wr_8 = '', 
                    wr_9 = '', 
                    wr_10 = '' "; 
    sql_query($sql); 
    $wr_id = sql_insert_id(); 
    sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' "); 
    sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '{$bo_table}', '{$wr_id}', '{$wr_id}', '".G5_TIME_YMDHIS."', '$mb_id' ) "); 
    sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'"); 
    return true; 
} 


$bo_table = "1001"; // 게시판 테이블 입력 

$filename = "subject.txt"; 
$fp = fopen($filename, "r"); 
$subject = fgets($fp, '50'); 
fclose($fp); 

$filename = "content.txt"; 
$fp = fopen($filename, "r"); 
$content = fread($fp, filesize($filename)); 
fclose($fp); 

$mb_id="guest1"; 
$nickname="게스트01"; 

$result =  board_write($bo_table, $subject, $content, $mb_id, $nickname); 


?>

 

 

일단 게시글은 잘 작성이 되는데요.

 

두 스크립트 모두 문제는 목록스킨이나 게시글 자체에서 글쓴이 이름(닉네임)이 표시가 안 되더군요.

 

첫번째 스크립트는 DB에서 닉네임을 불러오려고 했고

 

두번째 스크립트는 nickname 변수값을 지정하여 이것을 wr_name에 대입한 것인데요.

 

 

위와 같이 회원 레벨은 출력이 되지만 글쓴이 이름은 공백으로 나오네요 ㅠㅠ

 

실제 존재하는 회원명을 넣어봐도 그렇고 다르게 넣어봐도 마찬가지더군요.

 

 

위와 같이 테스트 해본 호스팅은 닷홈인데요.

 

혹시 닷홈만의 문제는 아니겠지요? ㅠㅠ

 

아미나 커뮤니티에서 닷홈의 PHP 버전과 충돌이 있다는 글은 몇 번 보았는데요.

 

제가 알기로 위 스크립트는 그누보드4 시절부터 사용되었으니 아마도 문제는 없겠죠?

 

 

지난 며칠 동안 그누보드 커뮤니티 등에도 글을 남겼지만 결국 해결을 하지 못해서 

 

스포어의 회원님들께서는 그누보드보다는 주로 XE나 라이믹스를 사용하시는 점을 잘 알지만 

 

스포어만큼 친절하신 고수 회원님들이 많이 계신 곳도 없는 것 같아서 

 

부득이 여기에 다시 질문 드립니다 ㅠㅠ

 

 

그럼 날씨가 추운데 감기 조심하시고 편안한 저녁 되세요.

 

답변 달아주실 스포어 회원님께 미리 감사드립니다 ^-^

 

 

I've got a good feeling about this, and that's all I'm going to tell you.

    • 글자 크기
  • 2017.12.12 23:51

    음... 두번째 코드는 제대로 작동하는데요..?

    문제가 된다면 닉네임이 한글로 지정되어 있어서 인코딩 문제가 일어날 수는 있겠네요.

     

    첫번째 코드는

    board_write 함수 안에 $mb를 정의하는 부분이 빠져있네요.

     

    global $g5; 밑에다가 $mb = get_member($mb_id); 를 추가해 보세요.

  • @네모
    이니스프리글쓴이
    2017.12.14 00:21

    허걱 제가 어제 작성한 댓글이 네모 님의 답변에 대댓글로 달리지 않았네요 ㅠㅠ

     

    제가 어제 오늘 계속 정신없이 바빠서 방금 집에 들어와서

     

    네모 님께서 말씀하신대로 수정을 해보았습니다.

     

     

    두번째 코드는 영문으로 된 닉네임에서는 잘 작동하고

     

    한글 닉네임의 경우에는 공백으로 나오는 것을 보니

     

    네모 님 말씀대로 인코딩의 문제로 생각됩니다 ^^

     

     

    첫번째 코드도 네모 님께서 추가하라고 말씀하신 부분을 추가했더니

     

    한글과 영문 닉네임 모두 잘 작동하네요 :)

     

     

    그럼 날씨가 추운데 네모 님께서도 감기 조심하시구요

     

    안녕히 주무세요 ^-^

     

    다시 한 번 진심으로 네모 님께 감사드립니다!!

     

  • 이니스프리글쓴이
    2017.12.12 23:56

     

    이미지 153.jpg

     

    역시 네모 님이 최고네요~ 정말 감사합니다! ^-^ 

     

    새해에 복받으실거에요~

     

    제가 스포어에 여쭤보길 잘 했네요 :)

     

    이것 때문에 요며칠 삽질했는데

     

    생각해보니 어드민과 회원 계정 모두 한글 닉네임이네요! ㅠㅠ

     

    네모 님 말씀대로 원인은 한글 닉네임의 인코딩 때문인 것 같군요.

     

    하필 제가 지금 급히 나갈 일이 생겨서

     

    내일 다시 영어로 된 닉네임 계정을 생성해서 다시 해보고 말씀드릴게요~

     

    그럼 네모 님께서도 감기 조심하시고 안녕히 주무세요!

     

    다시 한 번 진심으로 감사드립니다 ^-^

     

  • 2017.12.13 19:37

    해결이 되셨는지는 모르겠지만... 참고로 저 코드는 SQL Injection에 취약합니다.... 문자열에 해당하는 변수(제목, 내용 등)은 모두 addslashes 함수를 적용한 다음 sql변수에 대입하는 것을 추천합니다.

  • @humit
    이니스프리글쓴이
    2017.12.14 01:04

    앗 humit 님께서도 군복무 하느라 바쁘신데 이렇게 답글 달아주셔서 정말 감사합니다! 

     

    일단 네모 님께서 답변해주신 방법으로 닉네임이 출력되지 않는 문제는 해결하였습니다.

     

    SQL Injection의 위험성이 있다는 점까지 미처 제가 고려를 하지 못했네요 ㅠㅠ

     

    humit 님 덕분에 많이 배워서 감사합니다!

     

     

    그렇다면 문자열에 해당하는 변수 중에서 SQL 변수에 대입되는 것은

     

    제목, 내용, 닉네임 3개이니 그 3개를 이렇게 수정하면 되는건가요?

     

    $wr_subject = addslashes(trim($subject));
    $wr_content = addslashes(trim($content));

    $wr_name = addslashes($bo[bo_use_name] ? $mb[mb_name] : $mb[mb_nick]);

     

    제가 완전 컴알못이라서 PHP에 대해 기초적인 것조차 잘 몰라서 죄송합니다 ㅠㅠ

     

     

    네모 님과 humit 님께서 말씀하신 부분을 제가 이해한대로 잠정적으로 반영한 스크립트입니다.

     

    <?php
    define('_INDEX_', true);
    include_once('./_common.php');

    function board_write($bo_table, $subject, $content, $mb_id) 
    {
        global $g5;
        $mb = get_member($mb_id); 
        $write_table = "g5_write_{$bo_table}";
        $wr_num = get_next_num($write_table);
        $wr_reply = '';
        $ca_name = "";
        $html = ""; $secret=""; $mail = "";
        $wr_subject = addslashes(trim($subject));
        $wr_content = addslashes(trim($content));
        $wr_link1 = "";
        $wr_link2 = "";
        $wr_email = "";
        $wr_name = addslashes($bo[bo_use_name] ? $mb[mb_name] : $mb[mb_nick]);
        $sql = " insert into $write_table
                         set wr_num = '$wr_num',
                         wr_reply = '$wr_reply',
                         wr_comment = 0,
                         ca_name = '$ca_name',
                         wr_option = '$html,$secret,$mail',
                         wr_subject = '$wr_subject',
                         wr_content = '$wr_content',
                         wr_link1 = '$wr_link1',
                         wr_link2 = '$wr_link2',
                         wr_link1_hit = 0,
                         wr_link2_hit = 0,
                         wr_hit = 0,
                         wr_good = 0,
                         wr_nogood = 0,
                         mb_id = '$mb_id',
                         wr_password = '',
                         wr_name = '$wr_name',
                         wr_email = '$wr_email',
                         wr_homepage = '',
                         wr_datetime = '".G5_TIME_YMDHIS."',
                         wr_last = '".G5_TIME_YMDHIS."',
                         wr_ip = '{$_SERVER['REMOTE_ADDR']}',
                         wr_1 = '',
                         wr_2 = '',
                         wr_3 = '',
                         wr_4 = '',
                         wr_5 = '',
                         wr_6 = '',
                         wr_7 = '',
                         wr_8 = '',
                         wr_9 = '',
                         wr_10 = '' ";
        sql_query($sql);
        $wr_id = sql_insert_id();
        sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
        sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '{$bo_table}', '{$wr_id}', '{$wr_id}', '".G5_TIME_YMDHIS."', '$mb_id' ) ");
        sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'");
        return true;
    }


    $bo_table = "1001"; // 게시판 테이블 입력

    $filename = "subject.txt";
    $fp = fopen($filename, "r");
    $subject = fgets($fp, '50');
    fclose($fp);

    $filename = "content.txt";
    $fp = fopen($filename, "r");
    $content = fread($fp, filesize($filename));
    fclose($fp);

    $mb_id="guest1"; 

    $result =  board_write($bo_table, $subject, $content, $mb_id);


    ?> 
     

  • @이니스프리
    2017.12.14 10:39

    관리자만 사용할 스크립트인데, 굳이 SQL 인젝션을 신경쓸 필요는 없다고 봅니다.

    물론, 해당 스크립트의 접근 권한을 설정할 필요는 있습니다. 데이터가 저장된 파일의 수정도 방지해야겠죠.

  • @네모
    이니스프리글쓴이
    2017.12.14 12:22

    앗 그렇군요 ^^ 감사합니다!

     

    제가 PHP에 대해서 낫놓고 기억자도 모르는 수준인데

     

    이렇게 가르쳐주셔서 감사합니다!

     

    일단 PHP 파일명과 TXT 파일명을 복잡하게 바꿔놔서

     

    다른 사람이 접근할 수 없도록 하려구요.

     

    그리고 파일과 디렉토리의 퍼미션도 제가 좀 더 공부를 해서 적절히 변경을 해야겠네요.

     

    그럼 네모 님께서도 점심식사 맛있게 드세요 :)

     

    다시 한 번 진심으로 감사드립니다!

     

  • @네모
    2017.12.14 13:24

    컨텐츠 내용에 작은따옴표(')가 들어가는 경우가 있을 수 있기 때문에 addslashes 함수는 어쨌든 사용을 하셔야 할 것 같네요..

    만약 작은 따옴표가 들어간다면 SQL 쿼리가 제대로 동작하지 않으니까요...

  • @humit
    이니스프리글쓴이
    2017.12.14 13:46

    옙 감사합니다 ^-^

     

    humit 님 말씀대로 addslashes 함수를 사용하는 방향으로 할게요~

     

    요즘 날씨가 추운데 humit 님께서도 감기 조심하시고 군 생활이 힘드시겠지만 화이팅이요!

     

    항상 감사드립니다 :)

     

  • @이니스프리
    2017.12.14 14:38

    네 감사합니다 :)

댓글 달기

번호 제목 글쓴이 날짜 조회 수
공지 앞으로 ssh 사용시 한글 사용이 가능합니다.7 마스터 2018.10.12 12884
공지 접속 불가 사태 수습은 진행중입니다.35 마스터 2018.10.05 13526
공지 회원 전용 페이지가 생겼습니다.10 마스터 2018.03.20 14157
공지 [필독] 질문하는 방법5 마스터 2018.02.23 533
388 Autoset에서 제작한 홈페이지를 아메트린 서버에 올릴 때 주의할 점이 있을까요?6 이니스프리 2017.09.30 270
387 RSA 암호화를 구현하려고 하는데....7 Hanam09 2018.01.24 268
386 DNS를 찾을 수 없다는데...8 허니버터뚠뚜니라이츄 2017.07.29 268
385 스마트업로더 이미지 업로드 엑박12 연우빠 2017.10.01 267
384 특정 사이트에 대해서만 DNS오류가 뜨는 경우에는 어떻게 해야 하나요?4 허니버터뚠뚜니라이츄 2017.07.23 266
383 커뮤니티를 만들 때 홈 서버로 이미지 호스팅 서버를 사용하려고 하는데 괜찮은 방법일까요?6 이니스프리 2018.03.19 265
382 그누보드 로고? 등록..5 title: 맛스타의 자물쇠에듀 2016.10.16 265
381 학교 호스팅을 신청하기 전에 질문 드립니다18 이니스프리 2017.11.01 264
380 네이버 카페 대문을 HTML로 제작해보려는데 너무 어렵네요.6 도바킨 2018.07.09 261
379 미디어위키 설치법6 맛수타 2017.05.25 259
378 저의 주소는 어떻게 되는지요.7 gobiyah 2016.10.30 258
377 웹사이트 제작13 Wisdomhands 2016.10.10 258
376 RPS에서 비정상적인 접근은 무엇을 의미하나요4 Hanam09 2017.11.11 257
375 [스터디포어스] 호스팅사용자 제한, XE 설치 | 입문 도와드립니다.3 title: 황금 서버 (30일)어코 2016.10.17 255
374 호스팅 Bandwidth와 속도에 대해서 궁금한 점이 있습니다.1 RonnieJ 2016.11.17 254
373 [도움요청] Q&A게시판을 만들고 있습니다.10 JAVA 2017.11.21 252
372 홈... 이런게 가능할까요?21 모니터 2017.10.10 250
371 호스팅 세팅 도움주실분 급하게 찾아요 ㅠ.ㅠ1 HOya 2017.01.23 250
370 미디어위키 이전 했는데요 404 에러가 계속 뜨네요..!4 마카롱 2017.06.19 249
369 타겟 질문.. 도다님께 미디어위키 관련 질문이 있는데요4 마카롱 2017.06.24 248
이전 1 2 3 4 5 6 7 8 9 10... 23다음
첨부 (0)
서버에 요청 중입니다. 잠시만 기다려 주십시오...