Tag Archives: before_filter

[Ruby] IP주소 필터링 하기(White List)

Rails에 대해 현재 공부중입니다. 다음은 완벽하게 동작하는 화이트리스트 기반 IP 필터링 예시입니다. 단순 IP필터링부터 Subnet마스크를 이용한 범위 설정까지 설정이 가능합니다. 컨트롤러에 before_filter로 설정하여 사용하는 예시입니다.

[code]before_filter :protect

def protect
  @ips = [‘127.0.0.1’, ‘192.168.1.0/24’] # 다수의 IP설정 가능
  allowed = false
  # Remote IP를 Integer형으로 변경합니다.
  bremote_ip = request.remote_ip.split(‘.’).map(&:to_i).pack(‘C*’).unpack(‘N’).first
  @ips.each do |ipstring|
    ip, mask = ipstring.split ‘/’
    # 비교할 IP도 Integer로 변경합니다.
    bip = ip.split(‘.’).map(&:to_i).pack(‘C*’).unpack(‘N’).first
    # 넷마스크값을 정의합니다. 설정되어있지 않을경우 /32로 간주합니다.
    mask = mask ? mask.to_i : 32
    bmask = ((1 << mask) – 1) << (32 – mask)
    if bip & bmask == bremote_ip & bmask
      allowed = true
      break
    end
  end

  if not allowed
     render :text => “You are unauthorized”
     return
  end
end[/code]

참고: http://stackoverflow.com/questions/11636228/whitelisting-list-of-ips-with-some-subnets-in-rails-3-application