PDA

View Full Version : مشکل با فیلترینگ و جلوگیری از sql injection



mohammadreza0123
سه شنبه 12 اسفند 1393, 20:00 عصر
سلام
راستش من یه تابع در کلاسی نوشتم برای فیلتر کردن موارد پستی به صفحات مختلف

تابع به صورت زیر است:



class security{
//baraye check kardan post hapublic function chek_post($value){ $return1= mysql_real_escape_string($value); $rerurn2= htmlspecialchars($return1); return $rerurn2; }//baraye check kardan get hapublic function check_get($value){ $return1= mysql_real_escape_string($value); $rerurn2= htmlspecialchars($return1); return $rerurn2;
}

ورودی تابع $_POST و $_GET ها می باشد که معلوم هست

حالا من وقتی مثلا از





$security->chek_post($_post["دلخواه"])


وقتی از تابع استفاده میکنم
انگار چیزی پست نمیشه

ولی وقتی تابع رو بر میدارم و معمولی پست میکنم انجام میشه

میخوام بدونم مشکل چیه

لطفا کمک کنید

H:Shojaei
سه شنبه 12 اسفند 1393, 20:56 عصر
کد کامل رو بذارید...
یا واسه اینه که $_POST رو کوچیک نوشتید...
یا این که مقداری که از تابع داخل کلاس برگردونده میشه رو echo نکردین...
یا...

mohammadreza0123
سه شنبه 12 اسفند 1393, 21:05 عصر
آخه کدوم کدو کامل بذارم

ببینید کد تابع اینه:



class security{
//baraye check kardan post hapublic function chek_post($value){ $return1= mysql_real_escape_string($value); $rerurn2= htmlspecialchars($return1); return $rerurn2; }//baraye check kardan get hapublic function check_get($value){ $return1= mysql_real_escape_string($value); $rerurn2= htmlspecialchars($return1); return $rerurn2;
}
}


بالفرض کد لاگین رو میذارم:



<?phpsession_start();
include '../object/function.php';$security=new security();$connect=new connect();if(isset($_POST["login"])){ if(($_POST["txt_username"]=="")||($_POST["txt_password"]=="")) { $security->Redirect("index","error=empty"); } else { $username=$security->chek_post($_POST["txt_username"]); $password=$security->chek_post($_POST["txt_password"]); $sql="select * from tbl_user where username='".$username."' and password='".$password."' and type='1'"; $result=$connect->query($sql); if(mysql_num_rows($result)==1) { $row=mysql_fetch_assoc($result); $_SESSION["name"]=$row["name"]." ".$row["family"];
$_SESSION["login"]=true; $security->Redirect("../admin/index"); } else { $security->Redirect("index","errorlog=empty"); } }}else{ $security->Redirect("index");}

?>


الان دقت کنید
اگر اون تابع chek_post رو استفاده نکنم به راحتی وارد پنل ادمین میشه ولی وقتی با این تابع میزنم errorlog=empty میده

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

Unique
سه شنبه 12 اسفند 1393, 21:22 عصر
برای injection اگه از prepare که در واقع parameterized کردن query هست استفاده کنید کلا موضوع injection بی معنی میشه.
در مورد حملات XSS هم باید به درستی از htmlentities و htmlspecialchars و کلاس htmlpurify استفاده کنید.
کلا نوشتن یک تابع و فیلتر کردن ورودی های کاربر به نظر من درست نیست. شما باید بدونید هر فیلد باید شامل چه چیزی باشه و اگه با اون مغایر بود یا خطا بده یا رفع خطر کنه.

۹۰٪ حملات همین دو مورده و جند تا حمله دیگه هم هست که با کمی تحقیق توی همین انجمن بهش میرسین. اما اگه واقعا موضوع injection باشه اصلا نه نیاز به escape هست نه htmlspecialchars واین چیزا و کافیه از prepared statement ها استفاده کنید.

موفق باشین.

mohammadreza0123
سه شنبه 12 اسفند 1393, 22:37 عصر
من متوجه نشدم

