테스트 사이트 - 개발 중인 베타 버전입니다

그누보드 스팸글 차단 방법 채택완료

울라프 5년 전 조회 3,387

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

 

 

 

</strong></p>

<p> </p>

<p> </p>

<pre>
<code>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;
}</code></pre>

<p> </p>

<p> </p>

<p><strong>

 

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

 

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

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
B
5년 전

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

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

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

 

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

</p>

<p>$wr_content = substr(trim($_POST['wr_content']),0,<span style="color:#e74c3c;"><strong>65536</strong></span>);</p>

<p>// ↓</p>

<p>$wr_content = substr(trim($_POST['wr_content']), 0, <span style="color:#2980b9;"><strong>65535</strong></span>);</p>

<p>

 

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

</p>

<p>$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);</p>

<p>↓</p>

<p>$wr_content = rtrim($wr_content, '\\');</p>

<p>

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

 

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

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

 

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

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

</p>

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

<p>

 

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

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

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

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

</p>

<p>// 어떤 단어가 문제가 되는지 알려주고자 할 때</p>

<p>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;

}</p>

<p>if ( $re=check_word($wr_content) ) {

  alert(implode(', ', $re).' 문자는 사용할 수 없습니다.');

  exit;

}</p>

<p>// alert() 함수 끝에 exit; 처리하면 간단하게 한 줄로.</p>

<p>// if ( $re=check_word($wr_content) ) alert(implode(', ', $re).' 문자는 사용할 수 없습니다.');</p>

<p>

 

</p>

<p>// 단순한 방법</p>

<p>function check_word($str) {</p>

<p>  static $check_word = ['href', 'test', 'money'];</p>

<p>  // 혹시 PHP v5.4 미만은 $check_word = array('href', 'test', 'money');</p>

<p>  if ( strlen($wr_content)!==strlen(str_replace($check_word, '', $wr_content)) ) return true;

  return false; // 어차피 위 조건에 걸려 true 반환 시 처리라 생략 가능하지만...</p>

<p>}</p>

<p>if ( check_word($wr_content) ) {</p>

<p>  alert('사용할 수 없는 문자[열]가 포함되었습니다.');</p>

<p>  exit;</p>

<p>}</p>

<p>

 

* 휴일은 짧군요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

울라프
5년 전
자세한 설명 감사합니다.

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

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

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

댓글을 작성하려면 로그인이 필요합니다.

플라이
5년 전

링크 기능을 차단하시려는거 같네요 해당 방법도 좋은 방법인듯 합니다. ^^

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인