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