그누보드 스팸글 차단 방법

그누보드 스팸글 차단 방법

QA

그누보드 스팸글 차단 방법

본문

https://www.youtube.com/watch?v=IRWgXmIJqvM

 

 

 


 
 

C:\xampp\htdocs\hantaclub\bbs/write_update.php
#38

$wr_content = '';
if (isset($_POST['wr_content'])) {
    $wr_content = substr(trim($_POST['wr_content']),0,65536);
    $wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
    if (strpos($wr_content, 'href')) {
        alert('href 태그는 사용할 수 없습니다.');
        exit;
    }
}
if ($wr_content == '') {
    $msg[] = '<strong>내용</strong>을 입력하세요.';
}



C:\xampp\htdocs\hantaclub\bbs/write_comment_update.php
#12

// 090710
if (substr_count($wr_content, "") > 50) {
    alert('내용에 올바르지 않은 코드가 다수 포함되어 있습니다.');
    exit;
}
if (strpos($wr_content, 'href')) {
    alert('href 태그는 사용할 수 없습니다.');
    exit;
}

 
 

 

====================

 

제가 고안한 방법인데 이 방법은 어떤가요??

이 질문에 댓글 쓰기 :

답변 2

html 편집은 관리자만 가능한가요?

일반 문자열만 입력받는다고 하면, 괜찮습니다.

다만... 참고로 추가합니다.

 

1. MariaDB/MySQL TEXT 타입의 길이는 2^16보다 작아야 합니다. 즉, 65,536이 아니라 65,535여야 합니다.


$wr_content = substr(trim($_POST['wr_content']),0,65536);
// ↓
$wr_content = substr(trim($_POST['wr_content']), 0, 65535);

 

2. 질문의 코드 기준으로 "내용 마지막"의 "연속된 \" 제거는 정규식보다 문자열 함수가 훨씬 빠릅니다.


$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
↓
$wr_content = rtrim($wr_content, '\\');

* 각 라인의 마지막 \ 제거라면 얘기가 달라집니다.

 

3. 그누보드 문제인지, 질문의 substr_count($wr_content, "") 코드에서 두 번째 값이 비었는데

PHP 7.4 버전 이하까지는 Warning, 8.0 버전(아직 알파지만)부터는 Fatal error. 주의!

 

4. if (strpos($wr_content, 'href')) { 이렇게만 비교하면, 내용 처음이 href로 시작하면 그냥 통과됩니다.

내용 처음에 href가 있을 때, 시작 위치값 0을 반환하는데, 느슨한 비교라서 조건에 걸리지 않거든요.


if ( strpos($wr_content, 'href')!==false ) { // 문자열을 찾지 못하면 false인데, false가 아니면 찾았단 얘기.

 

5. write_update.php, write_comment_update.php 두 곳에 문자열 확인보다는

함수 등으로 정의해 호출하는 것이 낫겠습니다.

아울러, href 등의 단어를 많이 추가하게 되면

조건문도 그만큼 늘어나기 때문에 간단한 방법 추천합니다.


// 어떤 단어가 문제가 되는지 알려주고자 할 때
function check_word($str) {
  static $check_word = ['href', 'test', 'money']; // PHP v5.4부터 사용 가능한 배열 단축 구문
  // 혹시 PHP v5.4 미만이라면 [] 대신 array() 사용
  // $check_word = array('href', 'test', 'money');
  $result = [];
  foreach ( $check_word as $word ) {
    if ( strpos($str, $word)!==false ) $result[] = $word;
  }
  return $result;
}
if ( $re=check_word($wr_content) ) {
  alert(implode(', ', $re).' 문자는 사용할 수 없습니다.');
  exit;
}
// alert() 함수 끝에 exit; 처리하면 간단하게 한 줄로.
// if ( $re=check_word($wr_content) ) alert(implode(', ', $re).' 문자는 사용할 수 없습니다.');

 


// 단순한 방법
function check_word($str) {
  static $check_word = ['href', 'test', 'money'];
  // 혹시 PHP v5.4 미만은 $check_word = array('href', 'test', 'money');
  if ( strlen($wr_content)!==strlen(str_replace($check_word, '', $wr_content)) ) return true;
  return false; // 어차피 위 조건에 걸려 true 반환 시 처리라 생략 가능하지만...
}
if ( check_word($wr_content) ) {
  alert('사용할 수 없는 문자[열]가 포함되었습니다.');
  exit;
}

 

* 휴일은 짧군요.

자세한 설명 감사합니다.

참고로 아래 코드를 제외한 것은 모두 그누보드 원본 소스에 있는 것입니다.

    if (strpos($wr_content, 'href')) {
        alert('href 태그는 사용할 수 없습니다.');
        exit;
    }

그누보드 원본에 있는 소스 중에서도 은근히 잘못되거나 어색한 부분이 있는데 그것들이 고쳐지지 않더라구요. 왜 그런지는 저도 모르겠네요.
아무튼 좋은 답변 감사합니다.
많은 공부 되었습니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 123,152 | RSS
QA 내용 검색

회원로그인

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