• 목록
  • 아래로
  • 위로

안녕하세요?

 

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

 

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

 

친구가 자신의 사무실 홈페이지의 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 380
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4063
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4464
922 히어로 무비 추천 부탁드립니다! 30 이니스프리 19.10.29.13:48 307
921 흠.. 여기가 빠른 답변이 가능할까요? 3 워시 19.02.26.15:21 220
920 후이즈 도메인 3년 연장 하자마자 이상한일이... 3 참비 18.10.21.01:09 235
919 회원만 댓글창이 보이고 작성가능한 게시판의 코드를 비회원도 볼수있게 수정하고싶습니다 2 손가락개 20.09.21.01:59 211
918 회원가입 이 외안되는거애요? 5 핫슈 16.10.14.19:01 262
917 확장자 HTML 파일에서 PHP 사용하기? 4 GsusWeb 20.06.29.18:09 205
916 홈페이지 디자인을 바꾼 후부터 게시판 스킨 적용이 이상하게 됩니다 image 손가락개 20.12.04.02:56 66
915 홈페에지가 구글에서 검색되도록 봇이 수집하게 설정했는데 API도 수집하도록 설정해도 되나요? 4 손가락개 21.12.06.03:45 278
914 홈서버용 CPU 좀 봐주시면 감사하겠습니다~ ㅠㅠ 7 image 이니스프리 20.02.24.22:40 218
913 홈... 이런게 가능할까요? 21 모니터 17.10.10.18:37 401
912 홈 서버 운영과 관련하여 사소한 질문 몇 가지가 있습니다. 8 image 제르엘 21.11.22.01:54 340
911 혹시.. 3 막시모 18.02.27.15:13 177
910 혹시 호스트 차원에서 IP차단도 지원이 되나요? 2 Nodeulnaru 17.02.27.23:29 355
909 혹시 파이어베이스 사용하고 계시는 분 있으실까요? 공부에 도움될 만한 개발자 문서가 따로 있을까요? 3 제목학원장 22.01.07.13:57 244
908 혹시 크롬 '개발자 도구' 잘 사용하시는 분이 있을까요? 질문이 있어서요. 16 image JAVA 17.11.10.17:31 745
907 혹시 지금 호스팅 신청이 안되는건가요? 2 Doge아시.. 17.07.23.00:07 222
906 혹시 이런건 호스팅 규칙에서 어긋납니까? 2 출사로 22.12.23.07:38 336
905 혹시 이거 툴 프로그램 뭔지 아시는분 계신가요? 6 image JAVA 17.11.13.14:30 341
904 혹시 워드프레스 메인페이지 위젯 출력 어캐하나요? 4 핫슈 17.09.05.04:12 337
903 혹시 반디캠으로 찍은 영상 도 올릴수잇습니까? 3 핫슈 18.04.09.17:37 213