نمونه فرم اعتبارسنجی شده PHP

اگر در هر بخش پروژه از فرم استفاده کرده اید باید در اعتبار سنجی و امنیت آن بسیار دقت کنید. در صورتی که در برنامه PHP از فرم استفاده کرده اید باید آن را در برابر هکرها و اسپمرها ایمن کنید. چرا که فرم ها جزو اولین قسمت هایی هستند که هکرها مورد آزمایش و بررسی قرار می دهند.

اعتبار سنجی (validation) Form به عملیاتی گفته می شود که شما قبل از ذخیره اطلاعت در پایگاه داده از صحت اطلاعات وارده مطمئن می شوید. به این ترتیب که ممکن است کاربر اطلاعات را به شکل صحیح وارد نکند و یا حتی فیلد های ضروری فرم را پر نکرده و خالی ارسال نماید. به این منظور شما اطلاعات دریافتی را ابتدا از نظر خالی بودن و یا حتی ارسال کاراکتر های غیر مجاز بررسی می نمایید.

از Form ها در بخش های مختلف وب سایت مانند ثبت نام، ورود، بخش نظرات و … استفاده می شود. در این پست نمونه فرم ساده ای از PHP را مورد بررسی قرار می دهیم که در حد امکان اعتبار سنجی شده است.

<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
      $nameErr = "Only letters and white space allowed";
    }
  }
  
  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "Invalid email format";
    }
  }
    
  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
    // check if URL address syntax is valid (this regular expression also allows dashes in the URL)
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
      $websiteErr = "Invalid URL";
    }
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
  Name: <input type="text" name="name" value="<?php echo $name;?>">
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>
  E-mail: <input type="text" name="email" value="<?php echo $email;?>">
  <span class="error">* <?php echo $emailErr;?></span>
  <br><br>
  Website: <input type="text" name="website" value="<?php echo $website;?>">
  <span class="error"><?php echo $websiteErr;?></span>
  <br><br>
  Comment: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
  <br><br>
  Gender:
  <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">Female
  <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">Male
  <input type="radio" name="gender" <?php if (isset($gender) && $gender=="other") echo "checked";?> value="other">Other  
  <span class="error">* <?php echo $genderErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Submit">  
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>

کد های html و PHP در یک صفحه قرار دارد و قسمت action به شکل زیر می باشد.

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

به دلیل قرار گرفتن کدهای PHP در خود صفحه، از SERVER[“PHP_SELF”] استفاده شده که به صفحه موجود اشاره می کند. و از htmlspecialchars نیز برای امنیت بیشتر فرم استفاده شده است. به این ترتیب که دستور فوق از وارد کردن دستورات javascript جلوگیری می کند.

نکات قابل توجه در این فرم

  • بررسی خالی بودن فیلد ها در حین ارسال با استفاده از فانکشن empty انجام می شود.
  • بررسی فرمت صحیح name و website بوسیله preg_match انجام می شود.
  • اعتبار سنجی ایمیل بوسیله FILTER_VALIDATE_EMAIL انجام شده است.

اگر قصد ذحیره اطلاعات دریافتی در پایگاه داده را دارید حتما به نکات امنیتی بیشتری باید توجه کنید.

دیدگاهتان را بنویسید