Ruby on Rails Güvenliği: SQL Injection Tehlikesi ve Korunma Yolları

Ahmet Kaptan
Passgage Tech
Published in
3 min readJan 29, 2024

Herkese selamlar 🙌. YouTube’da ‘SQL Injection Gerçekte Nasıl Engelleniyor ? ORM kullanmak her zaman güvenli mi ?(Makale sonunda videoyu bulabilirsiniz)’ başlıklı bir videoya denk geldim. Video’da Django’da bulunan bir SQL injection zafiyeti üzerinden örneklendirelerek, ORM güvenli mi? Sorsununa cevap verilmiş. Ben de Ruby on Rails ActiveRecord’da güvenlik önlemleri neler ve biz kullandığımız methodlarda zafiyete neden olabilir miyiz? Sorusuna makalemde cevap aramaya karar verdim.

O zaman başlayalım! 🏃

ActiveRecord Nedir?

Ruby on Rails’in temel bileşenlerinden biri olan ActiveRecord(AR), veritabanı ile etkileşimde bulunan bir ORM (Object-Relational Mapping) katmanıdır.

ActiveRecord’da Güvenlik Neden Önemlidir?

Ruby on Rails uygulamaları genellikle kullanıcılar, formlar ve veritabanı ile yoğun bir etkileşim içerir. AR güvenliği, SQL injection, XSS (Cross-Site Scripting), CSRF (Cross-Site Request Forgery) gibi saldırılara karşı koruma sağlar, veri bütünlüğünü korur ve güvenilir uygulamalar geliştirmeye yardımcı olur. Bu nedenle; AR güvenliğine odaklanmak, Ruby on Rails uygulamalarınızı daha güvenli hale getirir.

Güvenli SQL Sorguları Nasıl Yazılır?

Ruby on Rails’in AR ORM katmanı hali hazırda parameterized queries kullanır bu nedenle SQL injection konusunda endişeye mahal vermez. 😎 Ama zafiyet oluşturmayan sorgular yazmak istiyorsak bazı önemli noktalara dikkat etmeliyiz.

SQL sorgularında doğrudan değişkenler veya kullanıcı girişleri yerine parametreler kullanıldığında SQL injection saldırılarına karşı önemli bir savunma sağlar.

User.where("name = '#{params[:name]'") # SQL Injection!

Yukarıdaki kod parçası, kullanıcı girişi olan params[:name] verisini doğrudan SQL sorgusuna içerik olarak yerleştirmekte ve potansiyel bir SQL injection açığına neden olmaktadır. Eğer kullanıcı girişi temizlenmeden ve doğrulanmadan sorguda kullanılırsa, kötü niyetli kullanıcılar tarafından manipüle edilebilir.

Örneğin, bir kullanıcı params[:name] değerine şu girişi sağlarsa:

params[:name] = "'; DROP TABLE users; --"

Bu durumda oluşacak SQL sorgusu şu şekilde olacaktır:

SELECT * FROM users WHERE name = ''; DROP TABLE users; --

Güvenli:

result = User.where(username: params[:username])

Veya

values = { zip: entered_zip_code, qty: entered_quantity }
Model.where("zip_code = :zip AND quantity >= :qty", values).first

Yukarıdaki kod parçasında ise daha öncede bassettiğim gibi AR, parameterized queries kullanır ve otomatik olarak kullanıcı girişlerini temizler, böylece sorgularımız SQL injection saldırılarına karşı daha güvenli hale gelir.

Gelelim benim geliştirme yaparken sıklıkla kullandığım başka bir AR methoduna: find_by

Bir örnek üzerinden gidelim. 😯

User.find_by("login = '#{params[:name]}' AND password = '#{params[:password]}'")

Kötü niyetli kişi ‘ OR ‘1’=’1 adında bir isim ve ‘ OR ‘2’>’1 adında bir şifre girerse, ortaya çıkan SQL sorgusu şu şekilde olacaktır:

SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1

Ne kadar AR find_by methodunda önlem almış olsa da bu methodları kullanırken çok dikkatli olmalıyız.

Sonuç

Bu makalede, Ruby on Rails’n temel bileşenlerinden biri olan ActiveRecord’un güvenlik önlemlerini ele almaya çalştım. Güvenli SQL sorgularının nasıl yazılacağına odaklandık ve SQL injection saldırılarına karşı nasıl koruma sağlayabileceğimizi birlikte inceledik.

Makalede gördüğümüz gibi bazı AR methodları, dikkatli kullanılmadığında güvenlik riski taşıyabilir. Güvenli bir geliştirme pratiği benimseyerek, Ruby on Rails uygulamalarınızı siber saldırılara karşı daha güvenli hale getirebilirsiniz. Unutmayın ki güvenlik, her adımda ön planda tutulması gereken bir önceliktir.

Makalemi okuduğunuz için teşekkür ederim. ❤️

KAYNAKLAR:

--

--