스팸처리에서 저번에 내가 하드코어적으로 코딩을 했었다. -_-;;
PHP 함수가 뭐있는지 그리고 어떻게 쓰인지 모르고 빨리 막 코딩을 해서 나도 어이없게 짜버렸다. 비효율적인 코딩을 ㅠㅠ
컴퓨터공학과 2년 씩이나 공부한 사람이 이렇게 어의없는 코드를 짤줄이야 -_-;;
내가 홍익대학교 컴퓨터공학과 다닌다는 것이 한심해지기 시작하였다.
맨 처음에 짠 PHP 코드는 이러하다.
// 스팸 처리 시작
$ahref = '<a href=';
$spamword00 = 'viagra';
$spamword01 = 'sex';
$spamword02 = 'porn';
$spamword03 = 'lesbian';
$spamword04 = '[url=';
$spamword05 = 'hardcore';
$spamword06 = 'buspar';
$spamword07 = 'alprazolam';
$spamword08 = 'anal';
$spamword09 = 'buy';
$spamword10 = 'fuck';
$spamword11 = 'hentai';
$spamword12 = 'gay';
$spamword13 = 'xxx';
$spamword14 = 'adult';
$spamword15 = 'dildo';
$spamword16 = 'bikini';
$spamword17 = 'winx';
$spamword18 = 'ringtones';
$spanword19 = 'female';
$spamword20 = 'male';
$spamword21 = 'hot';
$spamword22 = 'teen';
$spamword23 = 'nude';
$spamword24 = 'blonde';
$spamword25 = 'vibrator';
$spamword26 = 'amateur';
$spamword27 = 'investment';
$spamword28 = 'Fetish';
$spamword29 = 'chanel';
$spamword30 = 'payday';
$spamword31 = 'Mortgage';
$spamword32 = 'Refinance';
$spamword33 = 'cialis';
$spamword34 = 'tramadol';
$spamword35 = 'xanax';
$spamword36 = 'phentermine';
$spamword37 = 'pharmacy';
if(stristr($title, $ahref) ||
// 제목에 spam이 등록되는 것 방지(금칙어 설정)
stristr($title, $spamword00) || stristr($title, $spamword01) || stristr($title, $spamword02) || stristr($title, $spamword03) || stristr($title, $spamword04) || stristr($title, $spamword05) || stristr($title, $spamword06) || stristr($title, $spamword07) || stristr($title, $spamword08) || stristr($title, $spamword09) || stristr($title, $spamword10) || stristr($title, $spamword11) || stristr($title, $spamword12) || stristr($title, $spamword13) || stristr($title, $spamword14) || stristr($title, $spamword15) || stristr($title, $spamword16) || stristr($title, $spamword17) || stristr($title, $spamword18) || stristr($title, $spamword19) || stristr($title, $spamword20) || stristr($title, $spamword21) || stristr($title, $spamword22) || stristr($title, $spamword23) || stristr($title, $spamword24) || stristr($title, $spamword25) || stristr($title, $spamword26) || stristr($title, $spamword27) || stristr($title, $spamword28) || stristr($title, $spamword29) || stristr($title, $spamword30) || stristr($title, $spamword31) || stristr($title, $spamword32) || stristr($title, $spamword33) || stristr($title, $spamword34) || stristr($title, $spamword35) || stristr($title, $spamword36) || stristr($title, $spamword37)
// 이름에 spam이 등록되는 것 방지(금칙어 설정)
|| stristr($name, $spamword00) || stristr($name, $spamword01) || stristr($name, $spamword02) || stristr($name, $spamword03) || stristr($name, $spamword04) || stristr($name, $spamword05) || stristr($name, $spamword06) || stristr($name, $spamword07) || stristr($name, $spamword08) || stristr($name, $spamword09) || stristr($name, $spamword10) || stristr($name, $spamword11) || stristr($name, $spamword12) || stristr($name, $spamword13) || stristr($name, $spamword14) || stristr($name, $spamword15) || stristr($name, $spamword16) || stristr($name, $spamword17) || stristr($name, $spamword18) || stristr($name, $spamword19) || stristr($name, $spamword20) || stristr($name, $spamword21) || stristr($name, $spamword22) || stristr($name, $spamword23) || stristr($name, $spamword24) || stristr($name, $spamword25) || stristr($name, $spamword26) || stristr($name, $spamword27) || stristr($name, $spamword28) || stristr($name, $spamword29) || stristr($name, $spamword30) || stristr($name, $spamword31) || stristr($name, $spamword32) || stristr($name, $spamword33) || stristr($name, $spamword34) || stristr($name, $spamword35) || stristr($name, $spamword36) || stristr($name, $spamword37)
// 내용에 spam이 등록되는 것 방지(금칙어 설정)
|| stristr($content, $spamword00) || stristr($content, $spamword01) || stristr($content, $spamword02) || stristr($content, $spamword03) || stristr($content, $spamword04) || stristr($content, $spamword05) || stristr($content, $spamword06) || stristr($content, $spamword07) || stristr($content, $spamword08) || stristr($content, $spamword09) || stristr($content, $spamword10) || stristr($content, $spamword11) || stristr($content, $spamword12) || stristr($content, $spamword13) || stristr($content, $spamword14) || stristr($content, $spamword15) || stristr($content, $spamword16) || stristr($content, $spamword17) || stristr($content, $spamword18) || stristr($content, $spamword19) || stristr($content, $spamword20) || stristr($content, $spamword21) || stristr($content, $spamword22) || stristr($content, $spamword23) || stristr($content, $spamword24) || stristr($content, $spamword25) || stristr($content, $spamword26) || stristr($content, $spamword27) || stristr($content, $spanword28) || stristr($content, $spamword29) || stristr($content, $spamword30) || stristr($content, $spamword31) || stristr($content, $spamword32) || stristr($content, $spamword33) || stristr($content, $spamword34) || stristr($content, $spamword35) || stristr($content, $spamword36) || stristr($content, $spamword37) != NULL) {
?>
<script language="javascript">
alert("죄송합니다만 등록이 안됩니다^^ Spam때문에 이렇게 금칙어를 넣었습니다. 불편을 끼쳐 죄송합니다. -서버관리자\n금칙어 : viagra, sex, porn, lesbian, hardcore, buspar, alprazolam, anal, buy, fuck, hentai, gay, gay, dildo, bikini, winx, ringtones, female, male, hot, teen, nude, blonde, vibrator, amateur, investment");
history.back();
</script>
<?
exit;
}
// 스팸처리 끝
이런 코드를 알아볼수 있을까? 알아볼수 있다. 삽질을 하면서다. 그리고 코드가 효율적일까? 절대 효율적이지도 않다.
이런 가독성도 없는 코드나 짜고 있으니 얼마나 내가 한심한지 ㅠㅠ
위 코드를 보면 변수들을 남발하며 선언 했다. 변수들을 이렇게 많이 설정하면 spam 처리할시 금칙어들이 늘어나면 변수명을 어떻게 넣었는지도 구분도 안갈 것이고 금칙어 관리가 힘들어질 것이다. 금칙어들을 그때 그때 반영을 못해버린다.
이렇게 변수들을 남발할 바에는 Array란 것을 쓰면 편하다. (편한 것 찾아야 프로그램을 효율적으로 만들지 -_-;;)
그리고 변수들을 남발하고 if 문장안에 stristr($x,$x)를 선언하였다. 이것은 변수를 array로 저장하고 for문으로 돌리면 줄수는 휠씬 줄어든다. 그리고 금칙어가 늘어날때 그때그때 추가하면 프로그램이 아주 간편해진다. for문을 돌리면 간편해질것을 이렇게 막코딩을 해버리면 프로그램의 효율성도 줄어들것이고 미래의 금칙어가 추가될때의 코드 치기의 불편함과 확장성이 힘듦, 가독성도 떨어진다. 이런 코드를 짠 내 자신이 컴퓨터공학을 한다는것이 한심할 따름이다.
윗 코드를 개선한 코드이다. 내 딴에는 효율적으로 작성했다고 생각한다. (더 효율적으로 코드를 짤수 있을 방법도 있겠지?)
// 스팸처리 시작
$spam_word = array('<a href=','viagra','sex','porn','lesbian','[url=',
'hardcore','buspar','alprazolam','anal','buy','fuck','hentai','gay',
'xxx','adult','dildo','bikini','winx','ringtones',
'female','male','hot','teen','nude','blonde','vibrator','amateur',
'investment','Fetish','chanel','payday','Mortgage','Refinance','
cialis','tramadol','xanax','phentermine', 'pharmacy');
for($i = 0;$i < count($spam_word);$i++)
{
if(stristr($title, $spam_word[$i]) || stristr($name, $spam_word[$i]) || stristr($content, $spam_word[$i]) != NULL)
{
?>
<script language="javascript">
alert("죄송합니다만 등록이 안됩니다^^ Spam때문에 이렇게 금칙어를 넣었습니다. 불편을 끼쳐 죄송합니다.\n - 서버관리자\n금칙어 : viagra, sex, porn, lesbian, hardcore, buspar, alprazolam, anal, buy, fuck, hentai, gay, gay, dildo, bikini, winx, ringtones, female, male, hot, teen, nude, blonde, vibrator, amateur, investment");
history.back();
</script>
<?
exit;
}
}
// 스팸처리 끝
얼마나 간편한가? 윗 코드보다 줄수도 줄이면서 금칙어 추가때 빨리 추가도 되고 코드 읽기도 편해졌다.
경영학과와 경제학과에서의 기초 과목은 경제학원론이라 하면 컴퓨터공학과의 기초 과목은 자료구조이다.
왜 자료구조를 배우나? 아까전과 같은 막코딩을 방지하고 효율적인 프로그래밍을 하기 위해서이다.
자료구조에서 어떻게 하면 프로그램을 효율적으로 짤수 있을지 , 코드를 어떻게 하면 줄이면서, 프로그램 실행시 공간자원과 프로그램 실행시 시간자원을 어떻게 쓰면서 프로그래밍 할지를 공부한다.
PHP에서 조차 첫번째 처럼 막코딩을 하면 컴퓨터공학도도 아닌 전자공학도, 아니지 컴퓨터를 조금 다룬다는 사람도 할수 있는 코드일것이다.
첫번째 코드와 두번째 코드는 동일한 기능을 하는 함수이다. 다만 프로그램 실행시 읽히는 속도가 첫번째는 느리고 두번째는 빠르게 읽히고, 소스 코드가 읽기 어렵나 읽기 쉽냐 차이이다.
그리나 돌아가는것이 같은 코드라도 첫번째는 서버에서 처리하는 것이 부담스러울 것이다. 그리고 금칙어들이 늘어났을때 어떻게 추가해야할지도 힘들것이고 등등 두번째에는 for문을 돌리리는 것도 부담스러울 것이나 금칙어가 늘어났을때 금방 빨리 확장 시켜서 스팸을 방지 할수 있다.
프로그램 코드 짤때에는 어떻게 효율적으로 짜야할지 고민하면서 짜야한다는 것을 알게 되었다.
이번에 스팸방지를 위해 여러가지 코드를 짜면서 느낀 점은 ..
난 아직도 연습이 필요하구나!자료구조를 배웠다는 컴퓨터공학도가 이런 한심한 삽질을 했다는 것이 걱정이다.
이글루스 가든 - 무적의 공대생이 되자!