تالار گفتمان nCIS.ir

نسخه‌ی کامل: امنیت این جامعه مجازی
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام و خسته نباشید به دوستان عزیز
به این آدرس ی سری بزنید.
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 رو به طور کامل کنترل کردم.

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

ممنون از راهنمایی هاتون
برای چک امنیت این پروژه نرم افزار یا سایتی سراغ دارید که با چک پروژه ، راه های نفوذ و باگهای امنیتی رو نشون بده؟
ممنون
والا راه زیاده و نرم افزار تست هم خیلی هست. از Accunetix بگیرین تا Nessus و...
سلام
به این صفحه ی سربزنید.
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 میشه نفوذ کرد.
آیا برای این مشکل راه حلی دارین؟
ممنون
کدی که برای 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(*) بیشتر از COUNT(id) هست چون دومی رکوردها رو چک میکنه که تکراریها رو شمارش نکنه (هرچند ممکنه اصلاً تکراری وجود نداشته باشه - مثل همین id ولی بهرحال چک میشه) ولی اولی صرفاً رکوردها رو شمارش میکنه.
(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 استفاده میکنم.
ب نظرتون این بهتر نیست.
به این کد ها هم ی نیگا بندازین.
آیا این کد ها هم امنیت پایینی دارن.
آخه من تو همه ی کدهام از 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();
}

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

آیا این کد برای حملات sqlinjection تاثیری داره؟
true باشه یا false ?