네이버 신디케이션 > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

네이버 신디케이션 정보

네이버 신디케이션

본문

네이버 검색엔진과의 연동입니다. 

신디케이션이 무엇인지는 아래글 참조하시면 될것 같고요. 
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=25954



네이버에서 제공하는 그누보드 샘플을 쓰면 되는데 
버그가 좀 있습니다. 
제보 했는데 반영에 시간이 좀 걸리는 것 같아서 여기 올려봅니다. 



1. escaping 
FILE : /include/gnuboard4_euckr/include.bbs.delete.php  

$sql = "select wr_subject from $write_table where wr_id='" .$row['wr_id'] ."'";
$subject_row = sql_fetch($sql);

$_link = './bbs/board.php?bo_table=%s&wr_id=%s';
$_sql = "insert into g4_syndi_delete_content_log(content_id, bbs_id, title, link_alternative, delete_date) values('%s','%s','%s','%s','%s')";
sql_query(sprintf($_sql, $row['wr_id'], $bo_table, $subject_row['wr_subject'], sprintf($_link, $bo_table, $row['wr_id']), date('YmdHis')));


이런 코드가 있는데 
$subject_row['wr_subject'] 에  ' 가 포함된 문자열인 경우 
escaping이 되지 않아 오류가 발생합니다. 


2. 쿼리 실행 
FILE : site.func.php 

348 라인에보면 아래 함수가 있습니다. 

