2010年5月12日星期三

关于Rails程序安全性

问题

默热情况下ActiveRecord允许访问者更新所有字段,以及子表字段。
这就让系统中的敏感字段暴露在外。

ActiveRecord里面提供了一下两个函数来声明可以改变的字段。
attr_accessible attr_protected

但是在实际使用中,极为不便,因为
ActiveRecord.new
ActiveRecord.update_attributes
的方法将无法正常使用

当然你可以为每个属性赋值,但这个不是聪明的做法。

问题所在不是出现在ActiveRecord上面。
而是应该在ActiveController上屏蔽一些敏感Parameter

寻找良久,以下这个Plugin应该是一个最为完善的解决方案吧。
据说这个是从Merb里面研究出来的,我想Rails3可能会有直接支持吧。

http://github.com/cjbottaro/param_protected


参看以下链接
http://railspikes.com/2008/9/22/is-your-rails-application-safe-from-mass-assignment

安全检查工具
http://thinkrelevance.com/blog/2008/02/26/tarantula-vs-your-rails-app.html

如何用curl来发送一个非GET请求

# The request
$ curl -X PUT -d "order[price_in_cents]=0" example.com/orders/225

2010年5月10日星期一

vim using easy mode ( modeless )

对于新手来说vi里面有一大堆的命令,很难使用。
但同时他的语法加亮功能却很出色。
为了两者兼得,可以使用vi的简单模式。


vim -y file


vim就会使用简单模式为你文件。
简单模式就是如同一般的文本编辑器,例如Windows里面的notepad小程序。
vi默认使用插入模式,所以你不用再为了切换模式频繁使用Esc按键了。


需要说明的是,如果你在终端下使用简单模式的话,vim没有菜单供你选择退出vim程序。
正确的做法是:

Ctrl + L



来切换到命令模式,输入 :q 来退出去。
对于新手来讲,只要记住这个退出方法就OK了。
是不是很简单。

2010年4月14日星期三

Windowsで使用するVIMの常用設定

フォルダのアドレスに %userprofile% を入れて、個人フォルダを表示されます。
そこに _vimrc というVIM設定ファイルを新規する。
以下の設定をコピーペーストして使ってください。


"新しい行のインデントを現在行と同じにする
set autoindent
"バックアップファイルを作るディレクトリ
set backupdir=$HOME/vimbackup
"ファイル保存ダイアログの初期ディレクトリをバッファファイル位置に設定
set browsedir=buffer
"クリップボードをWindowsと連携
set clipboard=unnamed
"Vi互換をオフ
set nocompatible
"スワップファイル用のディレクトリ
set directory=$HOME/vimbackup
"タブの代わりに空白文字を挿入する
set expandtab
"変更中のファイルでも、保存しないで他のファイルを表示
set hidden
"インクリメンタルサーチを行う
set incsearch
"タブ文字、行末など不可視文字を表示する
set list
"listで表示される文字のフォーマットを指定する
set listchars=eol:$,tab:>\ ,extends:<
"行番号を表示する
set number
"シフト移動幅
set shiftwidth=4
"閉じ括弧が入力されたとき、対応する括弧を表示する
set showmatch
"検索時に大文字を含んでいたら大/小を区別
set smartcase
"新しい行を作ったときに高度な自動インデントを行う
set smartindent
"行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする。
set smarttab
"ファイル内の  が対応する空白の数
set tabstop=4
"カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
"検索をファイルの先頭へループしない
set nowrapscan

" 新しいファイルの文字コードをUTF-8を使用
set fenc=utf-8
" 文字コードを識別する設定  cp936は中国文字コード簡体,cp950は中国文字コード繁体
set fileencodings=utf-8,sjis,cp932,euc-jp,ucs-bom,iso-2022-jp-3,iso-2022-jp,eucjp-ms,cp936,euc-cn,cp950,euc-tw
" カラースキーマを設定(darkblue, desert)
colo darkblue
" ハイライト
syntax on

"----------------------------------------------------------
"アートコマンド設定
"----------------------------------------------------------
"ウィンドウを最大化して起動
au GUIEnter * simalt ~x

"入力モード時、ステータスラインのカラーを変更
augroup InsertHook
autocmd!
autocmd InsertEnter * highlight StatusLine guifg=#ccdc90 guibg=#2E4340
autocmd InsertLeave * highlight StatusLine guifg=#2E4340 guibg=#ccdc90
augroup END

