برگزیده های پرشین تولز

SQL Injection

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
به نقل از miladmovie :
تا اونجای که من می دونم خوده PHP این کار رو می کنه با تنظیم زیر :

کد:
 magic_quotes_gpc = On       
;     Input data is no longer escaped with slashes so that it can be sent into
;     SQL databases without further manipulation.  Instead, you should use the
;     function addslashes() on each input element you wish to send to a database.


عالی بود
ممنون ! :)
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
shankimout
اگه از PHP استفاده می کنی این چیزی که میلاد گفت یه تست بکن
واسه آدمهای تنبلی مثله من که خوبه !!
کار کردنش هم کار کردم ردیفه !
 

Moein

Registered User
تاریخ عضویت
2 مارس 2004
نوشته‌ها
1,150
لایک‌ها
64
محل سکونت
تهران - شهرک غرب
آرتین جان
بازم می‌گم خیلی راحت می‌شه یه کد SQL داد که کوتیشن نداره و دیگه get_magic_quotes_gpc هم فایده‌ای نداره.
مثلاً توی این لینک اگه بجای 45 کد زیریش رو بزاریم که get_magic_quotes_gpc هم روش تاثیری نداره براحتی کل دیتابیس پاک می‌شه:

site.com/add.php?ProductId=45
کد:
1;drop `products`;
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
moein
جواب سئوال شما بر میگیرده به اولین پست این تاپیک !
که اصول تظنیمات دسترسی هر یوزر تعیین بشه !

من فکر نمی کنم کسی به این DROP نیاز داشته باشه مگر در شرایط خیلی خیلی استثنایی که اون هم باید یوزر نیم جدا داشته باشه مثلا اسکریپت هایی که برنامه نصب می کنن که اون هم اصلا با کاربط رابطه ندارن

حتی میشه چند تا یوزر نیم تعریف کرد که مثلا یه یوزر عادی که فقط select insert و این کارارو می کنه و یه یورز دیگه که دستیابی بیشتری داشته باشه و برای کارهای دیگه ای باشه

خوب با این اوصاف اگه یه یوزر با دستیابی عادی که فقط select insert update و حتی delete داره باز هم این magic_quotes_gpc این مشکل رو حل نمیکنه ؟ یعنی باز روزنه ای هست ؟
 

Moein

Registered User
تاریخ عضویت
2 مارس 2004
نوشته‌ها
1,150
لایک‌ها
64
محل سکونت
تهران - شهرک غرب
اصلاً منطور من کد drop نبود.منظورم اینه که یه کد بدون داشتن کوتیشن هم می‌تونه به دیتابیس حمله کنه، حالا فرض کن update یا insert باشه.
اصلاً مهم نیست کدش چیه، مساله اینه که این تابع php فقط جلوی اجرای کدهایی رو می‌گیره که از کوتیشن استفاده کردند ولی یه کد مثل این که کوتیشن نداره رو بدون تغییر اجرا می‌کنه :
کد:
1;update `users` set `credit`=100000 where `id`=1120;

متوجه منظورم شدین یا بیشتر توضیح بدم؟
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
خوب با این تفاصیل خودت چه راهی رو پیشنهاد می کنی ؟
 

gavbandy

Registered User
تاریخ عضویت
15 فوریه 2005
نوشته‌ها
364
لایک‌ها
3
خوب شما بیا اون متغییری را که میگیری حتما بین ' ' قرار بده که مجبور بشه برای تمام کردن کوائری در حال اجرا حتما از ' استفاده کنه .
اینکه دیگه تری نداره
 

Moein

Registered User
تاریخ عضویت
2 مارس 2004
نوشته‌ها
1,150
لایک‌ها
64
محل سکونت
تهران - شهرک غرب
یک راه همین هست که داخل کوتیشن قرار بدیم ولی چون فیلد عددی هست نه متنی، بهتره که با تابعی مثل intval یا floatval اونو به عددی تبدیل کنیم مثل همون تابع پست 35 .
فکر می‌کنم اون تابع کاملی باشه.
 

phpkar

Registered User
تاریخ عضویت
11 آگوست 2005
نوشته‌ها
387
لایک‌ها
0
سن
42
محل سکونت
Mashhad
به نقل از moein :
اصلاً منطور من کد drop نبود.منظورم اینه که یه کد بدون داشتن کوتیشن هم می‌تونه به دیتابیس حمله کنه، حالا فرض کن update یا insert باشه.
اصلاً مهم نیست کدش چیه، مساله اینه که این تابع php فقط جلوی اجرای کدهایی رو می‌گیره که از کوتیشن استفاده کردند ولی یه کد مثل این که کوتیشن نداره رو بدون تغییر اجرا می‌کنه :
کد:
1;update `users` set `credit`=100000 where `id`=1120;

متوجه منظورم شدین یا بیشتر توضیح بدم؟


به پست اول من در این تاپیک مراجعه کن
من اونجا update , delete و ... رو گذاشته بودم توی تابع خودم

