PHP 表单验证

Bu bölüm ve bir sonraki bölüm, PHP kullanarak form verilerini nasıl doğrulayacağınızı anlatmaktadır.

PHP 表单验证

İpucu:在处理 PHP 表单时请重视安全性!

这些页面将展示如何安全地处理 PHP 表单。对 HTML 表单数据进行适当的验证对于防范黑客和垃圾邮件很重要!

我们稍后使用的 HTML 表单包含多种输入字段:必需和可选的文本字段、单选按钮以及提交按钮:

上面的表单使用如下验证规则:

字段 验证规则
Name 必需。必须包含字母和空格。
E-mail 必需。必须包含有效的电子邮件地址(包含 @ 和 .)。
Website 可选。如果选填,则必须包含有效的 URL。
Comment 可选。多行输入字段(文本框)。
Gender 必需。必须选择一项。

首先我们看一下这个表单的纯 HTML 代码:

文本字段

name、email ve website metin giriş elemanlarıdır, comment alanı bir metin kutusudur. HTML 代码是这样的:

Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>

单选按钮

gender 字段是单选按钮,HTML 代码是这样的:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

表单元素

表单的 HTML 代码是这样的:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

当提交此表单时,通过 method="post" 发送表单数据。

什么是 $_SERVER["PHP_SELF"] 变量?

$_SERVER["PHP_SELF"] bir超全局变量,它返回当前执行脚本的文件名。

Bu yüzden, $_SERVER["PHP_SELF"] form verilerini sayfa kendisine gönderir, başka bir sayfaya atlamaz. Böylece, kullanıcı form sayfasında hata uyarı bilgilerine ulaşabilir.

htmlspecialchars() fonksiyonu nedir?

htmlspecialchars() fonksiyonu, özel karakterleri HTML karakterlerine dönüştürür. Bu, < ve > gibi HTML karakterlerinin < ve > olarak değiştirilmesi anlamına gelir. Bu, saldırganların formda HTML veya JavaScript kodu (cross-site scripting saldırısı) ekleyerek kodu kullanmasını önler.

PHP form güvenliği hakkında önemli bir uyarı

$_SERVER["PHP_SELF"] değişkeni saldırganlar tarafından kullanılabilir!

Sayfanız PHP_SELF kullandığında, kullanıcı alt çizgi girebilir ve cross-site scripting (XSS) çalıştırabilir.

İpucu:Cross-site scripting (XSS), Web uygulamalarında sıkça rastlanan bir bilgisayar güvenliği açığı türüdür. XSS, saldırganın diğer kullanıcıların tarayıcılarında tarayıcı betikleri girebilmesini sağlar.

Adı "test_form.php" olan bir sayfamızda aşağıdaki form var:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Şimdi, kullanıcı adres çubuğunda normal bir URL'ye girdiğinde: "http://www.example.com/test_form.php", yukarıdaki kod şu şekilde dönüştürülür:

<form method="post" action="test_form.php">

Şu ana kadar her şey normal

Ancak, kullanıcı adres çubuğunda aşağıdaki URL'yi girdiğinde:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

Bu durumda, yukarıdaki kod şu şekilde dönüştürülür:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

Bu kod bir betik ve bir bildirim komutu eklemiştir. Ayrıca, bu sayfa yüklendikten sonra JavaScript kodu çalıştırılır (kullanıcı bir uyarı kutusu görecektir). Bu, PHP_SELF değişkeninin nasıl kullanıldığına dair basit ve zararsız bir örnektir.

Bu durumu fark etmelisiniz JavaScript kodunu eklemek için <script> etiketi içinde herhangi bir JavaScript kodu ekleyebilirsiniz! Hacker, kullanıcıyı başka bir sunucudaki bir dosyaya yönlendirebilir, bu dosyadaki kötü niyetli kod, genel değişkenleri değiştirebilir veya kullanıcı verilerini diğer adreslere göndererek saklayabilir, vb.

PHP_SELF'ni kullanımı önlemek için ne yapmalıyız?

htmlspecialchars() fonksiyonunu kullanarak $_SERVER["PHP_SELF"]'nin kullanılması önüne geçebilirsiniz.

Form kodu şu şekilde:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

htmlspecialchars() fonksiyonu, özel karakterleri HTML entitiği olarak dönüştürür. Şimdi, kullanıcı PHP_SELF değişkenini kullanmaya çalışırsa, şu çıktıya neden olur:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

Kullanılamaz, zararsız!

PHP ile form verilerini doğrula

Yapmamız gereken ilk şey, tüm değişkenleri PHP'nin htmlspecialchars() fonksiyonu ile geçirmektir.

htmlspecialchars() fonksiyonunu kullandıktan sonra, kullanıcı metin alanına aşağıdaki içeriği göndermeye çalışırsa:

<script>location.href('http://www.hacked.com')</script>

- Kod çalışmaz, çünkü escape kodu olarak kaydedilir, şu şekilde:

<script>location.href('http://www.hacked.com')</script>

Şimdi bu kod, sayfada veya e-postada güvenli olarak görüntülenir.

Kullanıcı bu formu gönderdiğinde, yapmamız gereken iki şey daha var:

  1. (PHP'nin trim() fonksiyonu ile) Kullanıcı girdilerindeki gereksiz karakterleri (ekstra boşluklar, tablar, satır sonları) kaldır.
  2. (PHP'nin stripslashes() fonksiyonu ile) Kullanıcı girdilerindeki backslash'leri (\) sil.

Sonra, her zaman aynı kodu yazmak yerine daha verimli bir şekilde bir kontrol fonksiyonu oluşturuyoruz.

Bu fonksiyonu test_input() olarak adlandırıyoruz.

Şimdi, her $_POST değişkenini test_input() fonksiyonu ile kontrol edebiliyoruz, bu script şu şekilde:

Örnek

<?php
// Tanımlama değişkenleri ve boş değer olarak ayarla
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

Çalıştırma Örneği

Dikkat edin ki, betik başında formun $_SERVER["REQUEST_METHOD"] ile gönderilip gönderilmediğini kontrol ettik. REQUEST_METHOD POST ise, form gönderilmiştir - ve doğrulanmalıdır. Gönderilmemişse, doğrulama atlanır ve boş bir form gösterilir.

Ancak, yukarıdaki örnekte, tüm girdi alanları seçmeli gereklidir. Kullanıcı herhangi bir veri girmese bile, betik hala normal çalışır.

Bir sonraki adım, zorunlu girdi alanlarını oluşturmak ve gerekli olduğunda kullanmak için hata mesajları oluşturmaktır.