• 목록
  • 아래로
  • 위로

안녕하세요?

 

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

 

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

 

친구가 자신의 사무실 홈페이지의 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나 라이믹스를 사용하시는 점을 잘 알지만 

 

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

 

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

 

 

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

 

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

 

 

작성자
이니스프리 119 Lv. (0%) 1876250/115200000EXP

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

CSVpuymXAAAVVpd.jpg

댓글 10

네모
profile image
+1

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

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

 

첫번째 코드는

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

 

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

comment menu
2017.12.12. 23:51

신고

"네모님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 네모
profile image

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

 

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

 

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

 

 

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

 

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

 

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

 

 

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

 

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

 

 

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

 

안녕히 주무세요 ^-^

 

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

 

comment menu
2017.12.14. 00:21

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자
profile image

 

이미지 153.jpg

 

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

 

새해에 복받으실거에요~

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

comment menu
2017.12.12. 23:56

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit
profile image

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

comment menu
2017.12.13. 19:37

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

앗 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);


?> 
 

comment menu
2017.12.14. 01:04

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

네모 → 이니스프리
profile image

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

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

comment menu
2017.12.14. 10:39

신고

"네모님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 네모
profile image

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

comment menu
2017.12.14. 12:22

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 네모
profile image

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

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

comment menu
2017.12.14. 13:24

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

옙 감사합니다 ^-^

 

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

 

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

 

항상 감사드립니다 :)

 

comment menu
2017.12.14. 13:46

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 이니스프리
profile image

네 감사합니다 :)

comment menu
2017.12.14. 14:38

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 396
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4075
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4465
262 리디렉션 형태가 여러가지가 있던데 설명좀 해주실분 계신가요? 4 참빛바다 18.01.01.20:00 351
261 만약 광고를.. 13 Hanam09 17.12.30.18:59 280
260 ssh 로 접속했는데, 왜 아무 명령어가 되지 않을까요? 14 워시 17.12.23.23:52 299
259 Tracert 명령어의 사용 방법과 관련하여 질문 드립니다 ^^ 4 이니스프리 17.12.21.14:22 616
258 질문이 있습니다! 2 준그루 17.12.17.04:36 223
257 php로도 irc 접속이 가능한가요? 2 준그루 17.12.16.18:18 228
256 다른 버튼은 바꾸어봤지만 요 + 버튼은 찾을 수 가 없네요... image 260578 17.12.14.18:30 192
255 서브도메인 적용 방법좀 알려주실수있을까요? 260578 17.12.13.16:53 198
254 실시간 오디오 스트리밍을 하고 싶습니다. 도와주세요. 6 김윤광 17.12.13.13:33 2029
253 이 "게시" 버튼이 오작동하여 떼어버리려고합니다. 2 image 260578 17.12.12.21:46 212
그누보드 게시글 자동 작성 php 파일 관련해서 질문 드려요 ^^ 10 image 이니스프리 17.12.12.18:57 1947
251 호스팅서비스를 변경하려면 어떻게 해야 하나요? 1 칸달프 17.12.11.11:42 235
250 이게... 무슨상황인거지요? 12 image 260578 17.12.10.09:31 413
249 미디어위키 각주 확장기능 도움 2 260578 17.12.08.17:44 350
248 "크롬이 응답하지 않습니다. 다시 시작하시겠습니까?" 오류 관련 질문 드려요 ^^ 8 이니스프리 17.12.05.20:05 2877
247 이미지 트래픽 절감에 관련하여 질문 드려요 7 이니스프리 17.12.05.13:42 482
246 리버티스킨 목차 버튼 삭제 3 image 260578 17.12.04.16:46 259
245 에.. 서명이 어디갔지... 1 image 260578 17.12.04.14:57 249
244 인용문, 가로줄등이 작동하지 않습니다. 5 260578 17.12.03.17:44 217
243 원래 미디어위키가 틀을 넣으면 색이 사라지나요? 7 260578 17.12.03.17:41 245