مهمترین مساله :
عدم اجازه دادن به user معمولی برای update و delete و ِ drop در database هست .
توی cpanel موقع ایجاد database باید privilage رو select داد فقط مگر در مواردیکه نیاز باشه
اونوقت اگر هکره خودشو خفه هم بکنه هر چقد هم اسکرپیت ما آسیپ پذیر باشه هیچ کار نمیتونه بکنه

وضمنا تمام ورودیها رو میشه با کلاس زیر چک کرد :
http://www.php45.com/class.php?id=1017
 

pooyesh1

کاربر تازه وارد
تاریخ عضویت
8 ژانویه 2006
نوشته‌ها
75
لایک‌ها
0
با سلام
ميشه لينك زير رو از نظر امنيت تست كنيد؟
لطفا چيزي رو هك نكنيد فقط بگيد ميشه وارد شد يا نه؟
http://www.vatovato.com/admin/login.php
ممنون ميشم اگه هك ميشه روش رو بگيد چون اگه هك نشه ميخوام روش انجام اون رو توضيح بدم شايد بدرد بخوره
 

Moein

Registered User
تاریخ عضویت
2 مارس 2004
نوشته‌ها
1,150
لایک‌ها
64
محل سکونت
تهران - شهرک غرب
به نقل از phpkar :
به پست اول من در این تاپیک مراجعه کن
من اونجا update , delete و ... رو گذاشته بودم توی تابع خودم

مهمترین مساله :
عدم اجازه دادن به user معمولی برای update و delete و ِ drop در database هست .
توی cpanel موقع ایجاد database باید privilage رو select داد فقط مگر در مواردیکه نیاز باشه
اونوقت اگر هکره خودشو خفه هم بکنه هر چقد هم اسکرپیت ما آسیپ پذیر باشه هیچ کار نمیتونه بکنه

وضمنا تمام ورودیها رو میشه با کلاس زیر چک کرد :
http://www.php45.com/class.php?id=1017
من که گفتم اصلاً منظورم نوع کد نیست.

منظورم کلاً فیلدهای عددی هست که مثلاً با قراردادن مقدار بین دو تا ' مشکل حل می‌شه.
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
آقا پس پرونده این sql injection بسته شد یا نه ؟
 

shankimout

Registered User
تاریخ عضویت
17 می 2004
نوشته‌ها
1,524
لایک‌ها
3
محل سکونت
ساری . . . . . . . . . . . . . . Permanently Bann

shankimout

Registered User
تاریخ عضویت
17 می 2004
نوشته‌ها
1,524
لایک‌ها
3
محل سکونت
ساری . . . . . . . . . . . . . . Permanently Bann
اول اینکه در تمام query جا هایی که باید مقایسه یا داده خارجی یا از متغیر های php استفاده بشه از ' استفاده کرد

همه ورودی ها باید با addslashes فیلتر بشن تا ' از خارج اعمال نشه که بتونه ' قبلی رو ببنده و ' جدید باز بشه .

اگر از strip_tags هم استفاده بشه خوبه

اگر کلا قبل addslashes تمام spical character بصورت decimal در بیان خوب میشه . هم اینکه باقی میمونن هم اینکه ارزش خودشونو از دست میدن .

برای کد کاراکتر مثلا فاصله %20 هم فیلتر قاعل بشیم

دیگه
 

zfarhad2003

Registered User
تاریخ عضویت
19 ژانویه 2004
نوشته‌ها
1,155
لایک‌ها
3
سن
40
محل سکونت
R7 register
به نظر من بهترین روش اینه که در مواقعی که ورودی یک عدده از intval استفاده بشه و در دیگر موارد علاوه بر اینکه که مقدار ورود در بین دو ' قرار بگیره از تابع زیر هم برای جلوگیری از هرگونه حمله ای استفاده بشه.

PHP:
function tep_db_input($string, $link = 'db_link') {
  global $$link;
 
  if (function_exists('mysql_real_escape_string')) {
    return mysql_real_escape_string($string, $$link);
  } elseif (function_exists('mysql_escape_string')) {
    return mysql_escape_string($string);
  }
 
  return addslashes($string);
}

فکر کنم این کاملترین روش باشه.
 

PersianPC

کاربر فعال صفحات داینامیک
کاربر فعال
تاریخ عضویت
9 فوریه 2005
نوشته‌ها
583
لایک‌ها
1
سن
34
محل سکونت
Tehran
به نظر من این تابع هم باید بیشتر مشکلات رو حل کنه ...

PHP:
      Function secure($string) {
            $string = addslashes(htmlspecialchars($string));
                        
            $string = ereg_replace('[\'"$#!;&*(){}=+^%?\]','', $string);
            return $string;
      }
 

Mehdi

مدیر بازنشسته
تاریخ عضویت
1 آگوست 2004
نوشته‌ها
5,602
لایک‌ها
49
محل سکونت
Anywhere
mysql_real_escape_string()
پيشنهاد ميشه;)
 
بالا