Rengaver
PHP Google Recaptcha ile İletişim Formu Yapımı - Baskı Önizleme

+- Rengaver (https://rengaver.com)
+-- Forum: Yazılım Dersleri (https://rengaver.com/forum-yazilim-dersleri)
+--- Forum: PHP (https://rengaver.com/forum-php)
+--- Konu Başlığı: PHP Google Recaptcha ile İletişim Formu Yapımı (/konu-php-google-recaptcha-ile-iletisim-formu-yapimi)



PHP Google Recaptcha ile İletişim Formu Yapımı - seraph - 03-25-2021

PHP Google Recaptcha İle İletişim Formu
Bu yazıda Google Recaptcha kullanımını bir iletişim formu üzerinden göreceğiz. Veritabanı kullanacağımız için öncelikle bir veritabanı ve içine de aşağıdaki gibi bir tablo oluşturalım.
[Resim: 1616666559_5NypCnp8x7u1aVU.png]
Şimdi de bir iletişim formu hazırlayalım.
PHP Kod:
    <form action="" method="POST">
        <
label for="firstName">Adınız</label>
        <
input type="text" name="firstName" id="firstName">
        <
br>
        <
label for="lastName" method="POST">Soy Adınız</label>
        <
input type="text" name="lastName" id="lastName">
        <
br>
        <
input type="submit">
    </
form
Formumuzu oluşturduktan sonra css yazıp daha net hale getirelim.
PHP Kod:
form {
            
text-align:center;
            
margin-top15%;
            
margin-left:25%;
            
border2px solid black;
            
width:50%;
        }
        
input {
            
margin10px;
        } 
Front end kısmını tamamladık. Formdan gelen verileri back endde alalım ve veritabanına kaydedelim.
PHP Kod:
try {
    
$host "localhost";
    
$dbname="test_project";
    
$username "root";
    
$password "";
    
$db = new PDO("mysql:host=$host;dbname=$dbname;charset=UTF8"$username$password);
} catch(\
Exception $e) {
    die(
$e->getMessage());
}
if(isset(
$_POST['submit'])) {
    if(!
$_POST['firstName']) {
        
$error "İsim boş bırakılamaz.";
    } else if(!
$_POST['lastName']){
        
$error "Soy isim boş bırakılamaz.";
    } else if(!
$_POST['message']) {
        
$error "Mesaj boş bırakılamaz.";
    } else {
        
$firstName trim($_POST['firstName']);
        
$lastName trim($_POST['lastName']);
        
$message trim($_POST['message']);
        
$insertQuery $db->prepare("INSERT INTO contacts (firstName,lastName,message) VALUES (?,?,?)");
        
$insertQuery->execute([
            
$firstName,
            
$lastName,
            
$message
        
]);
        
$success true;
    }

İlk kısımda pdo ile bir veri tabanı bağlantısı gerçekleştiriyoruz. Siz de kendi veritabanınızın bilgilerini değişkenlere atarak bağlanabilirsiniz. Bağlantıyı gerçekleştirdikten sonra iletişim formundan istek gönderilmiş mi diye kontrol ediyoruz. Gelmişse de doğrulama işlemine başlıyoruz. Her bir verinin boş olup olmadığını sorgulayıp boşsa hata mesajı yazıyoruz. Eğer doğrulama işlemi başarılı olursa verileri trim() fonksiyonuyla değişkenlere atıyoruz. trim() fonksiyonu, verinin başındaki ve sonundaki boşlukları silmeye yarıyor. Verileri aldığımıza göre artık veritabanına kaydedebiliriz. SQL injection saldırılarını önlemek için PDO nun prepare ve execute yapılarını kullanıyoruz. Bu sayede kullanıcının bize kötü niyetle gönderdiği karakterleri (tırnak işareti gibi) etkisiz kılarak sorgumuzun manipüle edilmesini engellemiş olduk. Soru işaretleri, kaydedilecek verileri temsil ediyor. Execute methodunda da prepare methodundaki sorguyu, kullanıcının gönderdiği verilerle birleştirip çalıştırıyoruz. İşlem hatasız gerçekleşince de mesaj göstermek adına bir success değişkeni tanımlayıp değerine true veriyoruz. Şimdi de hata ve başarılı mesajlarını gösterelim.
PHP Kod:
<form action="" method="POST" id="contactForm">
        <?
php
        
if(isset($error)) {
            echo 
"<h3 style='color:red;'>Hata:" $error "</h3>";
        }
        if(isset(
$success)) {
            echo 
"<h3 style='color:green;'>Başarılı!</h3>";
        }
        
?>
Eğer error değişkeni tanımlanmışsa hata mesajını yazdırıyoruz. Success değişkeni tanımlanmışsa da başarılı yazısını yazdırıyoruz. Standart bir iletişim formu elde etmiş olduk. Şimdi bu forma, bot saldırılarını önlemek için recaptcha doğrulaması ekleyeceğiz.
Öncelikle şu adrese giderek recaptchamızı oluşturmamız gerekiyor: https://www.google.com/recaptcha/admin/create . Etiket kısmına istediğiniz ismi verebilirsiniz. Recaptcha türü kısmından s2 seçiyoruz ve onun altından da “Robot değilim” onay kutusu seçeneğini seçiyoruz. Alan adı kısmına da recaptchayı hangi sitede kullanacağımızı yazmamız gerekiyor. Localhostta deniyorsanız localhost yazabilirsiniz. Gönder butonuna bastığımızda captchamız oluşmuş olacak. Ekrana site anahtarı ve gizli anahtar adında iki kod gelecek. Bunlar bize lazım olacak. Sayfamızın head kısmında aşağıdaki kodu kullanarak gerekli js dosyasını dahil ediyoruz.
PHP Kod:
<script src="https://www.google.com/recaptcha/api.js"></script
Dosyayı dahil ettikten sonra, formumuzun içine aşağıdaki kodu yapıştırarak captchayı sayfaya ekliyoruz. your_site_key kısmına, az önce ekrana gelen site anahtarını yazmamız gerekiyor.
PHP Kod:
<div class="g-recaptcha" data-sitekey="your_site_key"></div
Captcha eklendi ama bu haliyle çalışmayacaktır. Bir de backendde bu captcha doldurulmuş mu diye kontrol etmemiz gerekiyor.
if(isset($_POST[‘submit’]) ile başlayan kod bloğunu aşağıdaki şekilde güncelleyin.
PHP Kod:
if(isset($_POST['submit'])) {
    if(!
$_POST['firstName']) {
        
$error "İsim boş bırakılamaz.";
    } else if(!
$_POST['lastName']){
        
$error "Soy isim boş bırakılamaz.";
    } else if(!
$_POST['message']) {
        
$error "Mesaj boş bırakılamaz.";
    } else if(!
$_POST['g-recaptcha-response']) {
        
$error "Lütfen captchayı doldurunuz";
    } else {
        
$secretKey "6LczwowaAAAAAM3Wv-85yIjgydQWdxeMFlC2gwLL";
        
$url 'https://www.google.com/recaptcha/api/siteverify?secret=' urlencode($secretKey) .  '&response=' urlencode($_POST['g-recaptcha-response']);
        
$response file_get_contents($url);
        
$responseKeys json_decode($responsetrue);
        if(!
$responseKeys["success"]) {
            
$error "Lütfen captchayı doldurunuz.";
        } else {
            
$firstName trim($_POST['firstName']);
            
$lastName trim($_POST['lastName']);
            
$message trim($_POST['message']);
            
$insertQuery $db->prepare("INSERT INTO contacts (firstName,lastName,message) VALUES (?,?,?)");
            
$insertQuery->execute([
                
$firstName,
                
$lastName,
                
$message
            
]);
            
$success true;
        }
    }

Yukarıdaki kodda bir if bloğu daha ekleyerek captchanın gönderilip gönderilmediğini kontrol ettik. Gönderilmemişse hata mesajı yazdık. Gönderilmişse ve diğer doğrulamalar da tamamsa captchanın asıl doğrulamasını yapılacak. Gizli anahtarımızı $secretKey değişkenine attık. Google ın bize verdiği urle gizli anahtarımızı ve formdan gelen captcha verisini gönderdik ve dönen sonucu $response değişkenine attık. Aynı işlemi curl ile de yapılabilir. Aşağıdaki kodda da curl ile yapılan versiyonu bulunuyor.
PHP Kod:
    $data = array(
                    
'response' => $_POST['g-recaptcha-response'],
                    
'secret' => 'secret-key'
                
);
                
$curlcurl_init("https://www.google.com/recaptcha/api/siteverify");
                
curl_setopt($curl,CURLOPT_POSTTRUE);
                
curl_setopt($curlCURLOPT_POSTFIELDShttp_build_query($data));
                
curl_setopt($curl,CURLOPT_RETURNTRANSFERTRUE);
                
curl_setopt($curl,CURLOPT_FOLLOWLOCATIONTRUE);
                
$response curl_exec($curl); 
Daha sonra da gelen yanıtı işleyebilmek için json_decode() ile diziye çevirdik. Eğer sonuç başarısızsa hata mesajı yazdırdık. Başarılı ise de form verilerini veritabanın işleyip ardından da başarılı yazısını yazdırdık.