سلام
از دوستان ميخوام دو تا كتاب خوب براي افزايش امنيت سايت بهم معرفي كنند.
يه كتاب كه براي امنيت در php باشه. سختم توضح نده . يه چيزي كه ادم حاليش بشه.
متشكرم.
سلام
از دوستان ميخوام دو تا كتاب خوب براي افزايش امنيت سايت بهم معرفي كنند.
يه كتاب كه براي امنيت در php باشه. سختم توضح نده . يه چيزي كه ادم حاليش بشه.
متشكرم.
سلام
هر چه بیشتر به سایت های خارجی رجوع کنی بهترس
یه تشکر کن از عدد 666 بیای بیرون
اگه حوصله خوندن e-Bookهاي لاتين رو دارين، از سايت flazx.com اينها رو دانلود كنيد:
Pro PHP Security
Securing PHP Web Applications
Wiley Secure PHP Development
Essential PHP Security
اگر هم كتاب فارسي ميخواين، كتاب امنيت در PHP نوشته آقاي اميرحسين استخريان منبع خيلي خوبي هست.
موفق باشيد.
مقالات امنیت PHP
estakhrian.blogfa.com
این سایتو حتما ببین
http://phpsec.org
من ميخواستم يه نكته اي رو عرض كنم.
جديدا سايت من هك شده . با اينكه من رمزم رو با md5 رمزگذاري كردم با اين حال طرف تونسته سايت منو هك كنه. درسته كه نتونسته به كنترل پنلش وارد بشه ولي يه صفحه داخل كنترل پنلم ايجاد كرده . با يه پيام.
خب وقتي هكر به اين راحتي تونسته اين كار رو بكنه ديگه نيازي به رمز هم نداره. بايد اينطور مواقع چيكار كرد؟
دنبال کتاب آقای امیرحسین استخریان بگرد.
من چند سال پیش از اینترنت خریدم . نمی دونم الآن داشته باشن یا نه . ولی بچرخ . جلدش آبیه
کتاب ها به کنار
ببین کجا ها بدون دسترسی بودن
ببین جایی فرم آپلود داشتی و قرار بوده فقط برای خودت باشه
ببین ورودی و خروجی های سایت رو چک کردی
همچنین ببیین بر اساس حملات مختلف فایل هات مقاوم هستن یا نه
اینم لینکش https://barnamenevis.org/showthread.p...A-%D9%88%D8%A8
حالا بگو چه پیغامی گذاشته؟؟
دوست عزیز اینطور که من فهمیدم شما بخاطر مشکلات جدی در طراحی هک شدین. مثلاً Escapeنکردن اطلاعاتی که قراره روی دیتابیس اعمال بشن. قرارندادن مقادیر داخل کوئریها داخل کوتیشن و شرط WHERE داخل پرانتز، دریافت مقادیر ازطریق آرایه GET و... سایت شما رو به میزان بسیار زیادی نفوذپذیر کرده. بنابراین، نمیشه گفت هک شدین. بهتره بگیم خودتون هکر رو به داخل سایتتون راه دادین. برای رفع این مشکلات هم باید به مباحثی مثل Escapeکردن، تعیین اعتبار ورودیهای کاربر، عدم اعتماد به اطلاعات واردشده بخصوص از روش GET و... بیشتر بپردازین. بعلاوه اینهمه داریم میگیم استفاده تنها از MD5 کافی نیست و باید از روشهای امن تر مثل salt و pepper و توابعی مثل sha و هش کردن چندباره و... استفاده بشه.
موفق باشید.
هی من به این محمدرضا میگم هی قبول نمیکنه ! هکر با استفاده از Sql injction یوزر پسورد رو از توی دیتابیس کشید بیرون .. خب برای جلوگیری باید کاری کنیم که اگه توی id چیزی بجز عدد وارد شده بود طرف رو بندازه بیرون
من فهميدم دليل هك شدن سايتم چي بوده.
اين كدها رو نگاه كنيد:
<?php
$con=mysql_connect('localhost','root','')or die(mysql_error());
$db=mysql_select_db('database')or die(mysql_error());
mysql_query("SET CHARACTER SET utf8",$con);
$url=$_SERVER['REQUEST_URI'];
$last=$_SERVER['HTTP_REFERER'];
$ip=$_SERVER['REMOTE_ADDR'];
date_default_timezone_set('Asia/Tehran');
$date=date('Y-m-d h:i:s');
$vared="INSERT INTO jadval (`url`,`last`,`ip`,`date`) VALUES ('$url','$last','$ip','$date')";
$tab=mysql_query($vared,$con) or die(mysql_error());
if($tab==false){
die("error with query\r\n");
}
$num=mysql_affected_rows($con);
mysql_close($con);
?>
اين كدهاي آمارگير سايت من هست. كه به همين صورت و بدون هيچ امنيتي روي سايت من قرار گرفته بود. كه هر بار صفحه ي سايتم رفرش ميشد اين كد يه آمار مي انداخت.
وقتي من وارد قسمت آمارگير سايتم شدم كه آمار رو ببينم وقتي صفحه كاملا لود ميشد و تمام امار رو نشون ميداد يه دفعه اون صفحه ي سياه كه هكر ايجاد كرده بود ظاهر مي شد. وقتي من امدم محتوي جدول آمارگيرم رو پاك كردم ديگه اون صفحه هم ظاهر نشد.
منم فهميدم هكر از نا امن بودن اين كدها سو استفاده كرده و اون صفحه رو به فيلدي در جدول از ديتابيسم وارد كرده.
راستي چون من پسوردم رو با md5 ايجاد كردم هكر نتونسته به كنترل پنل من نفوذ كنه . براي همينه كه امارگير رو هدف قرار داده.
حالا من ميخوام يه كاري كنم اين اين كدهاي آمارگيرم كه گذاشتم امن بشه. بايد چيكار كنم؟
ممنون ميشم راهنماييم كنيد.
متشكرم.
سلام
قبلا در مورد ولیدیشن ورودی صحبت شده
فقط خواستم بگم اگر دیدی هکر نفوذ کرده بلافاصله کد هاشو پاک نکن. مثلا اگر کدی تزریق کرده کد رو نگه دار و شاید زمانی به دردت خورد.
من یه سی ام اس داشتم که الکی یه بیکار خارجی اومد هک کرد.اون فقط یه page آپلود کرده بود. که باهاش همه کاری انجام میداد.. حالا فکرشو بکن تو یه سایت بتونی اینو آپلود کنی...
من فكر ميكنم طرف يه ادرسي چيزي وارد جدول من كرده . چون من هاستم رو بررسي كردم ديدم چيزي توش نيست.
متاسفانه سايت برنامه نويس رو نميشه درست و حسابي توش جستجو كرد.قبلا در مورد ولیدیشن ورودی صحبت شده
حالا منظورتون اعتبارسنجي هست؟ من بايد چه نوع اعتبارسنجي بكار ببرم؟
مشكل من اينه كه نميدونم هكر چه چيزي رو به جدول من ارسال ميكنه كه بخوام براش مثلا يه اعتبارسنجي بذارم.
راههايي كه براي بررسي مقادير به كار ميره:
mysql_real_escape_string
htmlentities
empty
isset
واقعا بايد چيكار كرد؟
سلام
من از این کد استفاده می کنم
برای ورودی ها و خروجی ها اول مقدار رو به این تابع میدم و در خودش ذخیره می کنم
public function escape($sql) {
$sql = trim($sql);
$sql = strip_tags($sql);
if(!get_magic_quotes_gpc() )
{
$sql = addslashes($sql);
}
$sql = addslashes($sql);
$sql = mysql_real_escape_string($sql);
return $sql;
}
يعني من بيام اين متغييرها رو توي كدهام به جاي متغيير $sql در كد شما قرار بدم؟
$url
$last
$ip
$date
بله. باید یکی یکی براش بفرستین. مثال:
$url = escape($url);
$last = escape($last);
$ip = escape($ip);
$date = escape($date);
موفق باشید.
سلام
ببین
کاربر میاد نام کاربری وارد می کنه
شما همه مواردش رو چک می کنی. مثلا باید چند کارککتر باشه، حروف باشه،عدد باشه و ....
هنگامی که می خوای بفرستی واسه Insert میای و می نویسی
$username=escape($username)
اینجوری میاد یه بررسیش می کنه و بعد ذخیره می کنه. حالا شما نباید اطلاعاتی که درست هستن و ممکنه شبیه به اطلاعات کلک باشن رو هم بفرستی به این تابع
به عنوان مثال میگی کاربر می تونه <a> استفاده کنه. حالا کاربر استفاده کرد وقتی در دیتابیس درج شد میبینی اصلا چیز دیگه ای شده چون از تابع escape استفاده کردی
منظورم رو متوجه شدید؟
نه متوجه نشدم
راستش نميدونم اين تابع escape اصلا چيكار ميكنه؟
حالا به نظر شما فقط اين تابع رو استفاده كنم ؟ escape
و اگه اون توابع رو هم به اضافه ي اين بايد استفاده كنم طريقه ي استفاده اش رو توي كدهاي من نشون بديد.
متشكرم.
من يه نكته اي كه در مورد رمزگذاري در مورد md5 بهش رسيدم اينه كه ما نبايد از كلمات آشنا استفاده كنيم . مثلا . derakht-sadegh . و خوبه از اين كلماتي كه اصلا در فرهنگ لغت نيستن استفاده كنيم . مثلا: gordfervnd. الان شما اين كلاماتي كه من نوشتم توي اين سايت جستجو كنيد منظور منو مي فهميد:
http://md5.rednoize.com/
از اين بانك اطلاعاتي ها توي اينرنت زيادن.
من اين مطالب رو بارها شنيده بودم ولي در عمل بهش نرسيده بودم.
الان شما در مورد اين دستور زير يه نكته اي رو گفتيد :
or die(mysql_error());
من اين دستور رو مثلا براي اين استفاده ميكنيم كه اگه نام ديتابيس درست نباشه يا اصلا وجود نداشته باشه بهمون پيغام بده. من موندم هكر از اين خطا چي مي فهمه كه ازش به عنوان يه حفره عليه ما استفاده ميكنه؟
متشكرم.
حداقلش اینه که نام کاربر دیتابیس لو میره. یا اگه از همین دستور برای mysql_select_db استفاده کنید، نام دیتابیس رو لو میده! به همین شکل درمورد Queryها و... بخشی از کوئری که خطا داشته رو نشون میده و درنتیجه، قسمتی از ساختار جدولهای شما هم کشف خواهد شد.
متشكرم.
حالا فهميدم دليل اينكه به اين راحتي جداول سايتم لو رفت چي بود. آيا راههاي ديگه اي هم براي لو رفتن جدول وجود داره؟
اگه ميشه چند نكته ي ديگه هم در مورد امنيت بگيد. آخه من توي اين مدت هيچ وقت سعي نكردم در مورد امنيت بدونم. راستش وقتي كتاب هاي آموزش php رو هم مي خوندم چيزي در اين مورد توش ننوشته بود.
متشكرم.
من كدم رو به اين صورت درآوردم كار بيهوده اي كه نكردم؟
<?php
$con=mysql_connect('localhost','root','');
$db=mysql_select_db('search');
mysql_query("SET CHARACTER SET utf8",$con);
$url=$_SERVER['REQUEST_URI'];
$last=$_SERVER['HTTP_REFERER'];
$ip=$_SERVER['REMOTE_ADDR'];
date_default_timezone_set('Asia/Tehran');
$date=date('Y-m-d h:i:s');
$url=addslashes($url);
$last = addslashes($last);
$ip = addslashes($ip);
$date = addslashes($date);
$url=mysql_real_escape_string($url);
$last = mysql_real_escape_string($last);
$ip =mysql_real_escape_string($ip);
$date = mysql_real_escape_string($date);
$urli = trim($url);
$lasti = trim($last);
$ipi = trim($ip);
$datei = trim($date);
$vared="INSERT INTO amari (`url`,`last`,`ip`,`date`) VALUES ('$urli','$lasti','$ipi','$datei')";
$tab=mysql_query($vared,$con);
$num=mysql_affected_rows($con);
mysql_close($con);
?>
از تابع escape استفاده نكردم مشكلي كه نداره؟
فكر ميكنم تابع strip_tags منو از حمله ي اون هكر نجات ميده چون باعث ميشه ديگه كسي كد به جاي متن براي جدولم ارسال نكنه.
آخرین ویرایش به وسیله ravand : پنج شنبه 14 اردیبهشت 1391 در 13:13 عصر
تابع mysql_real_escape_string نیاز به ارسال con$ به عنوان پارامتر دوم داره.
دوست عزیز strip_tags به تنهایی کافی نیست و روی حملات SQL Injection هیچ تأثیری نداره. اینگونه حملات رو mysql_real_escape_string که به کار بردین، خنثی میکنه. فقط باید قبل از استفاده از این تابع، یک اتصال به دیتابیس داشته باشین. بعلاوه بعد از اتصال به MySQL و انتخاب دیتابیس و اجرای کوئری 'SET NAMES 'utf8 روی دیتابیس (برای اطلاعات فارسی)، دستور زیر رو هم اجرا کنید:
mysql_set_charset('utf8');
تا عبارتهای فارسی بعنوان کد مخرب شاخته نشده و درنتیجه Escape نشن. وجود این دستور برای عبارات فارسی لازمه وگرنه این اطلاعات توسط mysql_real_escape_string حذف خواهند شد. باید دقت کنید که 'SET NAMES 'utf8 نوع Collation مورد استفاده در تابع مذکور رو تغییر نمیده و فقط نوع کدگذاری اطلاعات مبادله شده با دیتابیس رو تعیین میکنه. موفق باشید.
من متوجه منظور شما نشدم مي تونيد اين كد رو اونطوري كه ميگيد درش بياريد؟
اينم متوجه نشدم . خب من به ديتابيسم اتصال دارم وگرنه كدم كار نميكنه.. اینگونه حملات رو mysql_real_escape_string که به کار بردین، خنثی میکنه. فقط باید قبل از استفاده از این تابع، یک اتصال به دیتابیس داشته باشین
من طريقه ي عملكرد اين دو تابع رو تست زدم .
<?php
$url='<b>ali</b>';
echo mysql_real_escape_string($url);
?>
<?php
$url='<b>ali</b>';
echo strip_tags($url);
?>
تابع mysql_real_escape_string كدها رو حذف نميكنه. ولي تابع strip_tags اين كار رو ميكنه.
حالا منظور شما چي بود؟
متشكرم.
منظورم اینه که این کدها برای MySQL خطرناک نیست. فقط وقتی توی صفحه echo بشه مشکل ساز میشه. مثلاً اگه توشون یک اسکریپت باشه، اجرا میشه. اما اون چیزی که باعث شده سایت شما هک بشه این مورد نبوده. اجرای Queryهای SQL ازطریق آدرس بوده که بهش میگن SQL Injection و جلوگیری از این حملات توسط mysql_real_escape_string انجام میشه. موفق باشید.
اتفاقا كدهاي كه به جدول من ارسال شد در قسمت چاپ آمار چاپ شده . و با دستور echo همه ي مطالب از جدول بيرون كشيده شده و چاپ شده. حتما اون كدها هم چاپ شده كه اين اتفاق افتاده. ضمنا اون فيلمي رو هم كه نشونتون دادم براي چيز ديگه بود . هكر يوذر و پسورد منو بدست آورد ولي نتونست ازش استفاده كنه و در واقع از كدهاي آمارگيرم كه الان اينجا گذاشتم تونست سو استفاده كنه.
آخرش نفهميدم اين كدهاي آمارگير رو چجوري بنويسم كه امن باشه
من كدهام رو به اين صورت نوشتم:
<?php
$con=mysql_connect('localhost','root','');
$db=mysql_select_db('database');
mysql_query("SET CHARACTER SET utf8",$con);
$url=$_SERVER['REQUEST_URI'];
$last=$_SERVER['HTTP_REFERER'];
$ip=$_SERVER['REMOTE_ADDR'];
date_default_timezone_set('Asia/Tehran');
$date=date('Y-m-d h:i:s');
$url=addslashes($url);
$last = addslashes($last);
$ip = addslashes($ip);
$date = addslashes($date);
$url=mysql_real_escape_string($url);
$last = mysql_real_escape_string($last);
$ip =mysql_real_escape_string($ip);
$date = mysql_real_escape_string($date);
$urli = strip_tags($url);
$lasti =strip_tags($last);
$ipi = strip_tags($ip);
$datei =strip_tags($date);
$urli = trim($url);
$lasti = trim($last);
$ipi = trim($ip);
$datei = trim($date);
$vared="INSERT INTO jadval (`url`,`last`,`ip`,`date`) VALUES ('$urli','$lasti','$ipi','$datei')";
$tab=mysql_query($vared,$con);
$num=mysql_affected_rows($con);
mysql_close($con);
?>
براي همين ديدم كه تاريخ اينطوري ثبت شد.
به جاي اينكه اينطوري ثبت بشه:کد HTML:-۶۲۲/۰۹/۰۹ ۱۲:۰۰:۰۰
راه حل چيه؟کد HTML:۱۳۹۱/۰۲/۱۴ ۰۶:۵۵:1۰
این کد فقط یک اعلان برای توابع تاریخ و زمان هست که احتلاف زمانی با مرجع UTC رو مشخص میکنه و باعث شمسی شدن تاریخ نمیشه.
شما باید از تبدیلگر تاریخ میلادی به شمسی استفاده کنید.
جستجو کنید به راحتی پیدا می کنید.
دوست عزیز، فیلد تاریخ و سایر فیلدهایی که خودتون تولید میکنید و از کاربر نمیگیرین رو نیازی نیست و نباید Escape کنید.