PDA

View Full Version : سوال: بالاخره یه تابع ایمن برای چک کردن فرمت url ها پیدا نمی شه ؟



idocsidocs
دوشنبه 08 اسفند 1390, 12:43 عصر
بالاخره یه تابع ایمن برای چک کردن فرمت url ها پیدا نمی شه ؟ (آقای شهرکی یه تابع سراغ ندارید؟)

MostafaEs3
دوشنبه 08 اسفند 1390, 15:42 عصر
//////////

idocsidocs
دوشنبه 08 اسفند 1390, 16:27 عصر
یعنی یه تابع جامع و مورد تایید برنامه نویس ها پیدا نمی شه؟

Reza1607
دوشنبه 08 اسفند 1390, 16:36 عصر
تابع filter_var

http://ir.php.net/manual/en/function.filter-var.php

MostafaEs3
دوشنبه 08 اسفند 1390, 16:52 عصر
//////////

idocsidocs
دوشنبه 08 اسفند 1390, 17:04 عصر
بنظرم توابع فیلتر پی اچ پی به هیچ دردی نمی خورن !

آیا این تابع باعث XSS نمی شه؟

$u='http://example.com?id=<script>alert("XSS")</script>';
if(filter_var($u, FILTER_VALIDATE_URL)){
echo 'This is a valid url ? <br />'.$u;
}

یه تابع بهتر سراغ ندارید؟

Net So
دوشنبه 08 اسفند 1390, 17:25 عصر
برای Valid کردن یا پاکسازی/Escape کردن URL ؟

برای اولی که دوستان معرفی کردن ، برای دومی هم :


<?php

function CleanURL($string)
{
$url = str_replace("'", '', $string);
$url = str_replace('%20', ' ', $url);
$url = preg_replace('~[^\\pL0-9_]+~u', '-', $url); // substitutes anything but letters, numbers and '_' with separator
$url = trim($url, "-");
$url = iconv("utf-8", "us-ascii//TRANSLIT", $url);// you may opt for your own custom character map for encoding.
$url = strtolower($url);
$url = preg_replace('~[^-a-z0-9_]+~', '', $url); // keep only letters, numbers, '_' and separator
return $url;
}

// echo cleanURL("Shelly's%20Greatest%20Poem%20(2008)"); // shellys-greatest-poem-2008

?>

MostafaEs3
دوشنبه 08 اسفند 1390, 17:30 عصر
//////////

MMSHFE
دوشنبه 08 اسفند 1390, 18:04 عصر
دوست عزیز، همونطور که جناب MostafaEs3 فرمودن، ازکار انداختن اسکریپتهای Inject شده در URL براحتی با htmlentities و strip_tags قابل انجام هست. البته در مواقعی که بخوایم آدرس واردشده توسط کاربر رو در صفحه اجرا کنیم (که ازنظر امنیتی این نوع طراحی ایرادهای جدی داره). اگر هم میخواین توی دیتابیس اطلاعات رو ذخیره کنید، با mysql_real_escape_string میتونید جلوی حملات SQL Injection رو بگیرین. حالا این وسط نمیدونم چرا اینقدر اصرار به امنیت بیشتر دارین وقتی طراحان PHP میگن این سطح از امنیت کافی هست (وقتی کدهای Injectشده کار نکنن، کافیه دیگه! نیست؟). اگه کار دیگری هم مدنظرتون هست، بفرمایید تا بدونیم چرا میگین دستورات امنیتی PHP به هیچ دردی نمیخورن؟

idocsidocs
دوشنبه 08 اسفند 1390, 19:00 عصر
چرا میگین دستورات امنیتی PHP به هیچ دردی نمیخورن؟ البته منظورم فیلترهای PHP بود !
فرض کنید یه کاربر بیاد توی بخش نظرات لینک زیر رو وارد کنه و ما هم از فیلتر پی اچ پی استفاده کنیم.