من دارم از mysql استفاده میکنما بجه ها
لطفا کمکم کنید

من میام با تابع فیلتر میکنم میره تو تابع و بعد دستورات فیلتر وقتی برمیگردونم چیزی نمیده

ولی همون مقدار ورودی رو بر گردونم درست عمل میکنه یعنی با دستورات فیلتر مشکل داشت

چیکار کنم من؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Unique
چهارشنبه 13 اسفند 1393, 01:57 صبح
من دارم از mysql استفاده میکنما بجه ها
پس بهتره این کار را نکنین به خاطر اینکه mysql extension از نسخه 5.5.0 به بعد deprecate شده و در آینده کلا از PHP حذف خواهد شد و به مشکل میخورین.
از mysqli یا pdo استفاده کنید و از prepared statement ها استفاده کنید تا کلا خیالتون از injection راحت باشه.

راستی کدهاتون را خیلی بد میگذارین و نمیشه درست خوندشون و اینطوری کسی بررسیشون نمیکنه ببینه مشکل چیه !!

mohammadreza0123
چهارشنبه 13 اسفند 1393, 09:01 صبح
بچه ها من تازه 7 ماهه شروع کردم

اینقده خفن ج ندید

در حد ساده که منم بفهمم

الان من چیکار کنم به نظرتون

من از mysql استفاده کردم و باید تا 1-2 روز دیگه تحویل بدم

کد رو دوباره میذارم

کدی که در کلاس security نوشتم اینه




function chek_post($value){ $return1= mysqli_real_escape_string($value); $rerurn2= htmlspecialchars($return1); return $rerurn2; }



حالا همسنجوری برای تست میام که خروجی بگیرم با کد زیر:




$security=new security();echo($_POST["txt_username"]);$x=chek_post($_POST["txt_username"]);echo("<br \>");echo($x);


میاد فقط اونی $_POST که معمولی گذاشتمش رو چاپ میکنه و اونی که فیلتر کردم رو چاپ نمیکنه

لطفا دوستان طوری توضیح بدن یه تازه کاری مثه من متوجه بشه

ممنونم

منتظرم

لطفا با کمال خواهش زود اگه میشه جواب بدید

hamedarian2009
چهارشنبه 13 اسفند 1393, 09:30 صبح
سلام از mysqli استفاده کنید خیلی تغییر خاصی نداره با توابع mydql اگه به صورت رویه گرا استفاده کنید از اینجا (http://beyamooz.com/php/97-database/118-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D9%87-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-mysql-%D8%AF%D8%B1-php) یاد بگیرین فکرنکنم زیاد وقتتون رو بگیره تغییر دادن کدهای دیتابیس

MMSHFE
چهارشنبه 13 اسفند 1393, 09:56 صبح
دقت کنید که اگه عبارت شما فارسی باشه، کارکترهای فارسی حذف میشن در حالت پیشفرض (فکر میکنه کد مخربه چون دوبایتی هستن). باید این دستور رو بلافاصله بعد از اتصال به دیتابیس بنویسید:

myqli_query('SET NAMES \'utf8\'');
همزمان متن رو هم برای MySQL و هم برای نمایش در صفحه Escape نکنید. جایی که میخواین توی دیتابیس درج بشه با mysqli_real_escape_string کار کنید و جایی که میخواین توی صفحه نشون بدین، با htmlentities کار کنید. ضمناً همیشه باید قبل از اینکه از mysqli_real_escape_string استفاده کنید، یک اتصال باز به دیتابیس داشته باشین. مثال:

function dbEscape($string) {
// connect to mysql and select db
mysqli_query('SET NAMES \'utf8\'');
return mysqli_real_escape_string($string);
}
function htmlEscape($string) {
return htmlentities($string, ENT_QUOTES, 'utf-8');
}
موقع استفاده هم اینطوری کار کنید:

// when you want to store the value in DB
$name = dbEscape($_POST['name']);
// when you want to display the value on the page
echo htmlEscape($_POST['name']);

موفق باشید.