03-25-2021, 10:23 AM
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]](https://rengaver.com/ckeditor_upload/uploads/1616666559_5NypCnp8x7u1aVU.png)
Şimdi de bir iletişim formu hazırlayalım.
Formumuzu oluşturduktan sonra css yazıp daha net hale getirelim.
Front end kısmını tamamladık. Formdan gelen verileri back endde alalım ve veritabanına kaydedelim.
İ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.
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.
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.
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.
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.
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.
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]](https://rengaver.com/ckeditor_upload/uploads/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>
PHP Kod:
form {
text-align:center;
margin-top: 15%;
margin-left:25%;
border: 2px solid black;
width:50%;
}
input {
margin: 10px;
}
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;
}
}
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>";
}
?>
Ö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>
PHP Kod:
<div class="g-recaptcha" data-sitekey="your_site_key"></div>
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($response, true);
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;
}
}
}
PHP Kod:
$data = array(
'response' => $_POST['g-recaptcha-response'],
'secret' => 'secret-key'
);
$curl= curl_init("https://www.google.com/recaptcha/api/siteverify");
curl_setopt($curl,CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE);
$response = curl_exec($curl);