Temel Güvenlik Açıkları ve Önlemleri: Python, PHP ve ASP ile Uygulama Güvenliği

Güvenlik, yazılım geliştirme sürecinde her zaman öncelikli bir konu olmalıdır. Yazılım uygulamaları, kötü niyetli kullanıcılar tarafından hedef alınabilir ve bu tür saldırılar, ciddi veri ihlallerine, sistem kesintilerine ve finansal zararlara yol açabilir. Bu makalede, temel güvenlik açıklarını inceleyecek ve bu açıkları Python, PHP ve ASP ile nasıl önleyebileceğinizi anlatacağız. Ayrıca, güvenlik açıklarından korunmak için almanız gereken önlemleri örneklerle açıklayacağız.

1. Temel Güvenlik Açıkları Nelerdir?

Güvenlik açıkları, uygulamalardaki zayıf noktalar olup kötü niyetli kullanıcılar tarafından saldırıya uğrayabilir. İşte en yaygın güvenlik açıkları:

SQL Enjeksiyonu (SQL Injection): Veritabanı sorgularına kötü niyetli SQL komutlarının eklenmesiyle yapılan bir saldırıdır.

XSS (Cross-Site Scripting): Kullanıcılara zararlı JavaScript kodları enjekte ederek yapılan saldırıdır.

CSRF (Cross-Site Request Forgery): Kullanıcıyı kötü niyetli bir isteği fark etmeden göndermeye zorlar.

Duyarlı Veri Sızdırma: Şifreler, kredi kartı bilgileri ve kişisel veriler gibi hassas bilgilerin korunmaması.

Güvenlik açıkları, yazılım sistemlerinin ve kullanıcıların güvenliğini tehdit eder. Bu tür açıkların engellenmesi, hem yazılımın bütünlüğü hem de kullanıcıların güvenliği için kritik öneme sahiptir.

2. SQL Enjeksiyonu (SQL Injection) ve Önlenmesi

SQL enjeksiyonu, veritabanı sorgularına dışarıdan kötü niyetli SQL komutlarının eklenmesiyle gerçekleştirilir. Bu tür saldırılar, kullanıcı verilerini çalmak, veri silmek veya veritabanını değiştirmek için kullanılabilir.

Python ile SQL Enjeksiyonundan Korunma

Python'da SQL enjeksiyonuna karşı korunmak için parametreli sorgular kullanmak gereklidir.

1import sqlite3
2
3# Bağlantı kurma
4conn = sqlite3.connect('database.db')
5cursor = conn.cursor()
6
7# Kullanıcıdan alınan veriler
8username = input("Kullanıcı Adı: ")
9password = input("Şifre: ")
10
11# SQL enjeksiyonuna karşı korunmak için parametreli sorgu
12cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))
13result = cursor.fetchone()
14
15if result:
16print("Giriş başarılı!")
17else:
18print("Geçersiz kullanıcı adı veya şifre.")
19
20conn.close()
Python'da, veritabanı sorgularında parametreli sorgular kullanmak, SQL enjeksiyonuna karşı güçlü bir savunma sağlar.

PHP ile SQL Enjeksiyonundan Korunma

PHP'de de SQL enjeksiyonunu engellemek için PDO (PHP Data Objects) kullanarak güvenli sorgular yazılabilir.

1<?php
2try {
3// Veritabanı bağlantısı
4$pdo = new PDO("mysql:host=localhost;dbname=testdb", "root", "password");
5$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
6
7// Kullanıcıdan alınan veriler
8$username = $_POST['username'];
9$password = $_POST['password'];
10
11// Parametreli sorgu
12$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
13$stmt->bindParam(':username', $username);
14$stmt->bindParam(':password', $password);
15$stmt->execute();
16
17if ($stmt->rowCount() > 0) {
18echo "Giriş başarılı!";
19} else {
20echo "Geçersiz kullanıcı adı veya şifre.";
21}
22
23} catch (PDOException $e) {
24echo "Hata: " . $e->getMessage();
25}
26?>
PHP'de PDO kullanarak parametreli sorgular yazmak, SQL enjeksiyonuna karşı koruma sağlar.

ASP.NET ile SQL Enjeksiyonundan Korunma

ASP.NET ile SQL enjeksiyonundan korunmak için parameterized queries kullanmak gereklidir.

