الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تشفير المتغيرات المرسلة في ال Url

بدأه ihsan_ahmed في 16 نوفمبر 2008 · 4 رد · 2,232 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اخوان هذا الدرس هو كيف تشفر المتغيرات التي ترسلها من صفحة لاخرى

مثلا 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);
}
?>

طبعا انا لم اتعمق في شرح هذه الفئات بالتفصيل لانه فيها دوال للتشفير وكلام كثير لكن يمكنكم استخدام هذه الملفات بصورة جاهزة وانا بالحقيقة جديد في هذه اللغة وتعلمت هذا الدرس من كتاب انكليزي واردت ان تعم الفائدة للجميع ويترسخ في ذهني ومن الله التوفيق

#2

موضوع ممتاز اخي مجهود تشكر عليه . ولي تعقيب ..

اولاً الطريقة بشكل عام , ممكن التلاعب بها ببساطه وذلك من خلال التعديل في القيم المرسله , ومن ثم حساب الـ MD5 للقيم من جديد ومن ثم حقن الـ URI بالقيم المعدله و الـhash الخاص بها , وبذلك سوف يتم عكس التشفير , وسيتطابق ..

الذي لاحظته انه يوجد تشفير لقيم اخرى عند الارسال الى الصفحه verify.php وهي :

bblastvisit=1226697128&bblastactivity=0&bbuserid=1&bbpassword=220100e44bf672980b0f84a76b3ecbc7&bbsessionhash=0cba4027034a5cb48d26c1203f58b4f4

ولايوجد في الاكواد المرفقه ما يقوم بهذه العمليه , اعتقد انه يوجد شئ ناقص ! ..

تم تعديل هذه المشاركة بواسطة محمد معاشر في 17 نوفمبر 2008 في 11:10

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#3

نعم هناك خطا بالكود انا اسف وتصحيح للموضوع :

اولا : في ملف ال sender.php حول طريقة ال post الى get

ثانيا : في ملف ال receiver.php حول كلمة $_REQUEST الى $_GET فتكون الجملة كالتالي :

  1. $par=create_parameters($_GET);
  2.  

ثالثا : في ملف ال verify.php حول السطر التالي :

  1. if (!verify_parameters($_REQUEST)) {
  2.  

الى

  1. if (!verify_parameters($_GET)) {
  2.  

يعني التعديل هو كل كل طرق ارسال واستقبال المتغيرات اجعلها get واعذرني عالتقصير

#4

مشكور أخوي على الفن الرائع الذي قمت به

ولكن الكود طويل جدا :( وأنا أكره كثرة الصفحات الكثيره في الكود

هل يمكن عمل كل هذا في صفحة واحده وبشكل مصغر يعني تحويلها إلى فانكتشين أو كلاس مع أني لا أعرف ولا أحب التعامل مع الكلاسات داخل البي أتش بي فقط :)

شكرا لك وإذا قمت بأي تجربه سوف أرفقها

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#5

السلام عليكــم ورحمـة الله وبركاتــه

شكرا لك كثيرا على الجهد المبذول في نشر ما تعلمته , وبارك الله فيك وكثرمن امثالك من فاعلي الخير

اخي العزيز سررت كثيرا بتعلم ماطرحته , وسأقوم بتجربته عندي وبعدها سيكون لي عودة قريبة

والسلام عليكم

مواضيع مشابهة