그누보드 스팸글 차단 방법 채택완료
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개
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개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
참고로 아래 코드를 제외한 것은 모두 그누보드 원본 소스에 있는 것입니다.
if (strpos($wr_content, 'href')) {
alert('href 태그는 사용할 수 없습니다.');
exit;
}
그누보드 원본에 있는 소스 중에서도 은근히 잘못되거나 어색한 부분이 있는데 그것들이 고쳐지지 않더라구요. 왜 그런지는 저도 모르겠네요.
아무튼 좋은 답변 감사합니다.
많은 공부 되었습니다.