반응형

카페 홈페이지를 만들면서 겪은 경험 중 하나는 데이터 테이블의 구조를 변경해야 하는 일이 있어서 몇자 적어보기로 했다.
제품 등록 부분이였는데, 이부분은 요구사항을 듣고, 그닥 어렵지 않게 구현되었다.
입력하고, 보여주고 업데이트 하고 지우는 정도인 간단하게 명령어 하나로 끝내버렸다.

그러나.. ㅡ,.ㅡa

일요일날 카페 친구와 이야기를 나누던 중, 제품(products) 관련 부분이 상당히 중요한 부분에서 잘못 이해되고 만들어 졌다는걸 알게 되었다.

초기에 받았던 요구 사항 중

1. 고객은 6개월, 12개월 단위로 한꺼번에 주문을 할 수 있어야 한다. (가격은 관리자가 직접 입력한다.)
    (이해) 각각의 커피를 6개월치, 12개월 치를 한꺼번에 주문한다.
2. 고객은 "이달의 커피" 를 커피 리스트 상단에서 볼 수 있어야 한다.
   (이해) 이달의 커피로 선정된 커피가 따로 상단에 올라간다.
3. 고객은 "샘플러" 혹은 프로모션 으로 관리되는 커피를 구입 할 수 있어야 한다.
   (이해) 따로 이벤트 커피세일로 관리하여 제품리스트와는 별도로 관리한다.

 이야기를 나누던 중, 위의 요구사항 부분이 틀렸다는걸 알았다.

1. 고객은 6개월 제품을 구입하면, 6개월 간 MD 추천의 다른 커피를 매달 받을 수 있어야 한다.
2. 고객은 커피 리스트 상단에 보이는 (MD 추천된) "이달의 커피" 로 받을 커피를 확인 할 수 있다.
3. 샘플러 커피나 프로모션 커피는 이벤트 커피 세일이 아닌 하나의 제품으로 팔려야 한다.

음.. 이런 이런 일이 생기다니.. 커헐..
서로 함께 이야기 하면서 같은 부분을 이정도로 다르게 이해 전달을 잘못 받을 수 있다는거에 충격을 먹었다.
(내 경험이 그닥 많지 않으므로.. ㅋㅋ) 여하튼, 그럼 수정에 들어가야 한다.

그럼 틀리게 만들어진 products 테이블을 보기로 하자. (200903230948203948_create_products.rb)

위의 테이블을 보면, 정말 성의 없이 만들어 진걸 알 수 있다. ㅡ,.ㅡ (챙피해..)
뭐 여하튼 챙피 하지만 잘못된 테이블이니 잘 만들어야 겠다.
(200903230948203948_create_products.rb) 파일 내 붉은 글씨 부분들은 이제 필요없는 부분들이다.
그리고 파란색 부분은 새로 추가 되어야 할 컬럼들이다.

products 테이블 외에도 필요한 새로운 테이블이 2개 생겼다.

1. productorigin: 나라와 농장, 그리고 제품 아이디를 가지고 있는 테이블
2. price : 제품 아이디 당 각각의 무게에 대한 가격을 들고 있는 테이블

그리고 공통 코드 테이블내에 product_type 이 추가 되게 되었다. : Normail, Sampler, CoffeeMonthly

자.. 그럼 서로의 관계는..

1. product has many product origins
2. product origins has one product
3. proudct has many price
4. price has one product
5. product origin has many nationals farms
6. nationals, farms has many product origins


자 그럼.. alter table을 해보기로 하자.

$/ruby script/generate migration change_product

위의 명령어를 쳐서 db/migrate/2009023948029_change_product.rb 파일을 만든 뒤

class ChangeProduct < ActiveRecord::Migration
  def self.up
 remove_column :products, :national_id, :farm_id, :level, :image_url, :p200,:p500, :p1000,:p6m200,:p6m1000, :p12m200, :p12m500, :p12m1000
 add_column :products, :name, :string
 add_column :products, :product_type, :string

  end

  def self.down
 remove_column :products, :name, :product_type
  end
end

up 과 down 쪽에 파란색 부분을 넣어준다. 솔직히 원상복귀를 위해서는 self.up 내에 있는 remove_column 에 있는 모든 컬럼을 self.down 내에 add_column 으로 만들어 줘야 한다. 하지만 이전으로 복귀하지 않을 생각에 새로이 추가된 컬럼 2개만 없애버리기로 했다.

자 이제 rake db:migrate 을 하게되면

==  ChangeProduct: migrating ==================================================
-- remove_column(:products, :national_id, :farm_id, :level, :image_url, :p200, :p500, :p1000, :p6m200, :p6m1000, :p12m200, :p12m500, :p12m1000)
   -> 2.9486s
-- add_column(:products, :name, :string)
   -> 0.2711s
-- add_column(:products, :product_type, :string)
   -> 0.2248s
==  ChangeProduct: migrated (3.4452s) =========================================

두둥~ 테이블이 변경되었다.
자 이제 모델 productorigin 과 price 2개를 만들어 필요한 데이터들을 저장 할 수 있도록 바꾸는 작업만 남았다.
 


 

반응형
반응형
Nate's Tumble Log 에 올라온 (http://n8.tumblr.com/post/117477059/security-hole-found-in-rails-2-3s) 내용으로
RubyonRails.Org (http://weblog.rubyonrails.org/2009/1/2/this-week-in-edge-rails) 에서 소개된 "HTTP Digest Authentication" 의 보안오류에 대해 짚어보기로 하자.

Ruby on Rails 2.3 의 보안 오류 는 RailsInside.com (http://www.railsinside.com/) 에 2009년 6월 3일에 소개되었다.


RubyonRails.Org 에서 소개된 샘플 코드를 보면, authenticate 은 Users 해쉬 를 HTTP Digest Auth 요청을 받아 진행하게 되어 있다.
해쉬를 부를때 아무런 값을 넣지 않고 불러오게 되면 "Nil" 이 리턴이 된다. Rails 의 digest authentication 루틴에서는 nil 에 대한 반응으로 authentication 실패로 받아들인다. 하지만 암호(password) 가 빈칸으로 제공이 된다면.. 입력된 nil 과  리턴된 nil 이 즉 nil==nil 이 되어 실패 값이 아닌 성공값이 되어 인증 성공이 되어 버린다.

2.3 Ruby on Rails 에서 위의 방법으로 인증을 거친다면, 사용자 이름 및 암호에 아무런 값을 넣지 않아도 인증 성공이 되어 버린다.

예로 http://authbroken.heroku.com/ 싸이트를 방문하면 인증을 거치는데 그냥 확인을 누르게 되면 "you needed a password to see this... ( 암호를 넣어야 볼 수 있는 페이지 입니다..." 라는 문구를 볼 수 있다.

Ruby on Rails 의 Core 팀에서 만들어진 패치는 아니지만, 실질적으로 아래 링크된 패치를 적용시켜 인증에 대한 위험 요소를 줄여야겠다.
패치된 내용은 password_procedure 에서 nil 을 반환하면 validate_digest_response 에서 false 를 반환하도록 바꾸었다고 한다.

https://gist.github.com/d5fa1ce8be9dfe0d9d19


반응형

+ Recent posts