PDA

View Full Version : سوال در مورد امنیت در php



mamad_za
پنج شنبه 03 دی 1394, 00:31 صبح
سلام دوستان من کدای زیادی تست کردم تا رسیدم به این کد می خواستم نظرتون رو بدونم که چطوره اگه اشکالی داره بگین رفع کنم یا اگه نمونه کد بهتری دارین ممنون میشم بگید.
function cleaner($input)
{
if($input)
{
if(is_array($input))
{
foreach ($input as $key => $value)
{
$output[$key] = cleaner($value);
}
}
else
{
$output = htmlspecialchars(trim($input),ENT_QUOTES, 'utf-8');
$output = mysql_real_escape_string($output);
$output = filter_var($output, FILTER_SANITIZE_STRING);
$output = strip_tags($output);
$output = str_replace(array("'", '"'),array('‘', '“' ), $output);
echo $output.'</br>';
}
return $output;
}
else
{
return '';
}
}
?>

البته خودم پیداش کردم
خروجی هم گرفتم که نتیجش به این شکل در اومد

ورودی <script>alert('hello world');</script>

خروجی <script>alert('hello world');</script>
بدون اینکه اجرا بشه

Unique
پنج شنبه 03 دی 1394, 13:29 عصر
دوست عزیز ، این توابع کلا نیاز نیستند ! شما باید حملات را بشناسین و بر اساس وروید ها و چگونگی ذخیره و نمایش اون ها از حملات جلوگیری کنین ، اگه توی همین انجمن php به دنبال sql injection یا XSS بگردی کلی پست خوب پیدا میکنی. چون شرایط حمله ها و نیاز های پروژه متفاوت هست این تابع به درد نمیخوره ! مثلا اگه لازم باشه از کاربر اطلاعات HTML بگیریم یا کاربری متنی را به نصوت نقل قول جستجو کرد این تابع دردسر سازه و یا باید به برنامه بخش های بیخودی اضافه منیم یا کلا هی توی تابع شرط بگذاریم.

رضا قربانی
پنج شنبه 03 دی 1394, 15:08 عصر
سلام دوستان من کدای زیادی تست کردم تا رسیدم به این کد می خواستم نظرتون رو بدونم که چطوره اگه اشکالی داره بگین رفع کنم یا اگه نمونه کد بهتری دارین ممنون میشم بگید.
function cleaner($input)
{
if($input)
{
if(is_array($input))
{
foreach ($input as $key => $value)
{
$output[$key] = cleaner($value);
}
}
else
{
$output = htmlspecialchars(trim($input),ENT_QUOTES, 'utf-8');
$output = mysql_real_escape_string($output);
$output = filter_var($output, FILTER_SANITIZE_STRING);
$output = strip_tags($output);
$output = str_replace(array("'", '"'),array('‘', '“' ), $output);
echo $output.'</br>';
}
return $output;
}
else
{
return '';
}
}
?>

البته خودم پیداش کردم
خروجی هم گرفتم که نتیجش به این شکل در اومد

ورودی <script>alert('hello world');</script>

خروجی <script>alert('hello world');</script>
بدون اینکه اجرا بشه
با توابع آماده در php می تونی جولوی این حملات ساده رو بگیری . حذف تگ های html & JS :

strip_tags();

شما به دنبال نحوه نفوذ و انواع نفوذ تحقیق کن تا بفهمی چطوری وارد میشن و بعدش جولوشون رو بگیری . بعضی مواقع ، انقدر برنامه نویسی پیچیده میشه که یک هکر لابلای پیچیدگی کدنویسی یه راه حلی برای نفوذ پیدا می کنه که اصلا ربطی به تزیق کدها و ... نداره .
یه برنامه نویس خوب یک هکر خوبه و یک هکر خوب یک برنامه نویس خوبه.

mamad_za
جمعه 04 دی 1394, 20:06 عصر
دوست عزیز ، این توابع کلا نیاز نیستند ! شما باید حملات را بشناسین و بر اساس وروید ها و چگونگی ذخیره و نمایش اون ها از حملات جلوگیری کنین ، اگه توی همین انجمن php به دنبال sql injection یا XSS بگردی کلی پست خوب پیدا میکنی. چون شرایط حمله ها و نیاز های پروژه متفاوت هست این تابع به درد نمیخوره ! مثلا اگه لازم باشه از کاربر اطلاعات HTML بگیریم یا کاربری متنی را به نصوت نقل قول جستجو کرد این تابع دردسر سازه و یا باید به برنامه بخش های بیخودی اضافه منیم یا کلا هی توی تابع شرط بگذاریم.

