رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
امنیت این جامعه مجازی
#1
سلام و خسته نباشید به دوستان عزیز
به این آدرس ی سری بزنید.
http://www.zncms.ir
الآن دو ماهی میشه که دارم روی این جامعه مجازی کار میکنم بالاخره تموم شد.این جامعه مجازی در مورد صنعت سنگ هستش.
میخوام از تجربیات همه ی شما دوستان تو امنیت این پروژه کمک بگیرم.
ابتدا من بگم که چ کارایی رو برای امنیت این پروژه انجام دادم.

1- برای جلوگیری از حملات sql_injection از pdo استفاده کردم و تمام کوئری هام رو با استفاده از prepare اجرا کردم.
به نظرم برای جلوگیری از حملات sqlinjection همین قدر کافیه.
آیا راه حل دیگری به ذهنتان میرسد.

2-برای جلوگیری از حملات xss و امسال اینها از توابع زیر استفاده کردم
htmlentitis
striptags
htmlspeacialcharts
و برای امنیت بیشتر از کتاب خانه ی htmlpruf استفاده کردم.

3- برای جلوگیری از آپلود انواع شل به جای عکس از توابع gd استفاده کردم.
نام تصاویر به طور رندوم عوض میکنم و کاربر به هیچ عنوان نمیتونه بعد از آپلود تصویر نام تصویر رو حدث بزنه.
جلوی لیست دایرکتوری رو گرفتم و کاربر نمیتونه دایرکتوری هامو لیست کنه.

4-از ckeditor استفاده کردم ولی نمیشه باهاش آپلود کرد. ی خطایی میده که دقیق نمیدونم چیه؟
برای ckeditor از htmlpruf استفاده کردم.

5- برای ثبت نام و کارهایی از این قبیل از کپتا استفاده کردم.
کپتا رو خودم ساختم : ب نظرتون چطوریه؟ آیا حدث زدنش برای ربات ها آسونه یا نه؟

6- کنترل خطارو تو کل برنامه صفر کردم
7- url رو به طور کامل کنترل کردم.

بخش ثبت نام و ورود چ مشکلاتی داره؟
به نظرتون دیگه باید کجاهای پروژه رو چک کنم؟
آیا چیزی از یادم رفته که چک نکرده باشم؟
تو چنین پروژه هایی باید تمرکزم رو کجا بزارم؟
چ پیشنهاداتی برای امنیت بیشتر و بهتر دارین؟

ممنون از راهنمایی هاتون
پاسخ
تشکر شده توسط:
#2
برای چک امنیت این پروژه نرم افزار یا سایتی سراغ دارید که با چک پروژه ، راه های نفوذ و باگهای امنیتی رو نشون بده؟
ممنون
پاسخ
تشکر شده توسط:
#3
والا راه زیاده و نرم افزار تست هم خیلی هست. از Accunetix بگیرین تا Nessus و...
پاسخ
تشکر شده توسط: olampiad
#4
سلام
به این صفحه ی سربزنید.
http://www.zncms.ir/login
تو این صفحه ، هم ب جای نام کاربری و هم ب جای رمز عبور این کاراکتر هارو میزارم.
' or ''='
به راحتی میتونم وارد وبسایت بشم.
از کوئریم ی اکو گرفتم
select count(id) AS count from `company` where `username`='' or ''='' and `password`='' or ''=''
کد بالا دقیقا کوئری من هستش.
حالا:
همینطور که میدونیم استفاده از pdo جلوی حملات sql injection رو میگیره ولی تو اینجا من هم از pdo استفاده کردم و هم از prepare ولی باز با حملات sql injection میشه نفوذ کرد.
آیا برای این مشکل راه حلی دارین؟
ممنون
پاسخ
تشکر شده توسط:
#5
کدی که برای Prepare گذاشتین چیه؟ اینطوری باید کار کنید:
$stmt = $pdo->prepare('SELECT COUNT(*) AS `count` FROM `company` WHERE (`username`=:user AND `passsword`=:pass)');
$stmt->bindParam(':user', $_POST['username'], PDO::PARAM_STR, 255);
$stmt->bindParam(':pass', $_POST['password'], PDO::PARAM_STR, 255);
$stmt->execute();
پاسخ
تشکر شده توسط:
#6
نکته: سرعت COUNT(*) بیشتر از COUNT(id) هست چون دومی رکوردها رو چک میکنه که تکراریها رو شمارش نکنه (هرچند ممکنه اصلاً تکراری وجود نداشته باشه - مثل همین id ولی بهرحال چک میشه) ولی اولی صرفاً رکوردها رو شمارش میکنه.
پاسخ
تشکر شده توسط: olampiad
#7
(29-12-1394، 09:03 ق.ظ)ADMIN نوشته: کدی که برای Prepare گذاشتین چیه؟ اینطوری باید کار کنید:
$stmt = $pdo->prepare('SELECT COUNT(*) AS `count` FROM `company` WHERE (`username`=:user AND `passsword`=:pass)');
$stmt->bindParam(':user', $_POST['username'], PDO::PARAM_STR, 255);
$stmt->bindParam(':pass', $_POST['password'], PDO::PARAM_STR, 255);
$stmt->execute();

