Rabu, 20 November 2013

Pengesahan Data Yang Dihantar Dari PHP Form

--
--
Pengesahan Data Yang Dihantar Dari PHP Form
Bab ini menunjukkan bagaimana untuk menggunakan PHP untuk mengesahkan PHP Form Data.
PHP Form Data
Fikirkan KESELAMATAN apabila memproses PHP Form!
Pengesahan data yang betul adalah penting untuk melindungi Form anda daripada penggodam dan spam!
HTML Form biasanya mengandungi pelbagai jenis input fieldtext field, radio button, check box dan  submit button:
Kaedah-kaedah pengesahan untuk borang di atas adalah seperti berikut:
Field
Validation Rules
Name
Required. + Must only contain letters and whitespace
E-mail
Required. + Must contain a valid email address (with @ and .)
Website
Optional. If present, it must contain a valid URL
Comment
Optional. Multi-line input field (textarea)
Gender
Required. Must select one
Mula-mula kita akan melihat kod kebiasaan HTML Form:
Text Field
Nama, e-mel, dan alamat laman web menggunakan text input, dan komen menggunakan textarea. Maka kod HTML kelihatan seperti ini:
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>
Radio Button
Jantina memerlukan radio button dan kod HTML kelihatan seperti ini:
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
Form Elements
Kod tanda mula bagi tag HTML Form seperti berikut:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Apabila Form dihantar, data dihantar dengan kaedah "post".
Apakah maksud  $ _SERVER ["PHP_SELF"] variable?

The $_SERVER ["PHP_SELF"] di dalam sesebuah 
file PHP adalah merujuk kepada dirinya sendiri. Cth: $_SERVER ["PHP_SELF"] untuk sendForm.php adalah sendForm.php.
Apakah maksud htmlspecialchars ()?
htmlspecialchars() function berperanan untuk menukarkan aksara khas kepada entiti HTML. Ini bermakna bahawa ia akan menggantikan HTML Character seperti “<” dan “>” dengan  &lt; dan &gt;. Ini menghalang penyerang daripada mengeksploitasi kod dengan menyuntik HTML atau Javascript kod (Serangan Cross-Site Scripting) dalam Form.
Nota Penting tentang $ _SERVER ["PHP_SELF"]
$_SERVER ["PHP_SELF"] boleh digunakan oleh penggodam dengan cara memasukkan palang (/) diikuti kod Cross Site Scripting (XSS).
Cross-site scripting (XSS) adalah sejenis ancaman keselamatan komputer biasanya ditemui dalam aplikasi Web. XSS membolehkan penyerang untuk menyuntik skrip pihak klien ke dalam laman web yang dilihat oleh pengguna lain.
Andaikan kita mempunyai Form berikut dalam halaman yang dinamakan "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Sekarang, jika pengguna memasukkan URL biasa dalam bar alamat seperti "http://www.example.com/test_form.php", kod di atas akan diterjemahkan kepada:
<form method="post" action="test_form.php">
Setakat ini, begitu baik.
Walau bagaimanapun, andaikan bahawa pengguna memasukkan URL berikut dalam bar alamat:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
Dalam kes ini, kod di atas akan diterjemahkan kepada:
<form method="post" action="test_form.php"/><script>alert('hacked')</script>
Kod ini menambah tag skrip dan arahan alert. Dan apabila halaman dipaparkan, kod JavaScript akan dilaksanakan (pengguna akan melihat kotak amaran). Ini adalah hanya satu contoh yang mudah dan tidak merbahaya bagaimana variable PHP_SELF boleh dieksploitasi.
Berhati-hati bahawa mana-mana kod JavaScript boleh ditambah di dalam tag di atas! Hacker boleh mengarahkan pengguna untuk membuka file di server yang lain, dan file tersebut mungkin mengandungi kod berbahaya yang boleh mengubah global variable atau menghantar Form kepada alamat yang lain untuk dieksploitasi.
Bagaimana Untuk Elakkan $ _SERVER ["PHP_SELF"] dieksploitasi?
Hal ini boleh dielakkan dengan menggunakan htmlspecialchars() function.
Kod Form harus kelihatan seperti ini:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() function menukarkan aksara khas kepada entiti HTML. Sekarang jika pengguna cuba untuk mengeksploitasi pembolehubah PHP_SELF, ia akan menghasilkan output berikut:
<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">
Usaha mengeksploitasi gagal, dan tidak membahayakan dilakukan!
Mengesahkan Form Data Dengan PHP
Perkara pertama yang kita akan lakukan adalah untuk lulus semua pembolehubah melalui htmlspecialchars() function.
Apabila kita menggunakan htmlspecialchars() function, maka jika pengguna cuba untuk menghantar input berikut ke dalam text field:
<script> location.href ('http://www.hacked.com') </ script>
- Ini tidak akan dilaksanakan, kerana ia akan disimpan sebagai HTML codes, seperti ini:
&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt; 
Kod ini adalah kini selamat untuk dipaparkan di halaman atau di dalam e-mel.
Kami juga akan melakukan dua perkara yang lebih apabila pengguna mengemukakan borang:
  1. Buang characters yang tidak diperlukan (space, tab, newline) daripada input data pengguna (dengan trim() function).
  2. Buang backslashes (\) daripada data input pengguna (dengan stripslashes() function).
Langkah seterusnya adalah untuk mewujudkan satu function yang akan melakukan semua pemeriksaan untuk kita (yang lebih mudah daripada menulis kod yang sama berulang-ulang kali).
Sebagai contoh, namakan test_input () function.
Sekarang, kita boleh memeriksa setiap pembolehubah $ _POST dengan test_input () function, dan skrip kelihatan seperti ini:
Contoh
<?php
// define variables and set to empty values
$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;
}
?>
Perhatikan bahawa pada permulaan skrip, kita memeriksa sama ada Form telah dihantar dengan menggunakan $ _SERVER ["REQUEST_METHOD"]. Jika REQUEST_METHOD adalah POST, maka Form itu telah dihantar - dan ia perlu disahkan. Jika ia belum dihantar, langkau pengesahan dan paparkan Form kosong.
Walau bagaimanapun, dalam contoh di atas, semua input fields adalah pilihan. Skrip berfungsi dengan baik walaupun pengguna tidak memasukkan apa-apa data.
Langkah seterusnya adalah untuk membuat input field yang diperlukan dan membuat error message jika diperlukan.
--

--

Tiada ulasan:

Catat Ulasan