مرسی که جواب دادین قبلا تحقیق کرده بودم اما وقتی گفتین از دیروز تا حالا دوباره روش تحقیق کردم و چنتا اشتباهم مشخص شد و ممنون میشم شما اگه تکمیلش کنید .
1- اینکه من تو کدام از PDO.bindparam دارم استفاده می کنم و پس عملا دیگه استفاده از این
$output = mysql_real_escape_string($output);
کد اشتباه فکر کنم ؟ درسته؟
2- زمانی که من دارم توسط url فقط آیدی می فرستم دیگه دیگه نیاز به استفاده از این توابع نیست فقط با یه intval چک می کنم ورودی رو بعد به صورت pdo می فرستمش ؟
3-تمام ورودی ها رو هم به صورت توابع is_numric یا preg_match('/^[0-9]{1,11}$/' چک می کنیم؟ بستگی به ورودی داره
4- برای جاهایی هم که نیاز به این داریم که کدهای html وارد بشه از $output = htmlspecialchars(trim($input),ENT_QUOTES, 'utf-8');
به همراه اعتبار سنجی های دیگه استفاده می کنیم ؟

یه سوال دیگه که دارم اینه که اگه بخوایم این تابعی که تو اولین بار استفاده کردم رو بهینه کنیم به چه صورتیه؟ و به درد چه جاهایی می خوره ؟

mamad_za
جمعه 04 دی 1394, 20:09 عصر
با توابع آماده در php می تونی جولوی این حملات ساده رو بگیری . حذف تگ های html & JS :

strip_tags();

شما به دنبال نحوه نفوذ و انواع نفوذ تحقیق کن تا بفهمی چطوری وارد میشن و بعدش جولوشون رو بگیری . بعضی مواقع ، انقدر برنامه نویسی پیچیده میشه که یک هکر لابلای پیچیدگی کدنویسی یه راه حلی برای نفوذ پیدا می کنه که اصلا ربطی به تزیق کدها و ... نداره .
یه برنامه نویس خوب یک هکر خوبه و یک هکر خوب یک برنامه نویس خوبه.

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

Unique
شنبه 05 دی 1394, 01:17 صبح
1- اینکه من تو کدام از PDO.bindparam دارم استفاده می کنم و پس عملا دیگه استفاده از این
بله ، وقتی از پارامتر ها استفاده میکنید کلا sql injection معنی پیدا نمیکنه و نیازی به escape کردن نیست. البته برخی مواقع نیاز هست که query را اصطلاحا inline و بدون پارامتر بنویسیم که باید از escape استفاده کنید. کلا توصیه میکنم از کلاس های خوبی که برای کار با Database هست استفاده کنید.


2- زمانی که من دارم توسط url فقط آیدی می فرستم دیگه دیگه نیاز به استفاده از این توابع نیست فقط با یه intval چک می کنم ورودی رو بعد به صورت pdo می فرستمش ؟
3-تمام ورودی ها رو هم به صورت توابع is_numric یا

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

function isDigit($num){
return (!ctype_digit($num) || (strlen($num) == 0)) ? false : true;
}

اگه بخوای توی query های inline که پارامتری نیستن از عدد استفاده کنی بیا از تابع sprintf استفاده کن ! اینطوری ورودی فیلتر میشه خودش.


برای جاهایی هم که نیاز به این داریم که کدهای html وارد بشه از
اگه بخوای متنی را حتی اگه مقادیر html داشت به صورتی متنی نشون بدی باید از htmlspecialchars و htmlentities استفاده کنی ولی اگه بخوای واقعا خود Html را نمایش بدی و خیالت از xss راحت باشه از HtmlPurifier (http://htmlpurifier.org/) استفاده کن.


یه سوال دیگه که دارم اینه که اگه بخوایم این تابعی که تو اولین بار استفاده کردم رو بهینه کنیم به چه صورتیه؟ و به درد چه جاهایی می خوره ؟
این توابع کلی فقط مایه دردسر هستند و باید بر اساس نوع داده وروید و خروجی امنیت را تامین کنی.
همین مطالبی که گفتی تا ۹۰ درصد امنیتت را تامین میکنه ! CSRF و Session Hijacking را رعایت کنی میشه ۹۹ درصد. اون ۱ درصد هم میشه اشتباهات سهوی شما و وب سرورتون.