تشکر از استاد عزیز بابت راهنمایی ها
به این کد ها ی نیگا بندازین

من این کد رو تو کنترل اصلی گذاشتم.
$count=$this->model->login('company',array('username'=>$_POST['username'],'password'=>$_POST['password']));

کد بالایی میاد تو مدل من این تابع پایینی رو صدا میزنه.
public function login($table,$select=array()){
$txt='';
foreach($select as $k=>$v){
$txt=$txt."`$k`='$v' and ";
}
$txt=substr($txt,0,-4);
return $this->db->select("select count(id) AS count from `$table`  where $txt");
}

کد بالایی هم میاد از کلاس دیتابیسم تابع زیر رو صدا میزنه و اجرا میکنه.
public function select($sql,$data=array(),$fetch=pdo::FETCH_ASSOC){
	$this->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
	$res=$this->prepare($sql);
	$res->execute($data);
	return $re=$res->fetchAll($fetch);
}

تو اینجام من دارم از prepare استفاده میکنم.
ب نظرتون این بهتر نیست.
پاسخ
تشکر شده توسط:
#8
به این کد ها هم ی نیگا بندازین.
آیا این کد ها هم امنیت پایینی دارن.
آخه من تو همه ی کدهام از prepare استفاده میکنم.
ممنون

public function insert($table,$data){
	    $this->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
		ksort($data);
		$keyfild='`'.implode('`,`',array_keys($data)).'`';
		$valfild=':'.implode(',:',array_keys($data));
		$res=$this->prepare("INSERT INTO `$table` ($keyfild) VALUES ($valfild)");
	
		foreach($data as $key=>$val){
		$res->bindValue(":$key",$val);
		}
		$rr=$res->execute();
		if($rr){
		session::set('insert',true_matn);	
		}else{
		session::set('insert',false_matn);
	    }
}



public function update($table,$data,$where){
	    $this->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
		ksort($data);
		$details="";
		foreach($data as $k=>$v){
		 $details.="`$k`='$v',";
		}
		$details=rtrim($details,',');
		$res=$this->prepare("update `$table` set $details where $where");
		$re=$res->execute();
		if($re){
		session::set('insert',true_matn);	
		}else{
		session::set('insert',false_matn);
		}
}

public function delete($table,$where){
	$this->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
	$res=$this->prepare("delete from `$table` where $where");
	$res->execute();
}

پاسخ
تشکر شده توسط:
#9
آیا امنیت bindParam از prepare زیاد تره؟
الآن تو insert هم امکان داره حملات sqlinjection انجام بشه.
ممنون
پاسخ
تشکر شده توسط:
#10
دقت کنید Prepare درکنار bindParam امنیت ایجاد میکنه. اینطور نیست که شما فقط کوئری رو توی Prepare بگذارین و Execute کنید و بگین دیگه خوب حله همه چیز امن شد. باید پارامتر توی کوئری بگذارین و متغیرها و ورودیها رو با پارامتر بهش بدین که برای این کار میشه از متدهای bindParam و bindValue استفاده کرد. برای همین موضوع هست که گاهی اوقات به روش Prepared Statements، اسم Parameterized Query هم داده میشه.
پاسخ
تشکر شده توسط: olampiad
#11
به این کد نیگا کنین.
$this->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);

آیا این کد برای حملات sqlinjection تاثیری داره؟
true باشه یا false ?
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان