PDA

View Full Version : Store procedure ها از باگ XSS جلوگیری میکنن ؟



Veteran
پنج شنبه 20 تیر 1392, 11:28 صبح
عرض سلام خدمت تمامی دوستان :قلب:

من توی پروژه ایی که در دست برنامه نویسی قرار داره دارم از SP ها استفاده میکنم برای جلوگیری از SQL injection
مثلا برای وارد کردن به جدول


CREATE PROCEDURE `sp_content_list_Insert`(IN _title varchar(255), IN _des text, IN _parent int, IN _date bigint, IN _tags varchar(255))
BEGIN
INSERT INTO `content_list`
(`title` , `des` , `parent` , `date` , `tags` )
VALUES(_title , _des , _parent, _date , _tags );
END

حالا ما اینو با کوئری های پارامتر دار PDO اجرا میکنیم تا از SQL injection جلو گیری کنیم
پارامتر های خود SP هم که نوع داده دارن !
اما حالا میخوام ببینم از باگ XSS هم جلوگیری میکنه ؟!
اخه من خودم
اومدم دستی توی دیتابیس اینو وارد کردم
<script>alert('hacked')</script>
و بعد که توی برنامه مقادیر رو از بانک خودنم و چاپ کردم
توی برنامه پیغام hacked به نمایش دراومد
اما
از طریق برنامه به وسیله SP هم که وارد کردم مقداری که از طریق برنامه وارده بانک شد اینه
&lt;script&gt;alert('hacked')&lt;/script&gt;
و بعدش برنامه رو اجرا کردم ولی پیغام نمایش داده نشد.مثل ی بچه خوب روی صفحه چاپ شد
به عبارتی خنثی شد.
======
حالا میخوام ببینم تا همین حد برای XSS کافیه ؟
راه دور زدن ممکنه داشته باشه ؟

ce_safdari
پنج شنبه 20 تیر 1392, 11:44 صبح
سلام

خود مایکروسافت کامل برات تضیح داده اینجا (http://msdn.microsoft.com/en-us/library/ff649310.aspx)رو بخون

Veteran
پنج شنبه 20 تیر 1392, 11:49 صبح
ASP.NET نمیخوام که.
من اینجا در مورد امنیت این کار توسط SP ها و PDO سوال داشتم.

h.rezaee
پنج شنبه 20 تیر 1392, 12:31 عصر
سلام.خوب بود قبل از ایجاد تاپیک یک سرچی می کردید .
SP توانایی جلوگیری از XSS را ندارد. برای این کار می توانید از function های مثل htmlentities ، strip_tags و .... و یا از کتابخانه htmlpurifier استفاده کنید.
یک سر به این تاپیک (http://barnamenevis.org/showthread.php?406867-function%D9%87%D8%A7%DB%8C-%D9%85%D8%B1%D8%A8%D9%88%D8%B7-%D8%A8%D9%87-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-XSS&highlight=xss) بزنید.

Veteran
پنج شنبه 20 تیر 1392, 12:37 عصر
سرچ کردم.
اما میخواستم ببینم تا همینجا که به وسیله PDO و SP ما این رو
<script>alert('hacked')</script>
به بانک ارسال کردیم و در بانک به این شکل
&lt;script&gt;alert('hacked')&lt;/script&gt;
دخیره شد.و موقعه نمایش هیچ کاره خاصی انجام نشد(عدم نمایش پیغام hacked)
کافی هست یا نه !

h.rezaee
پنج شنبه 20 تیر 1392, 12:48 عصر
سرچ کردم.
اما میخواستم ببینم تا همینجا که به وسیله PDO و SP ما این رو
<script>alert('hacked')</script>
به بانک ارسال کردیم و در بانک به این شکل
&lt;script&gt;alert('hacked')&lt;/script&gt;
دخیره شد.و موقعه نمایش هیچ کاره خاصی انجام نشد(عدم نمایش پیغام hacked)
کافی هست یا نه !
این توابع که معرفی کردم دقیقا همین کار رو پیاده سازی می کنند .
بهتره از روشی که بیان شد استفاده شود تا دیگر مشکلی نباشد . چون یک سری کوئری ها هستند ( در اینترنت زیاد است ) که میان و کوکی هایی رو که دارای نام کاربری و رمز عبور هستند رو برای هکر ایمیل می کنه.

Veteran
پنج شنبه 20 تیر 1392, 12:49 عصر
یک قسمت از بحث به این تابع اشاره کرده بودین

function sanitize($value)
{
$result = htmlentities($value);
$result = stripcslashes($result);
$result = strip_tags($result);
return $result;
}
من از خروجی این تابع یک رکورد به بانک اضافه کردم و با مقداری که توسط PDO ثبت شده بود مقایسه کردم.هردو یک مقدار بودن
یعنی اون رشته ایی که در بانک ذخیره میشه باهم برابر بودن.
====
اما اینکه SP نمیتونن اینکارو بکنن درسته.چون من الان SP رو در خود MYSQL صدا زدم و مقدار

<script>alert('hacked')</script>
بهش دادم.به همین صورت در بانک ذخیره میکنه !
اما وقتی SP رو با PDO صدا میزنم به این شکل در بانک ذخیره میشه
&lt;script&gt;alert('hacked')&lt;/script&gt;

Unique
پنج شنبه 20 تیر 1392, 14:19 عصر
حالا که شما کار خودتون را شروع کردین اما استفاده از Prepared statement ها کاملا شما را در برابر حملات sql injection محافظت میکرد (حالا چه با pdo و چه با mysql) و نیازی به کلنجار رفتن با SP ها که نسبتا هم در mysql تازه وارد هستند نبود !

Veteran
پنج شنبه 20 تیر 1392, 15:11 عصر
(حالا چه با pdo و چه با mysql)
MYSQL ?
مگه mysql هم از Prepared statement پشتیبانی میکنه ؟
فکر نمیکنم !
شاید منظورتون mysqli هست ؟

Unique
شنبه 22 تیر 1392, 00:07 صبح
بله mysqli بود ! داریم کم کم mysql را فراموش میکنیم ! این افزونه دیگه deprecate شده حساب میشه ! برای mysql باید ارجاع داد به mysqli !