Rails 3.2.8 auf Mountain Lion und Xcode 4.4.1

Ich hatte beim Kompilieren von nativen Gems den folgenden Fehler:

Building native extensions. This could take a while...
ERROR: Error installing json:
ERROR: Failed to build gem native extension.

/Users/xxx/.rvm/rubies/ruby-1.9.3-p0/bin/ruby extconf.rb
creating Makefile

make
compiling generator.c
make: /usr/bin/gcc-4.2: No such file or directory
make: *** [generator.o] Error 1

Abhilfe:

1. Sicherstellen, dass die Xcode Command Line Tools installiert sind (Xcode/Preferences/Downloads/Components).

2. Symbolischen Link auf den Compiler erstellen:

# sudo -s
# cd /usr/bin
# ln -s gcc-4.2 llvm-gcc-4.2
# ln -s g++ g++-4.2
# exit

Dann sollte der bundle install problemlos durchlaufen.

Bessere Zufallszahlen mit Ruby

Die meisten Pseudo-Zufallszahl-Generatoren arbeiten mit einem Seed, der auf der Systemzeit basiert. Oft reicht dies auch aus, wer aber sehr viele Zufallszahlen innert Millisekunden generieren muss (z.B. über Unit Tests), dem wird die Standard-Methode nicht ausreichen. “Bessere Zufallszahlen mit Ruby” weiterlesen

Ruby on Rails Cookies und Sicherheit

Die Standard-Cookie-Einstellungen von Rails sind aus der Security-Perspektive nicht ideal und sollten bei sensitiven Systemen etwas angepasst werden. Dies geschieht in der config/initializers/session_store.rb

MyApp::Application.config.session_store :active_record_store,
        :secure => Rails.env == 'production',
        :http_only => true,
        :expire_after => 60.minutes

Zeile 1: Session infos in der DB speichern (nicht im cookie). Hierbei nicht vergessen, die notwendige Tabelle zu erstellen:

 # rake db:sessions:create

Zeile 2: Secure flag setzen wenn die Produktion mit https läuft
Zeile 3: JavaScript Access auf Cookies verbieten
Zeile 4: Expiration Time setzen

Rails: Hardening Authlogic

Authlogic verwendet ein eigenes Cookie zur Identifizierung der User Session. Da wir diese Info aber sowieso schon in der Session haben, ist es unnötig. Ausserdem wollen wir, dass der Token neu generiert wird, ansonsten funktioniert nämlich der CSRF Schutz nicht mehr.

Folgende Änderung im UserSession Model schafft Abhilfe:

class UserSession < Authlogic::Session::Base

  # kein eigenes cookie anlegen
  skip_callback :after_save, :save_cookie

  # persistence token nach logout neu generieren
  before_destroy do
    record.reset_persistence_token
  end

end