본문 바로가기

프로그래밍/RUBY

[루비,시나트라,웹]IP 차단 시스템을 만들어 보자 !!!!!!!


네 오늘은 아이피 차단시스템을 만들어보도록 하겠습니다.

사이트 짜증나게 도배하거나 하는사람을 위해 ㅋㅋ?













일단 먼저 보스 설명을 해드리고 실제로 어떻게 보이는지 보여드리겠습니다.

//는 루비,html에서 작동안합니다.

루비에서는 =begin,=end 시작 끝이구요 # = 한줄

html <!-- 시작 --> 끝입니다.



이것이 소스입니다... 많이 길죠? ㅋㅋ

그냥 쉬어 가면서 보게끔 하려고 만들었는데 뭐또 필요한거없나해서 여러개 넣어서....ㅋㅋ

이렇게 길어졌네요..

설명을 드리겠습니다.


require 'sinatra' require 'rest_client' require 'data_mapper' require 'rubygems'

여기까지는 DB,시나트라를 사용한다고 말해주는거구요.

DataMapper::setup(:default, "sqlite3://#{File.dirname(__FILE__)}/ip_block.db")

//DB파일을 어디다 만들지 셋팅하는것입니다.저는 main과같은곳에 ip_block.db 로만들었습니다. class Ip_block // ip_block 이라는 테이블? 을 만들어줍니다. include DataMapper::Resource // 그냥 있는거라고 보시면됩니다. property :id, Serial // 이 테이블안에서 유니크[1개밖에존재하지않음] column 입니다. 이게없으면 게시글 번호 같은것도없고,네그래요

// 주민등록번호같은겁니다. property :ip, String 

//ip 라고하는 column 을 만들어줍니다. 스트링으로요 property :ipblock_date, String 

//ipblock_date 라고하는 column 을 만들어줍니다. 스트링으로요 validates_uniqueness_of :ip //ip라는 column을 유니크하게? 만들어줍니다. 1개 밖에없음.

//ip차단 시키는데 한개 아이피가 여러번 씌여있으면 삭제도 어렵고해서요..

end DataMapper.finalize Ip_block.auto_upgrade!

// DB 불러와주는거라고 해야되나 하여간 이거 없으면 오류뜹니다.

// 코딩만 하다보니 설명하기가 어렵네요.. 머리에는 있는데 머리밖으로 나오질않음...

//아래 코드를 응용하시면 화이트리스트(지정된사람만 들어올수있는것.) 를만들수있죠 ㅋ

//화이트 리스트는 ip.nil? 하시면됩니다.

before do // 이게 씌여있으면 사이트에 접속을 했을때 가장먼저 실행이 되는거구요. ip = Ip_block.first(:ip => request.env['REMOTE_ADDR'].split(',').first)

// request.env['REMOTE_ADDR'].split(',') 이건 현재 아이피를 불러오는겁니다.

// 불러와서 Ip_block 이라는 DB 테이블에서 ip 라는것에 현재 접속한 사용자의 아이피와 비교해 있으면 ip 라는곳에 저장합니다. if !ip.nil?

// ip.nil? ip가 없냐고 물어보는거구요. !가들어가면 부정입니다. !ip.nil? ip가 없지않냐? 즉 !ip.nil? ip에 뭔가 들어있냐고 물어보는겁니다. redirect 'http://www.warning.or.kr/'

//조건이 맞았을때 http://www.warning.or.kr/ 사이트로 이동합니다.

//만약 페이지를 따로만들어서 하고싶으시다면 redirect 'http://www.warning.or.kr/' 이 자리에 erb:ip_block 하신다음 ip_block.erb 파일 만드시고 거기에 뭐넣으시면 //ip 차단된 사용자는 거기로 들어가집니다. 꼭 ip_block 아니여도 됩니다. asd 여도되고 z 여도됩니다. erb:z z.erb erb:asd asd.erb 이렇게요.. end end get '/' do erb:index end


// / 인덱스 즉 메인페이지를 만들어줍니다. 사이트 들어갔을때 바로보이는것. 이거안쓰면 따로 주소 써줘야됨. get '/admin' do @ip = Ip_block.all erb:admin end


//어드민 페이지에 Ip_block 에있는 데이터를 모두 불러와 @ip 에 저장합니다. get '/ip_del/:ip_id' do ip = Ip_block.first(:id => params[:ip_id]) ip.destroy redirect '/admin' end


// Ip_block 에 있는 id(아까말한 유니크) 와 ip_id 랑 같은지 비교해 같으면 ip 에저장합니다

// destory 아시죠? 해당 ip 를없앱니다.

그리고 /admin 으로 이동합니다.

post '/ip_block' do ip = Ip_block.new ip.ip = params[:ip] ip.ipblock_date = Time.now ip.save redirect '/admin' end


// Ip_block 을 새로만듭니다.

//ip.ip 에 사이트 이용자가 보내온 데이터를 담습니다.

//ip.ipblock_date 에 Time.now (지금 현재시간) 을 담습니다.

// 아이피를 저장합니다.

/admin 으로 이동합니다.


이상 메인 controller 설명은 끝났구요.



이거는 그냥 <img src="/lomal.jpg" style="width:100%;heith:100%;"> 이거만 보시면됩니다.

/lomal.jpg 를 불러옵니다. 가로 세로는 100% 로 하구요.

img 로 출력합니다.



<!DOCTYPE html> <html> <head> </head> <body> <label> 아이피 차단<form action="/ip_block" method="post"> <input type="text" name="ip"> <input type="submit" > </form>

// <input type="text" name="ip"> 에 무엇을 넣을수있게 그뭐냐 공간을 만들어줍니다.

// form 을 만들어주고 /ip_block 에 데이터를 보내주고 post 로 함. </label> <table class="table table-striped"> <td>번호</td> <td>차단아이피</td> <td>차단시킨 날짜</td> <br> </tr> <% @ip.each do |x| %>

// @ip 데이터가 없어질때까지 실행해줌 이렇게 설명해야되나... 음... 걍 @ip 처음부터 끝까지 다 돌려준다고생각하시면됩니다.

//|x| 는 음. @ip를 x라고 쓴다고 생각하시면됩니다. <td><%= x.id %></td> 

// x.id 즉 @ip.id Ip_block 의 아이디 위에 유니크 그거 입니다. <td><%= x.ip %> </td> <td><%= x.ipblock_date %> </td> 

//그러면 다 이해가실겁니다. <td> <a href="/ip_del/<%= x.id %>">[x]</a> </td> 

// 이거는 [x] 를 클릭하면 /ip_del/<%= x.id %> 를 클릭하게 되잇는데... x.id 는 유니크 하니까 x.id 가 1이면 /ip_del/1 입니다.

//이걸 클릭하게되면 Ip_block 의 아이디가 1인 데이터를 삭제합니다.

<td>      </td> </tr> <% end %> </table> </ul> <body> </html>



이게 메인페이지입니다.

그냥 이미지 밖에없어요.



어드민 페이지구요. 제가 임의로 넣어본겁니다. 삭제도 잘되구요..



제 아이피 라서 모자이크 처리했구요.

하여간 제아이피를 넣으면..



warning.or.kr 로 들어가집니다 ㅋㅋ

아까 알려드린 main에서 www.naver.com 으로 하시면 네이버로 들어가집니다.


소스는 올려둡니다.



lomal_ipblock_system.zip


글을 원래 매주 쓰는건데...

요즘 빠바서요 ㅋㅋ

꾸준히 쓰려고 노력하겠습니다.


지금까지 로말이였구요..

다음에는 더좋은 글 쓰겠습니다.

감사합니다.