$u='http://example.com?id=<script>alert("XSS")</script>'; if(filter_var($u, FILTER_VALIDATE_URL)){ echo 'This is a valid url ? '.$u; }
در این صورت لینک درست هست و مشکلی نداره و طبیعتا ما باید این لینک رو توی صفحه نمایش بدیم. اما از اونجاییکه این لینک یه اسکریپت رو هم اجرا می کنه هر بار که صفحه لود بشه عبارت XSS نمایش داده می شه و این موضوع چندان مناسب نیست.

استفاده از تابع htmlentities برای url ها اصلا درست نیست.

MostafaEs3
دوشنبه 08 اسفند 1390, 19:08 عصر
//////////

MMSHFE
دوشنبه 08 اسفند 1390, 19:20 عصر
واقعاً چرا درست نیست؟ اگه از htmlentities استفاده نکنیم، چطور میخوایم کدها رو بی اثر کنیم؟ ضمناً فیلتر PHP فقط میگه که یک عبارت خاص میتونه یک URL باشه یا نه؟ کاری به اینکه خطرناک هست یا نه نداره!

idocsidocs
دوشنبه 08 اسفند 1390, 19:43 عصر
واقعاً چرا درست نیست؟ اگه از htmlentities استفاده نکنیم، چطور میخوایم کدها رو بی اثر کنیم؟

ممکنه داخل لینک از کاراکتر & استفاده بشه.

MMSHFE
دوشنبه 08 اسفند 1390, 19:44 عصر
خوب بشه. به ;amp& تبدیل میشه. حالا اگه این تبدیل رو دوست ندارین، بعدش با str_replace دوباره همین یک مورد رو به & تبدیل کنید.

idocsidocs
دوشنبه 08 اسفند 1390, 21:47 عصر
بغیر از کاراکتر & دیگه چه کاراکتری باید به حالت اول برگرده تا جلوی خراب شدن لینک گرفته بشه؟

البته اگه توی یه لینک کاراکترهای فارسی وجود داشت دیگه این کار جواب گو نیست و لینک خراب می شه. برای این کار تابع مناسب تری سراغ ندارد؟

MMSHFE
دوشنبه 08 اسفند 1390, 21:51 عصر
برای لینکهای فارسی از urlencode و urldecode استفاده کنید. البته مقادیر آرایه های SuperGlobal مثل GET_$ و... بطور خودکار decode میشن و نباید از urldecode روی اونها استفاده کنید.

idocsidocs
دوشنبه 08 اسفند 1390, 22:37 عصر
برای لینکهای فارسی از urlencode و urldecode استفاده کنید. البته مقادیر آرایه های SuperGlobal مثل GET_$ و... بطور خودکار decode میشن و نباید از urldecode روی اونها استفاده کنید.

این مقادیر رو توی فرمها از طریق متد پست می گیرم.

بنظرتون استفاده از urlencode و urldecode می تونه مشکلات امنیتی رو حل کنه؟

persian-boy
سه شنبه 09 اسفند 1390, 08:59 صبح
به تنهایی خیر

idocsidocs
سه شنبه 09 اسفند 1390, 10:49 صبح
هنوز تابع مناسبی پیدا نکردم.

MostafaEs3
سه شنبه 09 اسفند 1390, 14:07 عصر
//////////

idocsidocs
سه شنبه 09 اسفند 1390, 14:26 عصر
آقا همون تابع رو اینجوری بکار ببر ببین درست میشه یا نه :
اینطوری بدتر می شه!
کلا از این تابع نمی خوام استفاده کنم.

persian-boy
سه شنبه 09 اسفند 1390, 18:49 عصر
تابع هایی که معرفی شد ، مشکلشون چیه ؟ خب با استفاده از اون ها XSS صورت نمیگیره دیگه برادر من ! برای هر کاری قرار نیست که یک تابع باشه !

idocsidocs
شنبه 13 اسفند 1390, 23:55 عصر
هنوز من به تابع دلخواهم نرسیدم.

MostafaEs3
یک شنبه 14 اسفند 1390, 02:15 صبح
//////////