PDA

View Full Version : نحوه افزایش امنیت اطلاعات-جلوگیری از ارسال مقادیر از جایی به فایل php



alirayaneh
جمعه 13 آذر 1388, 23:57 عصر
نحوه افزایش امنیت اطلاعات در یه فایل php

یخورده هدفم رو بیشتر تشریح میکنم تا دوستان بهتر منو راهنمایی کنند
ما یه صفحه داریم a.php که یه سری متغیر های رو به یه صفحه دیگه توی یه سرور دیگهb.php میفرسته بعد صفحه دوم b.php که روی سرور دوم قرار داره پس از برسی این متغیرها پاسخ رو به صفحه سوم c.php روی سرور اول میفرسته و صفحه c.php پاسخ دریافتی که شامل مقادیر چند متغیر هست رو به همراه اطلاعاتی که از کاربر در همین صفحه از طریق یک فرم دریافت میکنه رو روی دیتا بیس ذخیره میکنه
قصد ما اینه که این اطلاعات قابل مشاهده نباشند و اینکه کاربر نتونه این اطلاعات رو بخونه و یا اینکه اگه احیانا تونست بخونه نتونه اون اطلاعات رو خودش از طریق سیستم (هر صفحه دیگر در هر سرور دیگر ) دیگری برای صفحه سوم ما c.php که روی سرور اول قرار دار ه ارسال کنه
خوب حال چه را ههایی برای اینکار وحفظ امنیت وجود داره
لطفا راهنمایی کنید

امیـرحسین
شنبه 14 آذر 1388, 03:11 صبح
راه اول اینه که اطلاعات رو با POST منتقل کنید که تا حدودی امنه ولی نه برای کاربر حرفه ای.
راه دوم اینه که اطلاعات رو بصورت فایل ذخیره کنید و در آخر فایل رو حذف کنید. اینجوری نام و آدرس فایل رو فقط برنامه نویس میدونه و کسی بهش دسترسی نداره. نام فایل رو می تونید بصورت کد منتقل کنید.
راه سوم اینه که اطلاعات رو توی دیتابیس سرور اول (یا هر سرور دیگه ای) ذخیره کنید و از هر سرور خارجی بصورت ریموت به دیتابیس متصل شید که مثل روش بالاست ولی ساده تر.
و کلی روش ابتکاری دیگه....

joker
شنبه 14 آذر 1388, 07:05 صبح
اگه اطلاعات بین دوتا سرور اینترنتی قراره رد و بدل بشه دیگه کاربر دسترسی اسنیف کردن چیزی غیر از اونی که خودش به سرور اول یکبار فرستاده را نداره. پس مشکلی هم نیست :)
اما اگه سرور ها در دسترس کاربر هست ، میتونید اطلاعات رد و بدل شده را رمزشده بفرستید ، البته تا موقعی که کاربر به خود فایلهای php دسترسی نداشته باشه :)

یا اینکه اگه احیانا تونست بخونه نتونه اون اطلاعات رو خودش از طریق سیستم (هر صفحه دیگر در هر سرور دیگر ) دیگری برای صفحه سوم ما c.php که روی سرور اول قرار دار ه ارسال کنه
با استفاده از ریفرها میتونید چک کنید اطلاعات از کجا داره میاد ، اگه جایی غیر از سرور a بود دیتا جعلیه و .....

alirayaneh
پنج شنبه 19 آذر 1388, 17:09 عصر
اگه اطلاعات بین دوتا سرور اینترنتی قراره رد و بدل بشه دیگه کاربر دسترسی اسنیف کردن چیزی غیر از اونی که خودش به سرور اول یکبار فرستاده را نداره. پس مشکلی هم نیست :)
اما اگه سرور ها در دسترس کاربر هست ، میتونید اطلاعات رد و بدل شده را رمزشده بفرستید ، البته تا موقعی که کاربر به خود فایلهای php دسترسی نداشته باشه :)

با استفاده از ریفرها میتونید چک کنید اطلاعات از کجا داره میاد ، اگه جایی غیر از سرور a بود دیتا جعلیه و .....

