Php ve React.js ile api güvenliği nasıl sağlanır?
Merhaba arkadaşlar. Ben web sitemin front-end kısmını Reacjt.js ile back-end kısımını ise php ile yapıyorum. Php'de verileri veritabanından çekip json'a çeviriyorum ve sonra bu verileri React.js'de fetch ile alıyorum. Benim takıldığım nokta bu api adresine örneğin siteismi.com/uyecek.php sayfasına başka uygulamalardanda sorgu yapılabilir. Bunu nasıl engelleyebilirim? Bu api'ı sadece ben kullanmak istiyorum. Dışarıdan izinsiz kimse erişemesin istiyorum.
Frontend (React.js) Kodu
import React, { useState } from 'react';
function UrunEkle() {
const [urunAdi, setUrunAdi] = useState('');
const [urunFiyati, setUrunFiyati] = useState('');
const [csrfToken, setCsrfToken] = useState('');
// CSRF token'ı backend'den almak için bir fonksiyon yazın
function getCsrfToken() {
fetch('http://siteismi.com/csrf_token.php', {
credentials: 'include'
})
.then(response => response.json())
.then(data => setCsrfToken(data.csrfToken));
}
// Sayfa yüklendiğinde CSRF token'ını alın
useEffect(() => {
getCsrfToken();
}, []);
// Ürün bilgilerini backend'e gönderen bir fonksiyon yazın
function handleSubmit(event) {
event.preventDefault();
const data = {
urunAdi: urunAdi,
urunFiyati: urunFiyati,
csrfToken: csrfToken // CSRF token gönderilir
};
fetch('http://siteismi.com/urun_ekle.php', {
method: 'POST',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json'
},
credentials: 'include'
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
}
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="urun-adi">Ürün Adı:</label>
<input type="text" id="urun-adi" value={urunAdi} onChange={e => setUrunAdi(e.target.value)} />
</div>
<div>
<label htmlFor="urun-fiyati">Ürün Fiyatı:</label>
<input type="number" id="urun-fiyati" value={urunFiyati} onChange={e => setUrunFiyati(e.target.value)} />
</div>
<input type="hidden" name="csrf_token" value={csrfToken} /> {/* CSRF token hidden input alanı olarak eklenir */}
<button type="submit">Ürün Ekle</button>
</form>
);
}
Backend (PHP) Kodu
<?php
session_start();
// Veritabanı bağlantısı yapılır
$servername = "localhost";
$username = "kullanici_adi";
$password = "sifre";
$dbname = "veritabani_adi";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Veritabanı bağlantısı başarısız: " . $conn->connect_error);
}
// CSRF token'ı oluşturan ve kontrol eden fonksiyonları içeren bir sınıf yazın
class Csrf {
public static function generateToken() {
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $token; // CSRF token session'da saklanır
return $token;
}
public static function validateToken($csrf_token) {
if (isset($_SESSION['csrf_token']) && $csrf_token === $_SESSION['csrf_token']) {
return true;
} else {
return false;
}
}
}
// Ürün ekleme işlemini gerçekleştiren bir fonksiyon yazın
function urunEkle($data) {
// CSRF token doğrulaması yapılır
if (!isset($data['csrf_token']) || !Csrf::validateToken($data['csrf_token'])) {
header('HTTP/1.1 401 Unauthorized');
echo json_encode(['message' => 'CSRF token doğrulaması başarısız.']);
exit();
}
// POST verileri alınır
$urunAdi = isset($data['urunAdi']) ? htmlspecialchars($data['urunAdi']) : null;
$urunFiyati = isset($data['urunFiyati']) ? (float) $data['urunFiyati'] : null;
// Verilerin doğruluğu kontrol edilir
if (!$urunAdi || !$urunFiyati) {
header('HTTP/1.1 400 Bad Request');
echo json_encode(['message' => 'Ürün adı ve fiyatı belirtilmelidir.']);
exit();
}
// Veritabanına ürün eklenir
$sql = "INSERT INTO urunler (urun_adi, urun_fiyati) VALUES ('$urunAdi', $urunFiyati)";
if ($conn->query($sql) === true) {
echo json_encode(['message' => 'Ürün başarıyla eklendi.']);
} else {
header('HTTP/1.1 500 Internal Server Error');
echo json_encode(['message' => 'Ürün eklenirken bir hata oluştu: ' . $conn->error]);
}
}
// GET isteği alındığında CSRF token oluşturup döndüren bir API endpoint'i yazın
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['csrf_token'])) {
$csrfToken = Csrf::generateToken();
echo json_encode(['csrfToken' => $csrfToken]);
}
// POST isteği alındığında ürün ekleme fonksiyonunu çağıran bir API endpoint'i yazın
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['urunAdi']) && isset($_POST['urunFiyati'])) {
urunEkle($_POST);
} else {
header('HTTP/1.1 400 Bad Request');
echo json_encode(['message' => 'Geçersiz istek.']);
}
$conn->close();
?>