1<%
2Dim conn, cmd, username, password
3Set conn = Server.CreateObject("ADODB.Connection")
4conn.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=testdb;User ID=sa;Password=password"
5
6username = Request.Form("username")
7password = Request.Form("password")
8
9' Parametreli sorgu
10Set cmd = Server.CreateObject("ADODB.Command")
11cmd.ActiveConnection = conn
12cmd.CommandText = "SELECT * FROM users WHERE username = ? AND password = ?"
13cmd.Parameters.Append cmd.CreateParameter(, 200, 1, 255, username)
14cmd.Parameters.Append cmd.CreateParameter(, 200, 1, 255, password)
15
16Set rs = cmd.Execute()
17
18If Not rs.EOF Then
19Response.Write "Giriş başarılı!"
20Else
21Response.Write "Geçersiz kullanıcı adı veya şifre."
22End If
23
24rs.Close
25Set rs = Nothing
26conn.Close
27Set conn = Nothing
28%>
ASP.NET'te parametreli sorgular kullanarak SQL enjeksiyonunun önüne geçilebilir.

3. XSS (Cross-Site Scripting) ve Önlenmesi

XSS, kullanıcıların web sayfasında zararlı JavaScript kodları çalıştırmasına olanak tanır. Bu tür saldırılar, kullanıcı bilgilerini çalmak ve kötü amaçlı yazılım yaymak için kullanılabilir.

Python ile XSS'den Korunma

Python’da XSS saldırılarından korunmak için kullanıcıdan alınan verilerin düzgün bir şekilde HTML'e encode edilmesi gerekir.

1import cgi
2
3# Kullanıcıdan alınan veriyi güvenli hale getirme
4form = cgi.FieldStorage()
5user_input = form.getvalue("username")
6safe_input = cgi.escape(user_input)
7
8print(f"Merhaba, {safe_input}!")
Python'da, cgi.escape() kullanarak kullanıcıdan alınan veriler HTML'e encode edilebilir ve XSS saldırılarına karşı korunabilirsiniz.

PHP ile XSS'den Korunma

PHP’de XSS saldırılarını engellemek için htmlspecialchars() fonksiyonu kullanılarak veriler encode edilebilir.

1<?php
2$username = $_POST['username'];
3$safe_username = htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
4echo "Merhaba, $safe_username!";
5?>
PHP'de, htmlspecialchars() fonksiyonu, kullanıcı girişlerini güvenli hale getirerek XSS saldırılarından korunmanızı sağlar.

ASP.NET ile XSS'den Korunma

ASP.NET’te XSS saldırılarından korunmak için verilerin HttpUtility.HtmlEncode() fonksiyonu ile encode edilmesi gereklidir.

1<%
2Dim username
3username = Request.Form("username")
4
5' XSS saldırılarına karşı koruma
6Response.Write("Merhaba, " & Server.HtmlEncode(username))
7%>
ASP.NET’te, Server.HtmlEncode() fonksiyonu kullanılarak XSS saldırılarına karşı korunabilirsiniz.

4. CSRF (Cross-Site Request Forgery) ve Önlenmesi

CSRF saldırıları, kullanıcıyı kötü amaçlı bir isteği fark etmeden göndermeye zorlar. Bu tür saldırıları engellemek için token kullanılması gereklidir.

Python ile CSRF Koruması

Flask gibi Python web framework'lerinde CSRF koruması için csrf_token kullanılır.

1from flask import Flask, render_template_string, request
2from flask_wtf.csrf import CSRFProtect
3
4app = Flask(__name__)
5app.config['SECRET_KEY'] = 'mysecretkey'
6csrf = CSRFProtect(app)
7
8@app.route('/submit', methods=['POST'])
9def submit():
10# CSRF token kontrolü yapılır
11return "Form başarıyla gönderildi!"
12
13if __name__ == '__main__':
14app.run()
Python'da, CSRF saldırılarını engellemek için Flask gibi framework’ler üzerinde CSRF token kullanabilirsiniz.

PHP ile CSRF Koruması

PHP'de CSRF koruması için her formda benzersiz bir token kullanılabilir.

1<?php
2session_start();
3if ($_SERVER["REQUEST_METHOD"] == "POST") {
4if ($_POST['csrf_token'] == $_SESSION['csrf_token']) {
5echo "Form başarıyla gönderildi!";
6} else {
7echo "Geçersiz CSRF token!";
8}
9}
10
11$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
12?>
13
14<form method="POST">
15<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
16<input type="submit" value="Gönder">
17</form>
PHP'de, her form gönderiminde bir CSRF token kullanarak bu tür saldırılara karşı korunabilirsiniz.




konu hakkında tepkinizi verebilirsiniz