سلام ضمن تشکر از پاسختون بله دقیقا منم دنبال این مورد هستم میشه کدی رو که قرار میدم همون C.php رو با همین ریفر که اشاره کردید مجهزش کنید
چون من به فایل دوم B.php همون صفحه پردازش دسترسی ندارم کار زیادی نمیتونم بکنم ضمن این که در هنگام ارسال اطلاعات از b.php به c.php کلیه اطلاعات ارسالی در سورس b.php به صورت کد html مشهود است و کاربر توان کپی و ارسال اطلاعات مشابه را از صفحاتی که خود ساخته دارد

yasgig
پنج شنبه 19 آذر 1388, 17:34 عصر
ï»؟<style type="text/css">
<!--
.style1 {font-family: Tahoma}
.style2 {
font-family: Tahoma;
font-size: 12px;
color: #FFFFFF;
}
.style3 {color: #0000FF}
.style4 {color: #0033FF}
.style5 {color: #3366FF}
.style6 {color: #000000}
.style7 {color: #666666}
body {
background-image: url(/form/bg2.png);
background-color: #383838;
}
-->
</style>
<head>
<link rel="stylesheet" href="kha.css" type="text/css"/>
</head>
<p>&nbsp;</p>
<p></p>
<p align="center">
<p align="center">
<form name="form1" method="get" action="/form">

<table width="403" height="84" border="1" align="center" bordercolor="#999999" bgcolor="#FFFFCC">
<tr bgcolor="#FFFF33">
<td height="28"><div align="center"><font color='#0000FF' style='font-family:tahoma; font-size:12px; font-weight:bold'>ظˆط¶ط¹غŒطھ </font></div></td>
</tr>
<tr bgcolor="#666666">
<td><div align="center">
<div align="center">
<?php

require_once("db.php");

$name=$HTTP_POST_VARS['fname'];
$famil=$HTTP_POST_VARS['surname'];
$phone=$HTTP_POST_VARS['phone'];
$email=$HTTP_POST_VARS['email'];
if($_SERVER['HTTP_REFERER']!="آدرس ارسال اطلاعات")
{
echo ('error');
}else{
$insertSQLEpay = "INSERT INTO epay(name,famil,phone,email) VALUES('$name','$famil','$phone','$email')";
$rsd = mysql_query($insertSQLEpay,$conn);
}
?>
</div></td>
</tr>
</table>
<p></p>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">
<input type="submit" value="ط§ط¯ط§ظ…ظ‡..." name="B12" />
</p>
<p align="center">&nbsp; </p>

alirayaneh
جمعه 20 آذر 1388, 16:27 عصر
تشکر از این که پاسخ دادید
من هنگام استفاده از این کد متوجه شدم که حتی وقتی که از آدرسی که ما اون مجاز تعریف کردیم اطلاعات ارسال میشه دوباره پیغام ارور میده
لطفا برسی کنید

yasgig
جمعه 20 آذر 1388, 17:05 عصر
من امتحان کردم و به خوبی کار کرد.شما باید آدرس ریفرر را به صورت زیر وارد کنید:

http://www.yourdomain.com/pagename.php
نه به صورت زیر:

pagename.php
من که اجرا کردم مشکلی پیش نیومد.
موفق باشید!

alirayaneh
جمعه 20 آذر 1388, 22:53 عصر
خوب ببینید شاید از لحاظ امنیتی کمی باید مساله رو بسته نگهدارم ولی به مقدار که قابل درک تر باشه مسئله رو بار دیگر بیان میکنم

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

phoenixhunter
شنبه 21 آذر 1388, 11:37 صبح
اگه خیلی مهمه از sslاستفاده کن تا از اسنیف جلوگیری بشه

alirayaneh
یک شنبه 06 دی 1388, 19:21 عصر
تشکر از این که پاسخ دادید
من هنگام استفاده از این کد متوجه شدم که حتی وقتی که از آدرسی که ما اون مجاز تعریف کردیم اطلاعات ارسال میشه دوباره پیغام ارور میده
لطفا برسی کنید

الان فکر میکنم دلیلشو متوجه شدم که چرا دستور
if($_SERVER['HTTP_REFERER']!="آدرس ارسال اطلاعات")
{
echo ('error');
}else
echo ('ok');
}


برای من کار نمیکنه احتمالا بخاطر اینه که سرور ارسال کننده از ssl استفاده میکنه و در یو آر الش بجای http:// عبارت https:// وجود داره
و بطور کلی از یه آدرس شبیه آدرس زیر ارسال میشه
https://secretinfo .house.com/controller

شاید به این خاطره که وقتی در url عبارت https : وجود داشته باشه دیگه تابع $_SERVER['HTTP_REFERER کار نمیکنه و url رو ریفیر نمیکنه آخه وقتی من مقدار این تابع رو چاپ کردم ، در هنگامی که از آدرس مذکور که https داره مقادیر ارسال میشد تابع ریفیر مقداری نداشت و لی وقتی خودم از یه آدرس دیگه مقادیر رو ارسال میکردم مقدار تابع ریفیر چاپ میشد
آیا راهی برای ریفیر کردن آدرس مورد نظر وجود داره ؟

alirayaneh
سه شنبه 08 دی 1388, 23:30 عصر
دوستان لطفا راهنمایی کنید

he3117
پنج شنبه 10 دی 1388, 09:44 صبح
می تونید آی پی سایتی که اطلاعات را ارسال کرده چک کنید یا به نحوی یک شماره ارجاع هم در پارامترها دریافت کنید تا معلوم بشه درخواست واقعی هست یا نه یا اگر امکانش باشه از وب سرویس استفاده کنید مثلا SOAP

alirayaneh
پنج شنبه 10 دی 1388, 13:01 عصر
تشکر میکنم که پاسخ دادید بله روش چک کردن آی پی روش خوبیه...خوب کدی که آی پی سرور ارجاع دهنده رو نمایش میده رو میشه زحمتشو بکشید چون بنده آشنایی کمی با php دارم ..
ولی در مورد روش دریافت شماره ارجاع در پارامتر ها و همچنین سرویس soap میشه یخورده بیشتر توضیح بدین و اینکه اگه نیازه کدی رو معرفی کنید

he3117
پنج شنبه 10 دی 1388, 14:08 عصر
برای یافتن آی پی لینک زیر را مطالعه کنید
http://php.net/manual/en/reserved.variables.server.php

برای چک کردن شناسه وقتی صفحه اول درخواست را به صفحه b می ده یه id باید بسازه که منحصر به فرد باشه مثلا می تونه md5 شماره ریکورد باشه و اون را در بانک ذخیره کنه و اون آی دی را همراه با اطلاعات به صفحه b می ده وقتی اطلاعات پردازش شد صفحه b اطلاعات را با همان id به صفحه c می فرسته.شما باید در صفخه c ای دی را چک کنید بیبنید در بانک اطلاعاتی شما ثبت شده یا نه.اگر ثبت شده یعنی درخواست را خودتون فرستادید و معتبر هست و اگر نبود یعنی معتبر نیست.فقط باید طوری برنامه بنویسید که آی دی ها یکتا باشن و بعد از اعتبار سنجی حذفشون کنید تا از یه آی دی دوبار استفاده نشه

مباحث soap هم یکم پیچیده هست و برای تازه کارها توصیه نمی شود

jirjirakk
جمعه 11 دی 1388, 10:40 صبح
از کلیدهای رمز کننده در سرور های اول و دوم خودتون می تونید استفاده کنید.
فکر می کنم نمونه بانک های سامان و پارسیان و پاسارگاد و ملی و ... نمونه اجرا شده خوبی برای تحقیقاتون باشه (سرویس اون ها همانند سرویس ای هست که شما قصد راه اندازی اش رو دارین)، مشتری از صفحه آ شما هدایت می شه به صفحه بانک (صفحه ب) و بانک هدابت می شه به صفحه چ در سایت شما.

!) البته این سرویس ها هم گاها به علت سهل انگاری برنامه نویسان سمت مشتری با مشکلات امنیت ای زیادی مواجه هستش.

jirjirakk
جمعه 11 دی 1388, 10:54 صبح
در جواب دوستان که چک کردن "آی پی" رو پیشنهاد داده بودن :
با توجه به سورس هایی که در صفحه اول هست بازدید کننده ای از سایت ایشون بازدید می کنه و بعد به صفحه ای در سرور دیگر هدایت میشه و مجدد بعد از انجام عملیاتی در آن صفحه به صفحه دیگری در سایت خودشون هدایت می شن.
توی این روش ادرس "ای پی" بیننده سایت توسط کد فوق برگشت داده میشه.

حالا اگر این درخواست ها رو خود سرور ها با هم مبادله می کنن چک کردن "ای پی" می تونه یکی از راه های نسبتا امن باشه که به تنهایی کافی نیست.

alirayaneh
یک شنبه 13 دی 1388, 23:48 عصر
برای یافتن آی پی لینک زیر را مطالعه کنید
http://php.net/manual/en/reserved.variables.server.php

برای چک کردن شناسه وقتی صفحه اول درخواست را به صفحه b می ده یه id باید بسازه که منحصر به فرد باشه مثلا می تونه md5 شماره ریکورد باشه و اون را در بانک ذخیره کنه و اون آی دی را همراه با اطلاعات به صفحه b می ده وقتی اطلاعات پردازش شد صفحه b اطلاعات را با همان id به صفحه c می فرسته.شما باید در صفخه c ای دی را چک کنید بیبنید در بانک اطلاعاتی شما ثبت شده یا نه.اگر ثبت شده یعنی درخواست را خودتون فرستادید و معتبر هست و اگر نبود یعنی معتبر نیست.فقط باید طوری برنامه بنویسید که آی دی ها یکتا باشن و بعد از اعتبار سنجی حذفشون کنید تا از یه آی دی دوبار استفاده نشه

مباحث soap هم یکم پیچیده هست و برای تازه کارها توصیه نمی شود

با تشکر از شما بخاطر معرفی این مطلب

ولی متاسفانه بنده تابعی رو که آی پی سرور ارجاع دهنده به صفحه ما رو نمایش میده پیدا نکردم ....

و نیز از دوستان بخاطر راهنمای در این خصوص تشکر میکنم
الان که برسی میکردم بله ..فکر میکنم مثال بانک مثال خوبی باشه ... چون این سرور هم
توسط ssl محافظت میشه
فکر میکنم چک کردن آی پی از قرائت کد هش ساده تر و امن تر باشه چرا که فکر میکنم نشه با هیچ حقه ای جز نفوذ به سرور دوم (که تا الان غیر ممکن بوده) به کار بست ....
در هر صورت اگه راهی برای این کار پیدا نشه مجبور میشیم یه راه دیگه (شاید قرائت کد هش ) پیدا کنیم

alirayaneh
پنج شنبه 17 دی 1388, 20:09 عصر
دوستان کسی تابع مربوط به برگرداندن آی پی سایت ارجاع دهنده رو نمیشناسه؟

digitak
پنج شنبه 17 دی 1388, 21:42 عصر
توی ارجاع دهنده ip رو بگیر بریز تو یه session بعد تو این صفحه چک کند اگه برابر بود که همونه !

alirayaneh
پنج شنبه 17 دی 1388, 23:15 عصر
توی ارجاع دهنده ip رو بگیر بریز تو یه session بعد تو این صفحه چک کند اگه برابر بود که همونه !

بله من هم قصد دارم با استفاده از این شیوه جلوی نفوذ رو بگیرم
ولی کدی رو که در php آی پی سایت ارجاع دهنده به صفحه ما رو نشون میده ندارم کسی این کد رو داره

alirayaneh
یک شنبه 20 دی 1388, 18:53 عصر
سلام کسی نیست این کد ها رو داشته باشه ..