"日本語入力をリセット
au BufNewFile,BufRead * set iminsert=0
"タブ幅をリセット
au BufNewFile,BufRead * set tabstop=4 shiftwidth=4

".txtファイルで自動的に日本語入力ON
au BufNewFile,BufRead *.txt set iminsert=2
".rhtmlと.rbでタブ幅を変更
au BufNewFile,BufRead *.rhtml   set nowrap tabstop=2 shiftwidth=2
au BufNewFile,BufRead *.rb  set nowrap tabstop=2 shiftwidth=2

"全角スペースを視覚化
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=#666666
au BufNewFile,BufRead * match ZenkakuSpace / /

"ステータスバーにファイル情報の表示
"常に表示
set laststatus=2
"ファイルパス 修正フラグ 読み取り専用フラグ ヘルプフラグ プリビュー窓フラグ 
set statusline=%F%m%r%h%w\ [TYPE=%Y]\ [FORMAT=%{&ff}]\ [ENC=%{&enc}]\ [FENC=%{&fenc}]\ [LOW=%l/%L]


参照サイト
http://sourceforge.jp/magazine/07/11/06/0151231

2010年4月5日星期一

release tool - capistrano

Capistrano 是一个基于Rails开发部署工具。原本是主要为Rails应用使用。现在已经比较通用,不光在Rails应用中可以用。

cd app_dir
capify .

vi config/deploy.rb
set :application, "demo"
set :deploy_to, "/path/to/your/app/dir"
set :scm, :subversion
set :user, "user_for_deploy"

# cap deploy  #  This calls both `update' and `restart'
# cap deploy:update  # This calls both `update_code' or `symlink'
# cap deploy:update_code # get source from repository, and call finalize_update
# cap finalize_update # This create 3 symbol links [ public, tmp, log ]
# cap deploy:restart # This works by calling the script/process/reaper

# 如果不是Rails应用,需要覆盖下面2个方法

namespace :deploy do
  task :finalize_udpate do

  end

  task :restart do
  end
end

2010年3月25日星期四

CentOS 5.1 でRails環境構築 エラー(uninitialized constant MysqlCompat::MysqlRes)

CentOS5.1

Yumでインストール
  ruby 1.8.5

gem list


*** LOCAL GEMS ***

actionmailer (2.3.5)
actionpack (2.3.5)
activerecord (2.3.5)
activeresource (2.3.5)
activesupport (2.3.5)
capistrano (2.5.18, 2.5.14)
fastthread (1.0.7)
highline (1.5.2)
mysql (2.8.1)
net-scp (1.0.2)
net-sftp (2.0.4)
net-ssh (2.0.21, 2.0.19)
net-ssh-gateway (1.0.1)
passenger (2.2.11, 2.2.9)
rack (1.1.0, 1.0.1)
rails (2.3.5)
rake (0.8.7)
rubygems-update (1.3.6, 1.3.5)




下記のエラーででる


  Status: 500 Internal Server Error
  uninitialized constant MysqlCompat::MysqlRes


原因は良く分かりませんが、たぶんCentOSのmysql.develと不整合だと思う。
2.7バージョンでmysqlをインストールすることで解決できる。

sudo gem install mysql --version '= 2.7' -- --with-mysql-lib=/usr/lib/mysql

2010年2月22日星期一

Railsエラーメッセージ日本語化(参考)

(省略)
    errors:
      messages:
        inclusion: "は一覧にありません。"
        exclusion: "は予約されています。"
        invalid: "が不正な値です。"
        confirmation: "が一致しません。"
        accepted: "を承諾してください。"
        empty: "が記入されていません。"
        blank: "が記入されていません。"
        too_long: "は{{count}}文字以内で記入してください。"
        too_short: "は{{count}}文字以上で記入してください。"
        wrong_length: "は{{count}}文字で記入してください。"
        taken: "はすでに使用されています。"
        not_a_number: "は数値で入力してください。"
        greater_than: "は{{count}}より大きい値を指定してください。"
        greater_than_or_equal_to: "は{{count}}以上の値を指定してください。"
        equal_to: "は{{count}}を指定してください。"
        less_than: "は{{count}}より小さい値を指定してください。"
        less_than_or_equal_to: "は{{count}}以下の値を指定してください。"
        odd: "は奇数を指定してください。"
        even: "は偶数を指定してください。"
        # Append your own errors here or at the model/attributes scope.

      models:
        # Overrides default messages

      attributes:
        # Overrides model and default messages.