그누보드 스팸글 차단 방법
본문
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;
}
* 휴일은 짧군요.
!-->!-->!-->!-->!-->링크 기능을 차단하시려는거 같네요 해당 방법도 좋은 방법인듯 합니다. ^^