5 Kesalahan kecil programming dengan Rails yang dapat mengganggu aplikasimu!

Burhanudin Hakim
Sep 7, 2018 · 3 min read
Halt Callback Chain

1. Halt Callback Chain when false is returned

Sebelum Rails versi 5, semua fungsi yang mengembalikan nilai falsedi dalam before_ yang dipanggil pada Callback di ActiveModel atauActiveModel::Validations , ActiveRecord dan ActiveSupport akan menampilkan pesan errorActiveRecord::RecordNotSaved karena false menghentikan proses manipulasi.

# app/models/card.rb
class Card < ActiveRecord::Base
before_save :set_upcase_for_full_name

def set_upcase_for_full_name
self.full_name = self.full_name.upcase
self.active ||= false
end
end
# console
Card.create(full_name: "Gilang Putera Mahardhika")
=> ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved

Untuk rails versi 5, sudah tidak mengalami isu ini dengan menambah initializer callback_terminator.rb , secara default Rails return false. Artinya behaviour untuk menghentikan callback chain saat fungsi didalam befoer_ mengembalikan nilai menjadi false dimatikan.

ActiveSupport.halt_callback_chains_on_return_false = false

Sehingga hasilnya adalah jika di eksekusi menggunakan Rails 5 menjadi :

# app/models/card.rb
class Card < ApplicationRecord
before_save :set_upcase_for_full_name

def set_upcase_for_full_name
self.full_name = self.full_name.upcase
self.active ||= false
end
end

Card.create(full_name: "Gilang Putera Mahardhika")
=> #<Card id: 1, full_name: "GILANG PUTERA MAHARDHIKA", active: false, created_at: "2018-09-07 13:18:42", updated_at: "2018-09-07 13:18:42">

2. Menuliskan credentials di dalam Code

Rails 5.2 sudah memiliki tambahan fitur untuk mengamankan credentials, selengkapnya lihat dokumentasi Rails Credentials . Akan tetapi versi sebelumnya perlu mengelola credentials menggunakan ENV environment variable. Kesalahan yang biasa dilakukan adalah menulis credentials langsung di dalam codebase.

class Application < Rails::Application
config.action_mailer.delivery_method = :mailgun
config.action_mailer.mailgun_settings = {
api_key: "API_KEY_12345",
domain: "domain.mailgun.com"
}
end

Pada versi sebelum Rails 5 bisa menggunakan alternatif gem dotenv-rails dengan membuat config .env.production , .env.development untuk mengisi

# config/application.rb
class Application < Rails::Application
config.action_mailer.delivery_method = :mailgun
config.action_mailer.mailgun_settings = {
api_key: ENV["MAILGUN_API_KEY"],
domain: ENV["MAILGUN_DOMAIN"]
}
end

Pada file .env.production

MAILGUN_API_KEY="API_KEY_12345"
MAILGUN_DOMAIN="domain.mailgun.com"


3. Lupa Setting default url action_mailer

Lupa konfigurasi host di environment menyebabkan error missing host to link_to, mengakibatkan tidak bisa menampilkan full url apabila di view email ada url_path helper.

Tambahkan konfigurasi default url untuk mailer

# config/environment/production.rb
config.action_mailer.default_url_options = { host: "blog.ku" }

4. Staging Server terindex Google

Staging Server terindex Google
Staging Server terindex Google (2)

Server staging seharusnya digunakan untuk kepentingan internal saja, pastikan robot.txt disallow dari web spider.

# staging server
# robot.txt
User-Agent: *
Disallow: /

Atau buatlah akses ke server staging menggunakan basic_auth .

authenticate_or_request_with_http_basic("Staging") do |name, pass|
name == "staging" && pass == "staging"
end


5. SQL Injection

Rails memberikan kemudahan untuk melakukan query ke database dengan ORM ActiveRecord. Pastikan kode Anda tidak membuat kesalahan dengan memberi ruang untuk SQL Injection.

Company.where("upper(name) like '%#{params[:q]}%'")

Kode di atas memberikan celah untuk dapat diserang dengan SQL Injection. Solusinya adalah dengan memberikan argumen maupunn placeholder binding.

Company.where("name like ? ", "%#{params[:q]}%")
Company.where("name like :query", { query: "%#{params[:q]}%" })

Demikian Kesalahan kecil namun “mematikan”! Keep your codebase healthy! Happy Coding!


Burhanudin Hakim

Written by

Developer, Co-Founder and VP-Engineering at https://www.qontak.com

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade