PDA

View Full Version : جلوگیری از sql injection ???



miladanimator
جمعه 30 مرداد 1388, 10:33 صبح
سلام دوستان

من یک اسکریپت پی.اچ.پی نوشتم و در حال تکمیله

و الان می خوام روی امنیت اطلاعات ورودی توسط کاربر کار کنم .

در حال حاضر من یک تابع نوشتم به صورت

function injection_replace( $txtobject )
{
return $txtobject;
}

و کلیه اطلاعات وارد شده در فرم های سایت نظیر فرم عضویت و ورود به سایت و .... با دستور زیر توسط تابع فوق چک میشه :

$username = injection_replace( $_POST['username'] );

هدف از اینکار جلوگیری از sql injection و XSS hacking و نیز حذف کد های html غیر ضروری و خطرناک نظیر <scri pt> و ... هست

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

1- آیا تابع آماده ای برای این منظور سراغ دارین که کامل باشه و همه موارد رو رعایت کرده باشه ؟؟؟

2- و یا تابع مشابه این مورد رو در یکی از اسکریپت های مدیریت محتوا معرفی کنید تا از اون استفاده کنم . مثلا همچین تابعی اگر در vbuletin یا مامبو یا ... هست بگین کدمش بهتره تا اون روبردارم

و یک سوال دیگه

تفاوت 2 کد زیر در چیه ؟؟؟

$check = mysql_query("SELECT FROM tablename WHERE Username = '".$username."' and Password = '".$password."'");

$check = mysql_query("SELECT FROM tablename WHERE Username = '$username' and Password = '$password.");

می خوام بدونم چرا برخی اسکریپت ها از نقطه استفاده می کنند ؟ نگاه کنید قبل و بعد از .$username. نقطه گذاشته . آیا تاثیری روی امنیت داره ؟؟؟

mahdilacki
جمعه 30 مرداد 1388, 10:51 صبح
برای جلوگیری از sql injection می تونید از تابع زیر استفاده کنید:
mysql_real_escape_string (http://us2.php.net/manual/en/function.mysql-real-escape-string.php)
و برای <script> هم از تابع زیر:
htmlspecialchars (http://us2.php.net/manual/en/function.htmlspecialchars.php)
یک کتاب هم برای امنیت در php هست پیشنهاد می کنم حتما بخونید:
Essential PHP Security (http://phpsecurity.org/)
By Chris Shiflett

امیـرحسین
جمعه 30 مرداد 1388, 15:08 عصر
توابع escape کار خاصی انجام نمی دهند. فقط کوتیشن ها و دابل کوتیشن ها رو خنثی می کنند (به اضافه عبارات خاصی مثل n\). تابع mysql_real_escape_string این کار رو انجام میده و جلوی SQL Injection رو میگیره.
یه نکته ای این وسط هست و اون هم magic_quotes_gpcهست. اگر این بخش توی PHP فعال باشه، اطلاعاتی از GET و POST و COOKIE میان، خود بخود، escape میشن یعنی کوتیشن ها به '\ و دابل کوتیشن ها به "\ تبدیل میشن. حالا اگر ما چنین مقداری رو با توابع escape ، خنثی کنیم، یک backslash به کوتیشنها اضافه میشه و چون خودشون هم قبلا داشتند، میشه دو تا یعنی: "\\ که این با کوتیشن خالی فرق نمی کنه یعنی توابع escape خودشون، عبارت رو از حالت خنثی خارج کردند. در این حالت ما باید چک کنیم که magic_quotes_gpc فعاله یا نه (توسط تابع get_magic_quotes_gpc) اگر بود، یا باید کاری نکنیم یا باید با یک backslash اضافی، backslash موجود رو غیرفعال کنیم و بعد Escape کنیم. همه SQL Injection همین بود...
توی همین فروم یه تابع نوشته شده که سرچ کنید پیدا می کنید.

در رابطه با سوال دوم، هیچ فرقی وجود نداره. دومی خواناتره!

...!M.J!...
دوشنبه 11 مرداد 1389, 13:15 عصر
با عرض معذرت از دوستان عزیز ولی توابع mysql_real_escape_string (http://us2.php.net/manual/en/function.mysql-real-escape-string.php) به هیچ عنوان امنیت کامل رو برقرار نمیکنه و فقط چندتا از علامتهای معروف رو میبنده که هکر های مبتدی بلدن شما باید خودت فیلتر کنی داده هات رو با توجه به جایی که میخوای استفاده کنی!!!

مثلا mysql_real_escape_string (http://us2.php.net/manual/en/function.mysql-real-escape-string.php) از -- جلوگیری نمیکنه!!!! میتونی تست کنی

yasgig
دوشنبه 11 مرداد 1389, 14:10 عصر
یکی دیگه از توابع هم که میشه باهاش جلوی حملات XXS رو گرفت Strip_tags (http://us2.php.net/manual/en/function.strip-tags.php) هستش.

mohmadd
دوشنبه 11 مرداد 1389, 14:43 عصر
یه نگاه به iranphp.ir هم بنداز بخش کدنویسی و امنیت تاپیک های مهم, چند تاپیک در مورد نکته های امنیتی گفته از جمله تابعی برای جلوگیری از sql injection

...!M.J!...
دوشنبه 11 مرداد 1389, 18:59 عصر
یه کاری هم که خیلی ساده و ابتدایی هست ولی بنظرم خیلی کاردبری است اینه که اون ورودی هایی رو که میتونی(مثل یوزر و پس) فیلتر اندازه بذاری مثلا بیشترین مقدار 10

AbiriAmir
سه شنبه 12 مرداد 1389, 19:10 عصر
دوست عزیز به نظر من پسورد رو تو کوئری چک نکنید یعنی با یوزر کوئری بگیرید و پسورد رو بگیرید و با کد پی اچ پی چک کنید نه مثل کد شما

$check = mysql_query("SELECT FROM tablename WHERE Username ='$username' limit 0,1");
if(mysql_result($check, 0, 1) == $_POST['pass']){ لاگین شد}دلیل

فرض کنید مثل شما کوئری گرفتیم و یه کاربر نام کاربری رو بدونه و اینجوری وارد کنه:

username : "admin'--"
Pass : "123"وارد کرد

اونوقته که کوئریتون به شکل زیر در میاد:

$check = mysql_query("SELECT FROM tablename WHERE Username = 'admin'--' and Password = '".$password."'");از اونجایی که میدونین هم -- در اس کیو ال یعنی کامنت و کاربر لاگین میکنه
یا اگه یوزر و پسورد نداشته باشه اینجوری وارد کنه:

username : "abc"
Pass : "123' or '1'='1"باز هم لاگین میکنه

milad89
چهارشنبه 13 مرداد 1389, 09:54 صبح
سلام دوست عزیز

من یه نظر بهتر دارم

کد های زیر رو در یه فایل php ذخیره کن و بعد در هر فایلی از سایتت که میخوای امنیت برقرار بشه این فایل رو Include کن




<?php

//غیر فعال کردن بارگذاری فایل راه دور با تابع fopen
// برای جلوگیری از نصب شل کدها بسیار مناسب هست
ini_set('allow_url_fopen',false);
//غیر فعال کردن نمایش خطا ها
ini_set('display_errors',false);


Class SecModule
{

var $options=array('GET'=>true,
'POST'=>true,
'COOKIE'=>true,
'REQUEST'=>true);
// تعریف فیلتر ها
var $patterns=array('SQL'=>'/(["]|[\'])/i',
'SQLinjection'=>'/select|union|concat|char/i',
'Crosssite'=>'/(\.\.)/',
'HEX'=>'/0x/',
'cmd'=>'/base64_decode|system/',
'XSS'=>'/<script>/',
'TAG'=>'/<|>|<>/i',
'SHIFT'=>'/([!]|[#]|[$]|[%]|[^]|[&]|
|[(]|[)]|[+]|[~]|[`]|[\|]|[.]|[,]|[\]]|[\[]|[}]|[{]|[?]|[>]|[<])/i');
function SecModule()
{
foreach($this->options as $k=>$int)
{
if($int)
{
//sql injection
$this->load_objects($k,$this->patterns['SQL']);
$this->load_objects($k,$this->patterns['SQLinjection']);
//crosssite
$this->load_objects($k,$this->patterns['Crosssite']);
//hexademicaly encoded
$this->load_objects($k,$this->patterns['HEX']);
//javascript injection
$this->load_objects($k,$this->patterns['XSS']);
//filter some php command
$this->load_objects($k,$this->patterns['cmd']);
$this->load_objects($k,$this->patterns['TAG']);
$this->load_objects($k,$this->patterns['SHIFT']);
}
}
}
function load_objects($objname,$pattern)
{
switch($objname)
{
case 'GET':
$obj=$_GET;
break;
case 'POST':
$obj=$_POST;
break;
case 'COOKIE':
$obj=$_COOKIE;
break;
case 'REQUEST':
$obj=$_REQUEST;
break;
}
foreach($obj as $key=>$value)
{
$value=$this->check_object($pattern,$value);
switch($objname)
{
case 'GET':
$_GET[$key]=$value;
break;
case 'POST':
$_POST[$key]=$value;
break;
case 'COOKIE':
$_COOKIE[$key]=$value;
break;
case 'REQUEST':
$_REQUEST[$key]=$value;
break;
}

}
}

function check_object($pattern,$value)
{
if(is_array($value))
{
foreach($value as $k=>$v)
{
$new_value[$k]=$this->check_object($pattern,$v);
}
return $new_value;
}
preg_match($pattern,$value,$result);
if(!empty($result[0]))
{
$value=false;
}
return $value;
}
}
$SM=new SecModule;

?>

eshpilen
چهارشنبه 13 مرداد 1389, 11:22 صبح
می خوام بدونم چرا برخی اسکریپت ها از نقطه استفاده می کنند ؟ نگاه کنید قبل و بعد از .$username. نقطه گذاشته . آیا تاثیری روی امنیت داره ؟؟؟
تاجایی که میدونم بخاطر سرعت بالاتر روش concatenation (همون کاری که نقطه انجام میده) هست.
البته بنظر من خیلیا دیگه شورش رو درمیارن و وسواس بخرج میدن.
من خودم تست کردم در مورد رشته های خیلی کوتاه این اختلاف سرعت خیلی کمتر میشه.
درمورد رشته های طولانی و پیچیده تر سرعت روش concatenation دو سه برابر و شاید بیشتر هست. اما بهرحال این دلیل نمیشه ما همه جا مجبور باشیم از این روش استفاده کنیم! مثلا کلی خودمون رو اذیت کنیم و احتمالا از خوانایی برنامه هم کم بشه تا نهایتا یک صدم ثانیه در هر Page زمان پردازش کمتری بدست بیاریم! این شاید فقط روی برنامه های خیلی بزرگ و پیچیده و سایتهای با ترافیک مفرط مهم بشه.
اگر بخوایم اینطور وسواسی عمل کنیم باید خودمون از استفاده از کلی از امکانات شیرین زبانها محروم کنیم و اصلا چطوره بریم با سی برنامه وب بنویسیم چون سریعتر اجرا میشه و منابع کمتری مصرف میکنه!!

tehro0n
چهارشنبه 13 مرداد 1389, 11:29 صبح
سلام دوست عزیز

من یه نظر بهتر دارم

کد های زیر رو در یه فایل php ذخیره کن و بعد در هر فایلی از سایتت که میخوای امنیت برقرار بشه این فایل رو Include کن




<?php

//غیر فعال کردن بارگذاری فایل راه دور با تابع fopen
// برای جلوگیری از نصب شل کدها بسیار مناسب هست
ini_set('allow_url_fopen',false);
//غیر فعال کردن نمایش خطا ها
ini_set('display_errors',false);


Class SecModule
{

var $options=array('GET'=>true,
'POST'=>true,
'COOKIE'=>true,
'REQUEST'=>true);
// تعریف فیلتر ها
var $patterns=array('SQL'=>'/(["]|[\'])/i',
'SQLinjection'=>'/select|union|concat|char/i',
'Crosssite'=>'/(\.\.)/',
'HEX'=>'/0x/',
'cmd'=>'/base64_decode|system/',
'XSS'=>'/<script>/',
'TAG'=>'/<|>|<>/i',
'SHIFT'=>'/([!]|[#]|[$]|[%]|[^]|[&]|
|[(]|[)]|[+]|[~]|[`]|[\|]|[.]|[,]|[\]]|[\[]|[}]|[{]|[?]|[>]|[<])/i');
function SecModule()
{
foreach($this->options as $k=>$int)
{
if($int)
{
//sql injection
$this->load_objects($k,$this->patterns['SQL']);
$this->load_objects($k,$this->patterns['SQLinjection']);
//crosssite
$this->load_objects($k,$this->patterns['Crosssite']);
//hexademicaly encoded
$this->load_objects($k,$this->patterns['HEX']);
//javascript injection
$this->load_objects($k,$this->patterns['XSS']);
//filter some php command
$this->load_objects($k,$this->patterns['cmd']);
$this->load_objects($k,$this->patterns['TAG']);
$this->load_objects($k,$this->patterns['SHIFT']);
}
}
}
function load_objects($objname,$pattern)
{
switch($objname)
{
case 'GET':
$obj=$_GET;
break;
case 'POST':
$obj=$_POST;
break;
case 'COOKIE':
$obj=$_COOKIE;
break;
case 'REQUEST':
$obj=$_REQUEST;
break;
}
foreach($obj as $key=>$value)
{
$value=$this->check_object($pattern,$value);
switch($objname)
{
case 'GET':
$_GET[$key]=$value;
break;
case 'POST':
$_POST[$key]=$value;
break;
case 'COOKIE':
$_COOKIE[$key]=$value;
break;
case 'REQUEST':
$_REQUEST[$key]=$value;
break;
}

}
}

function check_object($pattern,$value)
{
if(is_array($value))
{
foreach($value as $k=>$v)
{
$new_value[$k]=$this->check_object($pattern,$v);
}
return $new_value;
}
preg_match($pattern,$value,$result);
if(!empty($result[0]))
{
$value=false;
}
return $value;
}
}
$SM=new SecModule;

?>




میشه با توجه به پستی که در زیر دادم یک مثال بزنی؟

http://barnamenevis.org/forum/showthread.php?t=237247

UnnamE
پنج شنبه 14 مرداد 1389, 01:43 صبح
به هیچ وجه توابع آماده امنیت کامل ندارن
بهترین مورد اینه که شما برای هر قسمت یه تابع فیلتر گذاری درست کنید
مثلا برای قسمت جستجو یه جود داده ها رو انتقال بده
واسه لاگین هم باز یه نوع تابع دیگه
یه چیز دیگه هم اینه که پسورد رو توی کويری چک نکن!
و خیلی چیزهای دیگه
برقراری امنیت روش خاصی نداره
کاملا به عقل و منطق برنامه نویس مربوط میشه!

parselearn
شنبه 16 مرداد 1389, 17:31 عصر
سلام دوست عزیز

من یه نظر بهتر دارم

کد های زیر رو در یه فایل php ذخیره کن و بعد در هر فایلی از سایتت که میخوای امنیت برقرار بشه این فایل رو Include کن




<?php

//غیر فعال کردن بارگذاری فایل راه دور با تابع fopen
// برای جلوگیری از نصب شل کدها بسیار مناسب هست
ini_set('allow_url_fopen',false);
//غیر فعال کردن نمایش خطا ها
ini_set('display_errors',false);


Class SecModule
{

var $options=array('GET'=>true,
'POST'=>true,
'COOKIE'=>true,
'REQUEST'=>true);
// تعریف فیلتر ها
var $patterns=array('SQL'=>'/(["]|[\'])/i',
'SQLinjection'=>'/select|union|concat|char/i',
'Crosssite'=>'/(\.\.)/',
'HEX'=>'/0x/',
'cmd'=>'/base64_decode|system/',
'XSS'=>'/<script>/',
'TAG'=>'/<|>|<>/i',
'SHIFT'=>'/([!]|[#]|[$]|[%]|[^]|[&]|
|[(]|[)]|[+]|[~]|[`]|[\|]|[.]|[,]|[\]]|[\[]|[}]|[{]|[?]|[>]|[<])/i');
function SecModule()
{
foreach($this->options as $k=>$int)
{
if($int)
{
//sql injection
$this->load_objects($k,$this->patterns['SQL']);
$this->load_objects($k,$this->patterns['SQLinjection']);
//crosssite
$this->load_objects($k,$this->patterns['Crosssite']);
//hexademicaly encoded
$this->load_objects($k,$this->patterns['HEX']);
//javascript injection
$this->load_objects($k,$this->patterns['XSS']);
//filter some php command
$this->load_objects($k,$this->patterns['cmd']);
$this->load_objects($k,$this->patterns['TAG']);
$this->load_objects($k,$this->patterns['SHIFT']);
}
}
}
function load_objects($objname,$pattern)
{
switch($objname)
{
case 'GET':
$obj=$_GET;
break;
case 'POST':
$obj=$_POST;
break;
case 'COOKIE':
$obj=$_COOKIE;
break;
case 'REQUEST':
$obj=$_REQUEST;
break;
}
foreach($obj as $key=>$value)
{
$value=$this->check_object($pattern,$value);
switch($objname)
{
case 'GET':
$_GET[$key]=$value;
break;
case 'POST':
$_POST[$key]=$value;
break;
case 'COOKIE':
$_COOKIE[$key]=$value;
break;
case 'REQUEST':
$_REQUEST[$key]=$value;
break;
}

}
}

function check_object($pattern,$value)
{
if(is_array($value))
{
foreach($value as $k=>$v)
{
$new_value[$k]=$this->check_object($pattern,$v);
}
return $new_value;
}
preg_match($pattern,$value,$result);
if(!empty($result[0]))
{
$value=false;
}
return $value;
}
}
$SM=new SecModule;

?>


اين كد رو كسي ميتونه توضيح بده؟
و نحوه استفاده رو بگه.

amirepsilon
یک شنبه 17 مرداد 1389, 07:15 صبح
سلام
1. mysql_real_escape_string با mysql_escape_string چه فرقی میکنه ؟
2. چطور میشه get_magic_quotes_gpc رو غیر فعال یا فعال کرد ؟
با تشکر

eshpilen
یک شنبه 17 مرداد 1389, 08:20 صبح
mysql_real_escape_string در داخل خود MySQL اجرا میشه. درواقع MySQL خودش چنین تابعی داره که بنده در رفرنسش دیدم. پس تابع mysql_real_escape_string پی اچ پی بصورت یک Wrapper عمل میکنه.

mysql_escape_string بنظرم مال خود PHP باشه.

ترجیح mysql_real_escape_string بر mysql_escape_string اکیدا توصیه میشه.

rapidpich
یک شنبه 17 مرداد 1389, 08:35 صبح
فرقشون رو نمیدونم ولی همونطور که دوستمون توضیح دادن mysql_real_escape_string باید استفاده بشه.

برای magic_quote میتونی:
1. تو php.ini تنظییم کنی
2. از تابع ini_set استفاده کنی

parselearn
دوشنبه 18 مرداد 1389, 11:10 صبح
آيا چنين كدي براي مقابله با حمله اوليه sqli مناسبه؟

$s= "0--ad'";
$s=str_replace("'","",$s);
$s=str_replace("0--","",$s);
$s=str_replace("+and+","",$s);
echo $s;

rash44
دوشنبه 18 مرداد 1389, 13:38 عصر
سلام
کسی می تونه 1 مثال واسه این بزنه


یه چیز دیگه هم اینه که پسورد رو توی کويری چک نکن!

rapidpich
دوشنبه 18 مرداد 1389, 13:53 عصر
نه اون تابع کافی نیست!
فقط متغیر هاتو mysql_real_escape کن


یه چیز دیگه هم اینه که پسورد رو توی کويری چک نکن!

یعنی پسورد رو بگیر از دیتابیس و بعد با php چک کن.

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

narsic
سه شنبه 19 مرداد 1389, 17:58 عصر
سلام دوست عزیز

من یه نظر بهتر دارم

کد های زیر رو در یه فایل php ذخیره کن و بعد در هر فایلی از سایتت که میخوای امنیت برقرار بشه این فایل رو Include کن

اگه هکر به جای select از SELECT استفاده کنه برنامه شما رو دور زده (برای همهی موارد همینه)


سلام
کسی می تونه 1 مثال واسه این بزنه
یعنی از این استفاده کنید .


$check = mysql_query("SELECT FROM tablename WHERE Username ='$username' limit 0,1");
if(mysql_result($check, 0, 1) == $_POST['pass']){ لاگین شد}

...!M.J!...
سه شنبه 19 مرداد 1389, 21:11 عصر
آقا چه کاریه از prepared statement استفاده کن دیگه با اینجکشن خدافظی کن:لبخند:

bestirani2
سه شنبه 26 مرداد 1389, 02:07 صبح
بهترین کار این هست که علاوه بر پی اچ پی در خود mysql هم داده ها بررسی شود

parselearn
سه شنبه 26 مرداد 1389, 02:53 صبح
من يك تابع براي اين كار نوشتم



function sqlin($s)
{
$s=strtolower($s);
$s=str_replace("'","",$s);
$s=str_replace("--","",$s);
$s=str_replace("+and+","",$s);
$s=str_replace("order+by","",$s);
$s=str_replace("order by","",$s);
$s=str_replace("union","",$s);
$s=str_replace("union select","",$s);
$s=str_replace("union+select","",$s);
$s=str_replace("concat","",$s);
$s=str_replace("user()","",$s);
$s=str_replace("database()","",$s);
$s=str_replace("version()","",$s);
$s=str_replace("convert(","",$s);
$s=str_replace("base64_decode","",$s);
$s=str_replace("char(","",$s);
$s=str_replace("alter table","",$s);
$s=str_replace("alter+table","",$s);
$s=str_replace("drop table","",$s);
$s=str_replace("drop+table","",$s);
$s=str_replace("drop","",$s);
$s=str_replace("0x","",$s);
$s=str_replace("\\","",$s);
$s=str_replace("\'","",$s);
$s=strip_tags($s);
$s=mysql_escape_string($s);
return $s;
}

bestirani2
سه شنبه 26 مرداد 1389, 03:19 صبح
من يك تابع براي اين كار نوشتم
چطوري؟


function sqlin($s)
{
$s=strtolower($s);
$s=str_replace("'","",$s);
$s=str_replace("--","",$s);
$s=str_replace("+and+","",$s);
$s=str_replace("order+by","",$s);
$s=str_replace("order by","",$s);
$s=str_replace("union","",$s);
$s=str_replace("union select","",$s);
$s=str_replace("union+select","",$s);
$s=str_replace("concat","",$s);
$s=str_replace("user()","",$s);
$s=str_replace("database()","",$s);
$s=str_replace("version()","",$s);
$s=str_replace("convert(","",$s);
$s=str_replace("base64_decode","",$s);
$s=str_replace("char(","",$s);
$s=str_replace("alter table","",$s);
$s=str_replace("alter+table","",$s);
$s=str_replace("drop table","",$s);
$s=str_replace("drop+table","",$s);
$s=str_replace("drop","",$s);
$s=str_replace("0x","",$s);
$s=str_replace("\\","",$s);
$s=str_replace("\'","",$s);
$s=str_replace("/","",$s);
$s=strip_tags($s);
$s=mysql_escape_string($s);
return $s;
}
چی چطوری؟
تابع رو چطوری نوشتی؟

parselearn
چهارشنبه 27 مرداد 1389, 13:23 عصر
معذرت ميخوام
منظورم اين كه در چه سطحي؟ (چطوريه؟)

اطلاعاتي كه مثلا از متد post ميگيريم رو به اين ميديم، خروجي ميگيريم!!!

البته اينو ميخوام شبيه كدي كه صفحات قبلي هست درست كنم

bestirani2
چهارشنبه 27 مرداد 1389, 13:44 عصر
معذرت ميخوام
منظورم اين كه در چه سطحي؟ (چطوريه؟)

اطلاعاتي كه مثلا از متد post ميگيريم رو به اين ميديم، خروجي ميگيريم!!!

البته اينو ميخوام شبيه كدي كه صفحات قبلي هست درست كنم

یکی از مشکل ها این روش این هست که مقداری برابر uniongfgf را قبول نمیکنه
در صورتی که مشکلی نداره
چرا سمت اس کبو ال جلوی این کار رو نمیگیرید؟

kabotareazad
شنبه 30 مرداد 1389, 10:04 صبح
سلام
میشه بگید که چطور میشه در سمت sql چک کرد؟

bestirani2
شنبه 30 مرداد 1389, 11:31 صبح
با نوشتن یک روال که اطلاعات رو به صورت ورودی میگیره
تایگر ها هم کمک میکنه تو این قضیه