siavashsay
شنبه 14 بهمن 1391, 01:11 صبح
دوستان میدونم این تاپیک شاید برای بعضی ها تکرار باشه اما برای خیلی ها هم نه !
توی این تاپیک قصد دارم به صورت خیلی ساده ایجاد TOKEN KEY رو آموزش بدم !
--
موارد استفاده :
- جلوگیری از حملات CSRF
- جلوگیری از ارسال مجدد مقادیر POST در زمان Refresh صفحه !
و ...
---
نحوه استفاده :
===
در ابتدا یک فرم خیلی ساده رو براتون میذارم که یک فیلد داره و بعد از Submit مقدار اون فیلد چاپ میشه !
<?php
session_start();
if(isset($_POST['submit'],$_POST['text'],$_SESSION['token_key'],$_POST['token_key'])
&& $_SESSION['token_key']==$_POST['token_key'])
{
echo $_POST['text'];
}
$token_key=md5(time());
$_SESSION['token_key']=$token_key;
?>
<form id="form1" name="form1" method="post" action="">
<p>
<label for="text"></label>
<input type="text" name="text" id="text" />
</p>
<p>
<input type="submit" name="submit" id="submit" value="Submit" />
<input name="token_key" type="hidden" id="token_key" value="<?php echo $token_key;?>" />
</p>
</form>
خوب !
در ابتدا قبل از توضیح بهتره که یک بار فرم رو اجرا - فیلد رو پر کنید و submit رو بزنید!
میبینید که مقدار فیلد چاپ میشه !
حالا صفحه رو Refresh کنید !
میبینید که دیگه خبری از چاپ شدن فیلد نیست !
====
توضیح :
====
در ابتدا ما باید برای فرم مورد نظر یک Hidden Field درست کنیم و مقدار اون رو token_key ( البته اختیاری هست ) بگذاریم !
بعد باید یک کد رندم درست کنیم که مقدار اون رو در token_key بریزیم !
$token_key=md5(time());
البته بنده اینجا از یک md5 ساده استفاده کردم ! اما شما میتونید یک کد پیچیده تر هم درست کنید که حدس زدن اون سخت باشه !
این کد رندم با اجرای هربار صفحه تولید میشه !
دقت کنید که تولید کد رندم و مقدار دهی اون رو در آخرین خط کد php خودتون بنویسید ! نه در داخل if و یا هر چیز دیگه ای !
حالا باید در موقع submit شدن فرم این مقدار رو چک کنیم که ببینیم درست هست یا نه !
اما موضوع اینجاست که چطوری و با چی اون رو چک کنیم ؟!
اینجاس که میگیم با مقدار یک متغیر SESSION
$_SESSION['token_key']
بله !
در ابتدا ما 2 تا متغیر درست میکنیم !
1- یک متغیر POST که همون Hidden Field هست
2- یک متغیر SESSION
و بعد مقدار کد رندم رو توی اونها میریزیم !
دلیل ایجاد این 2 تا هم اینه که Session ها در موقع تولید باقی میمونن تا زمانی که شما اونها رو از بین ببرید یا مقدار جدیدی بهشون بدید ! برای همین در اینجا در زمان اجرای صفحه ما مقدار Session رو مجدد عوض میکنیم و در هنگام Refresh مجدد صفحه مقدار اون Session عوض شده اما مقدار اون Hidden Field که درست کردیم نه !
مقدار اون Hidden Field موقعی عوض میشه که کاربر به صورت دستی فرم رو Submit کرده باشه نه اینکه صفحه رو Refresh کنه !
علت اینکه صفحه در زمان Submit خروجی داره اما در زمان Refresh نه همین هست !
چون در زمان Submit صفحه مقادیر Session و Hidden Field رو یکسان میکنه اما در زمان Refresh مقدار Session عوض میشه اما مقدار Hidden Filed خیر !
برای همین در زمان Submit فرم چک میکنیم که اگر این 2 تا برابر بودند عملیات اجرا و در غیر اینصورت خطا :)
در این کد :
if(isset($_POST['submit'],$_POST['text'],$_SESSION['token_key'],$_POST['token_key'])
&& $_SESSION['token_key']==$_POST['token_key'])
{
خیلی طولانی شد اما خواستم توضیحی بدم که دوستان متوجه بشن !
چون خودم سر این موضوع خیلی دردسر کشیدم!
امیدوارم موثر بوده باشه !
موفق باشید
توی این تاپیک قصد دارم به صورت خیلی ساده ایجاد TOKEN KEY رو آموزش بدم !
--
موارد استفاده :
- جلوگیری از حملات CSRF
- جلوگیری از ارسال مجدد مقادیر POST در زمان Refresh صفحه !
و ...
---
نحوه استفاده :
===
در ابتدا یک فرم خیلی ساده رو براتون میذارم که یک فیلد داره و بعد از Submit مقدار اون فیلد چاپ میشه !
<?php
session_start();
if(isset($_POST['submit'],$_POST['text'],$_SESSION['token_key'],$_POST['token_key'])
&& $_SESSION['token_key']==$_POST['token_key'])
{
echo $_POST['text'];
}
$token_key=md5(time());
$_SESSION['token_key']=$token_key;
?>
<form id="form1" name="form1" method="post" action="">
<p>
<label for="text"></label>
<input type="text" name="text" id="text" />
</p>
<p>
<input type="submit" name="submit" id="submit" value="Submit" />
<input name="token_key" type="hidden" id="token_key" value="<?php echo $token_key;?>" />
</p>
</form>
خوب !
در ابتدا قبل از توضیح بهتره که یک بار فرم رو اجرا - فیلد رو پر کنید و submit رو بزنید!
میبینید که مقدار فیلد چاپ میشه !
حالا صفحه رو Refresh کنید !
میبینید که دیگه خبری از چاپ شدن فیلد نیست !
====
توضیح :
====
در ابتدا ما باید برای فرم مورد نظر یک Hidden Field درست کنیم و مقدار اون رو token_key ( البته اختیاری هست ) بگذاریم !
بعد باید یک کد رندم درست کنیم که مقدار اون رو در token_key بریزیم !
$token_key=md5(time());
البته بنده اینجا از یک md5 ساده استفاده کردم ! اما شما میتونید یک کد پیچیده تر هم درست کنید که حدس زدن اون سخت باشه !
این کد رندم با اجرای هربار صفحه تولید میشه !
دقت کنید که تولید کد رندم و مقدار دهی اون رو در آخرین خط کد php خودتون بنویسید ! نه در داخل if و یا هر چیز دیگه ای !
حالا باید در موقع submit شدن فرم این مقدار رو چک کنیم که ببینیم درست هست یا نه !
اما موضوع اینجاست که چطوری و با چی اون رو چک کنیم ؟!
اینجاس که میگیم با مقدار یک متغیر SESSION
$_SESSION['token_key']
بله !
در ابتدا ما 2 تا متغیر درست میکنیم !
1- یک متغیر POST که همون Hidden Field هست
2- یک متغیر SESSION
و بعد مقدار کد رندم رو توی اونها میریزیم !
دلیل ایجاد این 2 تا هم اینه که Session ها در موقع تولید باقی میمونن تا زمانی که شما اونها رو از بین ببرید یا مقدار جدیدی بهشون بدید ! برای همین در اینجا در زمان اجرای صفحه ما مقدار Session رو مجدد عوض میکنیم و در هنگام Refresh مجدد صفحه مقدار اون Session عوض شده اما مقدار اون Hidden Field که درست کردیم نه !
مقدار اون Hidden Field موقعی عوض میشه که کاربر به صورت دستی فرم رو Submit کرده باشه نه اینکه صفحه رو Refresh کنه !
علت اینکه صفحه در زمان Submit خروجی داره اما در زمان Refresh نه همین هست !
چون در زمان Submit صفحه مقادیر Session و Hidden Field رو یکسان میکنه اما در زمان Refresh مقدار Session عوض میشه اما مقدار Hidden Filed خیر !
برای همین در زمان Submit فرم چک میکنیم که اگر این 2 تا برابر بودند عملیات اجرا و در غیر اینصورت خطا :)
در این کد :
if(isset($_POST['submit'],$_POST['text'],$_SESSION['token_key'],$_POST['token_key'])
&& $_SESSION['token_key']==$_POST['token_key'])
{
خیلی طولانی شد اما خواستم توضیحی بدم که دوستان متوجه بشن !
چون خودم سر این موضوع خیلی دردسر کشیدم!
امیدوارم موثر بوده باشه !
موفق باشید