السلام عليكم
اخوان هذا الدرس هو كيف تشفر المتغيرات التي ترسلها من صفحة لاخرى
مثلا www.yoursite.com/index.php?key1=var1&key2=var2
الغرض هو تشفير key1=var1&key2=var2 كي لايتم التلاعب بها من قبل الهكرز والتاكد انها هي كما تم ارسالها من الصفحة الاولى المرسلة
استخدم في هذا المثال الملفات التالية :
1. Create_parameters.php
2. Crypt_HMAC.php
3. Sender.php
4. Receiver.php
5. Verify.php
اولا : الملف sender.php يحتوي الكود التالي :
<html><body> <FORM METHOD=POST ACTION="receiver.php"> <TABLE> <TR> <TD>first name :</TD> <TD><input type="text" name="first" value="name1"/></TD> </TR> <TR> <TD>second name :</TD> <TD><input type="text" name="name2" value="ahmed"/></TD> </TR> <TR> <TD>last name :</TD> <TD><input type="text" name="last" value="name3"/></TD> </TR> <TR><input type="submit" name="submit" value="send"/></tr> </TABLE> </FORM>
طيب سوف نرسل هذه المتغيرات الثلاث name1,name2,name3 الى صفحة receiver.php وتقوم هذه الصفحة بدورها باستخدام الوظيفة create_parameters الموجودة في الملف create_parameters.php
هذه الوظيفة create_parameters تستقبل مصفوفة المتغيرات وتعمل على تشفيرها باستخدام الفئة crypt_HMAC.php وتتم عملية التشفير بكلمة سر داخل الكود قيمتها في المتغير
define ('SECRET_KEY', 'Professional PHP 5 Programming Example’);وتعيد لك السلسة المشفرة , وكود الصفحة receiver.php هو :
<?php
require_once('create_parameters.php');
$par=create_parameters($_REQUEST);
echo '<a href=verify.php?' . $par . '>click here to see the
verification</a>';
?>عندما تضغط على اللنك سوف يحولك الى صفحة verify.php مع ارسال المتغيرات + السلسلة المشفرة كالتالي :
http://localhost/hash/verify.php?submit=send&first=name1&second=name2&last=name3&bblastvisit=1226697128&bblastactivity=0&bbuserid=1&bbpassword=220100e44bf672980b0f84a76b3ecbc7&bbsessionhash=0cba4027034a5cb48d26c1203f58b4f4&hash=0632aac2512b75fd166cc88aa25ffd31
لاحظ في هذا اللنك يحتوي على المتغيرات الثلاثة وايضا يحتوي على السلسة المشفرة
فالصفحة verify.php تقوم بفك السلسلة المشفرة باستخدام كلمة السر (التي ذكرتها سابقا) وتقوم بمقارنتها مع المتغيرات المدرجة في ال URL فاذا تطابقت فهذا يعني انه صحيحة واذا لم تتطابق فهذا يعني انه تم التلاعب بها , وكود verify.php هو :
<?php
require_once('Crypt_HMAC.php');
define ('SECRET_KEY', 'Professional PHP 5 Programming Example');
function verify_parameters($array)
{
$data = '';
$ret = array();
/* Store the hash in a separate variable and unset the hash from
* the array itself (as it was not used in constructing the hash
*/
$hash = $array['hash'];
unset ($array['hash']);
/* Construct the string with our key/value pairs */
foreach ($array as $key => $value) {
$data .= $key . $value;
$ret[] = "$key=$value";
}
$h = new Crypt_HMAC(SECRET_KEY, 'md5');
if ($hash != $h->hash($data)) {
return FALSE;
} else {
return TRUE;
}
}
if (!verify_parameters($_REQUEST)) {
die("Dweep! Somebody tampered with our parameters.\n");
} else {
echo "Good guys, they didn't touch our stuff!!";
}
?>وكود الفئة crypt_HMAC :
<?php class Crypt_HMAC {
/**
* Constructor
* Pass method as first parameter
*
* @param string method - Hash function used for the calculation
* @return void
* @access public
**/
function Crypt_HMAC($key, $method = 'md5')
{
if (!in_array($method, array('sha1', 'md5'))) {
die("Unsupported hash function '$method'.");
}
$this->_func = $method;
/* Pad the key as the RFC wishes (step 1) */
if (strlen($key) > 64) {
$key = pack('H32', $method($key));
}
if (strlen($key) < 64) {
$key = str_pad($key, 64, chr(0));
}
/* Calculate the padded keys and save them (step 2 & 3) */
$this->_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36),64);
$this->_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C),64);
}
/**
* Hashing function
*
* @param string data - string that will hashed (step 4)
* @return string
* @access public
*/
function hash($data)
{
$func = $this->_func;
$inner = pack('H32', $func($this->_ipad . $data));
$digest = $func($this->_opad . $inner);
return $digest;
}
}
?>وكود create_parameters.php :
<?php
require_once('Crypt_HMAC.php');
/* The RFC recommends a key size larger than the output hash
* for the hash function you use (16 for md5() and 20 for sha1()). */
define ('SECRET_KEY', 'Professional PHP 5 Programming Example');
function create_parameters($array)
{
$data = '';
$ret = array();
/* Construct the string with our key/value pairs */
foreach ($array as $key => $value) {
$data .= $key . $value;
$ret[] = "$key=$value";
}
$h = new Crypt_HMAC(SECRET_KEY, 'md5');
$hash = $h->hash($data);
$ret[] = "hash=$hash";
return join ('&', $ret);
}
?>طبعا انا لم اتعمق في شرح هذه الفئات بالتفصيل لانه فيها دوال للتشفير وكلام كثير لكن يمكنكم استخدام هذه الملفات بصورة جاهزة وانا بالحقيقة جديد في هذه اللغة وتعلمت هذا الدرس من كتاب انكليزي واردت ان تعم الفائدة للجميع ويترسخ في ذهني ومن الله التوفيق