function _Syndi_getArticleNextPage($args)
{
global $g4;

$sql = "select count(*) as cnt from " . $g4['board_table'] . " b, ". $g4['group_table'] . " g where b.bo_table='" . mysql_real_escape_string($args->target_channel_id). "' and b.bo_read_level=1 and b.bo_list_level=1 and g.gr_use_access=0 and g.gr_id = b.gr_id";
if($row['cnt']==0) return false;

$sql 을 만들고  값을 받아오지 않은 변수 $row 의 cnt를 체크해서 검사하고 있습니다. 

cnt는 항상 null 이 되므로 
이로인해 다음페이지가 있어도 받아오지 못하는 값이 됩니다. 

$row = sql_fetch_array(sql_query($sql)); 

덧붙여주면 될것 같습니다. 



3. wr_datetime 자료형 비교 문제 
FILE : site.func.php 에 보면 

function _Syndi_getArticleList($args) 라는 함수와 
function _Syndi_getArticleNextPage($args) 라는 함수에서 

시간 자료형을 비교하는 부분이 있습니다.

if($args->start_time) $where .= ' and wr_datetime >= '. _getTime($args->start_time);
if($args->end_time) $where .= ' and wr_datetime <= '. _getTime($args->end_time);

_getTime의 결과는 unixtime 값이고 
wr_datetime은 datetime 형이라서 
비교 연산이 항상 false가 나옵니다. 

이로인해 tag에 start_time이나 end_time을 설정하면 
결과가 제대로 나오지 않는것을 발견하였습니다. 



그리고 이외에도 신디케이션 구조만 알면
SQL injection 공격해볼 수 있을만한 사소한 보안 취약점이 조금 보이네요. 
접근 폴더명을 달리 하셔서 
주의하시길 바랍니다. 


추천
13

댓글 22개

아. 신디케이션 효과는 확실히 있는 편입니다.
사이트 트래픽이 적지 않아서, 검색엔진들이 놓치는 글이 많았는데요.
Google analytics 기준으로 네이버 검색 유입이
방문자수 기준  70% 이상 증가했고. 2주일 정도 계속 증가하는 경향입니다.
실제로 눈에 보이는 검색 결과도 많이 좋아졌습니다.
일단 올려주신 팁으로 UTF-8 변환하여 일부 config등 수정하고 해봤는데
아직은 no_exist_site 가 나와 일단 체크는 좀 나중에 해야겠습니다.

올려주신 팁중에서
1. $subject_row['wr_subject'] => mysql_real_escape_string($subject_row['wr_subject'])

2.$row = sql_fetch_array(sql_query($sql)); 추가

 3. _getTime($args->start_time)
 _getTime($args->end_time)

==>
date("Y-m-d H:i:s", _getTime($args->start_time))
date("Y-m-d H:i:s", _getTime($args->end_time))

로 바꾸었습니다;; 제대로 한건가요;;;;
일단 시도 하여 에러없이 연결 체크가 정상적으로 이루어 집니다만,

http://도메인/syndi/syndi_echo.php

를 실행하면 아무것도 보이지가 않습니다;; 데이터가 제대로 올라가고 있는걸까요;; ㅠ.ㅠ

핑은 제대로 보내고 있는 듯 한데, 어떻게 체크할만한 방법이 어렵습니다;;
아아!!

http://도메인/syndi설치경로/syndi_echo.php?id=tag:사이트주소,2011:site&type=channel

이라고 하면 확인 되는군요! 감사합니다
Syndication API 명세 페이지 (2페이지) 에 있는
4. Syndication Ping & Document 예제
항목을 모두 확인해보시면 됩니다.

4.1. 사이트 정보
4.1.1. 사이트 정보 출력
사이트가 Syndication 서버에 등록 또는 수정시 ping을 요청하고 사이트 정보를 출력합니다.
http://[도메인]/[syndi경로]/syndi_echo.php?id=tag:[사이트주소],2011:site&type=site
 
 
4.2. 채널 정보
4.2.1. 특정 채널 정보
특정 채널의 수정 또는 등록의 경우 ping을 요청하고 정보를 출력합니다.
http://[도메인]/[syndi경로]/syndi_echo.php?id=tag:[사이트주소],2011:channel:[채널명]&type=channel
 
 
 
 
4.2.2. 채널 목록
채널이 추가되거나 삭제되었을 시 ping을 요청하고 채널 목록을 출력합니다.
http://[도메인]/[syndi경로]/syndi_echo.php?id=tag:[사이트주소],2011:site&type=channel
 
 
 
 
4.3. 문서 정보
4.3.1. 사이트의 모든 문서 목록
Syndication 서버와 전체 동기화를 위해 전체 문서 목록을 출력합니다. 이때 비밀글 또는 비로그인 회원이 문서에 접근할 권한이 없는 경우 목록에서 제외시켜야 합니다.
http://[도메인]/[syndi경로]/syndi_echo.php?id=tag:[사이트주소],2011:site&type=article
 
 
 
여기서 URL이 [사이트주소] 의 clean URL 형식을 따릅니다.
 
 
 
4.3.2. 특정 채널의 문서 목록
글이 등록된 경우 ping을 요청하고 목록을 출력합니다.
http://[도메인]/[syndi경로]/syndi_echo.php?id=tag:[사이트주소],2011:channel:[채널명]&type=article
 
네이버 웹 페이지에서는 4.3.1과 4.3.2가 동일한 URL로 설명되어 있어서
API 명세에 따라  tag를 id=tag:[사이트주소],2011:site 에서 id=tag:[사이트주소],2011:channel:[채널명] 로 수정해서 확인하였습니다.
 
 
4.3.3. 특정 문서 정보
특정 문서에 대해 동기화가 필요한 경우 출력합니다.
http://[도메인]/[syndi경로]/syndi_echo.php?id=tag:[사이트주소],2011:article:[채널명]-[article_id]&type=article
http://syndication.openapi.naver.com/status/?site=[사이트주소]
로 네이버에 적용된 상태를 볼 수 있습니다.

<syndication_status>
<error>0</error>
<message>success</message>
<site_url>[사이트주소]</site_url>
<site_name>[사이트이름]</site_name>
<first_update>2011-09-15 15:10:28</first_update>
<last_update>2011-10-20 17:48:28</last_update>
<next_update>2011-11-04 14:48:58</next_update>
<status>working</status>
<visit_ok_count>96</visit_ok_count>
<visit_fail_count>0</visit_fail_count>
<sync>
<article date="2011-11-03">[동기화된문서수]</article>
<article date="2011-11-04">[동기화된문서수]</article>
</sync>
<timezone>GMT+09:00</timezone>
</syndication_status>
이런식으로 나옵니다.
10일이 넘었지만.. 웹문서 수집도 전혀 안되고 있고..
전혀 효과가 없습니다.;;
다른 테스트 결과는 모두 정상입니다만..
신디케이션 한다고 전부 수집해 가는것도 아닌듯..
모르겠습니다;
실제로 반영되는 검색결과에는 일정부분밖에 포함이 안되는것 같군요.. 사이트 검수도 끝난 상태 입니다만 크게 효용은 없습니다.

제가 볼때는 웹문서검색때, 그냥 검색되게 하는게 아니라 엄청난 차별을 합니다. 네이버.
큰커뮤니티 먼저 검색되고, XE먼저 챙겨주는부분도 있는듯. 또 신디케이션을 아무리 해도
하루이상 걸리는 경우가 허다하고 심하면 2주일 이상 걸리기도 하네요
http://syndication.openapi.naver.com/status/?site=[사이트주소]
로 네이버에 확인해 보면.  working 고 나오는데...sync 도 않나오고
visit count 도 항상 0 인데..이것도 에러인가요 ?

문서 어디를 수정해야 될까요 ?
<syndication_status>
<error>0</error>
<message>success</message>
<site_url>[사이트주소]</site_url>
<site_name>[사이트이름]</site_name>
<first_update>2011-09-15 15:10:28</first_update>
<last_update>2011-10-20 17:48:28</last_update>
<next_update>2011-11-04 14:48:58</next_update>
<status>working</status>
<visit_ok_count>96</visit_ok_count> < ====  0 으로 계속나오면 에러인가요 ??
<visit_fail_count>0</visit_fail_count> 

<sync>  <============================================= sync 이하는 하나도 않나오는데 이것도 에러인가요

<article date="2011-11-03">[동기화된문서수]</article> <== 이게 하나도 않나옵니다.. 에러인가요
<article date="2011-11-04">[동기화된문서수]</article>  <== 이게 하나도 않나옵니다...에러인가요
</sync>
<timezone>GMT+09:00</timezone>
</syndication_status>
이런식으로 나옵니다.
위 소스 대로 라면, http://[도메인]/[syndi경로]/syndi_echo.php?id=tag:[사이트주소],2011:site&type=article  에서 글이 나올수가 없는것 같습니다..
소스를 보다 보니까.. 채널값이 없을떄 오류가 있는거 같아요
제대로 동작이 안됩니다.
전체 3,313 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT