- 10
- 이니스프리
- 조회 수 2016
안녕하세요?
제가 장래에 홈페이지를 만들게 되면
홈페이지 홍보가 되기 전에 어느 정도 게시글이 있어야 될 것 같기도 하고,
친구가 자신의 사무실 홈페이지의 Q&A 게시판에 글이 많이 있었으면 좋겠다고 해서요.
그런데 나중에 알고 보니 XE로 제작된 홈페이지더군요 ㅠㅠ
저번에 게시판에 올렸던 허접한 오토핫키 자동 댓글 쓰기 매크로는
네모 님 말씀대로 너무 우회적인 것 같아서요 ㅜㅜ
이번에는 다음의 두 글을 참조하여 자동으로 그누보드 게시판에 글을 작성하는 php 파일을 작성했는데요.
우선 두 분께 진심으로 감사드립니다 ^^
그누커뮨 말러83님의 글
http://gnucomun.net/bbs/board.php?bo_table=study&wr_id=52
sir 명랑폐인 님의 팁
그래서 다음과 같은 두 가지 방식으로 시도해봤는데요.
<?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나 라이믹스를 사용하시는 점을 잘 알지만
스포어만큼 친절하신 고수 회원님들이 많이 계신 곳도 없는 것 같아서
부득이 여기에 다시 질문 드립니다 ㅠㅠ
그럼 날씨가 추운데 감기 조심하시고 편안한 저녁 되세요.
답변 달아주실 스포어 회원님께 미리 감사드립니다 ^-^
작성자
댓글 10
허걱 제가 어제 작성한 댓글이 네모 님의 답변에 대댓글로 달리지 않았네요 ㅠㅠ
제가 어제 오늘 계속 정신없이 바빠서 방금 집에 들어와서
네모 님께서 말씀하신대로 수정을 해보았습니다.
두번째 코드는 영문으로 된 닉네임에서는 잘 작동하고
한글 닉네임의 경우에는 공백으로 나오는 것을 보니
네모 님 말씀대로 인코딩의 문제로 생각됩니다 ^^
첫번째 코드도 네모 님께서 추가하라고 말씀하신 부분을 추가했더니
한글과 영문 닉네임 모두 잘 작동하네요 :)
그럼 날씨가 추운데 네모 님께서도 감기 조심하시구요
안녕히 주무세요 ^-^
다시 한 번 진심으로 네모 님께 감사드립니다!!
역시 네모 님이 최고네요~ 정말 감사합니다! ^-^
새해에 복받으실거에요~
제가 스포어에 여쭤보길 잘 했네요 :)
이것 때문에 요며칠 삽질했는데
생각해보니 어드민과 회원 계정 모두 한글 닉네임이네요! ㅠㅠ
네모 님 말씀대로 원인은 한글 닉네임의 인코딩 때문인 것 같군요.
하필 제가 지금 급히 나갈 일이 생겨서
내일 다시 영어로 된 닉네임 계정을 생성해서 다시 해보고 말씀드릴게요~
그럼 네모 님께서도 감기 조심하시고 안녕히 주무세요!
다시 한 번 진심으로 감사드립니다 ^-^
해결이 되셨는지는 모르겠지만... 참고로 저 코드는 SQL Injection에 취약합니다.... 문자열에 해당하는 변수(제목, 내용 등)은 모두 addslashes 함수를 적용한 다음 sql변수에 대입하는 것을 추천합니다.
앗 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);
?>
관리자만 사용할 스크립트인데, 굳이 SQL 인젝션을 신경쓸 필요는 없다고 봅니다.
물론, 해당 스크립트의 접근 권한을 설정할 필요는 있습니다. 데이터가 저장된 파일의 수정도 방지해야겠죠.
앗 그렇군요 ^^ 감사합니다!
제가 PHP에 대해서 낫놓고 기억자도 모르는 수준인데
이렇게 가르쳐주셔서 감사합니다!
일단 PHP 파일명과 TXT 파일명을 복잡하게 바꿔놔서
다른 사람이 접근할 수 없도록 하려구요.
그리고 파일과 디렉토리의 퍼미션도 제가 좀 더 공부를 해서 적절히 변경을 해야겠네요.
그럼 네모 님께서도 점심식사 맛있게 드세요 :)
다시 한 번 진심으로 감사드립니다!
컨텐츠 내용에 작은따옴표(')가 들어가는 경우가 있을 수 있기 때문에 addslashes 함수는 어쨌든 사용을 하셔야 할 것 같네요..
만약 작은 따옴표가 들어간다면 SQL 쿼리가 제대로 동작하지 않으니까요...
옙 감사합니다 ^-^
humit 님 말씀대로 addslashes 함수를 사용하는 방향으로 할게요~
요즘 날씨가 추운데 humit 님께서도 감기 조심하시고 군 생활이 힘드시겠지만 화이팅이요!
항상 감사드립니다 :)
네 감사합니다 :)
음... 두번째 코드는 제대로 작동하는데요..?
문제가 된다면 닉네임이 한글로 지정되어 있어서 인코딩 문제가 일어날 수는 있겠네요.
첫번째 코드는
board_write 함수 안에 $mb를 정의하는 부분이 빠져있네요.
global $g5; 밑에다가 $mb = get_member($mb_id); 를 추가해 보세요.