PDA

View Full Version : تعیین سطح دسترسی به جدول sql



linux
پنج شنبه 11 اسفند 1384, 11:53 صبح
من از sql2000 استفاده می کنم یک فرم برای ورود اطلاعات به جدول بانک اطلاعات درست کردم
حالا می خواهم که وقتی کاربر این فرم را باز می کند قبل از هر کاری تشخیص بدم که آیا این کاربر دسترسی به این جدول را دارد یا خیر

ali_kolahdoozan
پنج شنبه 11 اسفند 1384, 13:05 عصر
این سطح دسترسی رو توی برنامه نویسی تولید کنید نه در بانکی که استفاده می کنید . یا فیلدهایی جهت تعیین دسترسی بسازید . وقتی کاربر رمز و نام کاربری را زد مقدارهای ذخیره شده در فیلدها درون یکسری متغیر public قرار گیرد و در حین اجرای هر فرم چک شود که آیا کاربر اجازه دسترسی دارد یا نه . دسترسیها هم موقع ساخت یک کاربر جدید پرسیده شود

asilverisis
پنج شنبه 11 اسفند 1384, 13:39 عصر
سلام
دستور Sql زیر را اجرا کنید



sp_helprotect 'TableName','UserName'

linux
پنج شنبه 11 اسفند 1384, 13:46 عصر
این سطح دسترسی رو توی برنامه نویسی تولید کنید نه در بانکی که استفاده می کنید . یا فیلدهایی جهت تعیین دسترسی بسازید . وقتی کاربر رمز و نام کاربری را زد مقدارهای ذخیره شده در فیلدها درون یکسری متغیر public قرار گیرد و در حین اجرای هر فرم چک شود که آیا کاربر اجازه دسترسی دارد یا نه . دسترسیها هم موقع ساخت یک کاربر جدید پرسیده شود
کاری که خود sqlserver 2000 انجام می دهد را چرا دوباره خودمان باید انجام دهیم؟؟
شما می تونید در sqlserver کاربر تعریف کنید سطح دسترسی به جدولها حتی به feild ها هم
را هم کنترل کنید.

HO457
پنج شنبه 11 اسفند 1384, 15:18 عصر
لینوکس جان فرض کن برنامت روی شبکه اجرا میشه، بعد تو مثلا 100 تا کاربر با سطح های دسترسی مختلف داری.همچنین امکان اضافه کردن کاربر جدید به برنامه یا حذف کاربر یا تغییر سطوح دسترسی رو تو برنامت داری. بهترین کار اینه که بیای توی دیتابیس یه جدول برای سطوح دسترسی بزاری تا از اون سطح اعتبار کاربر رو تعیین کنی. خیلی راحت میشه اینکار رو کرد.
یه مثال خیلی ساده مثلاَ یه جدول با 4 تا فیلد UID,DelI,AddI,ChgI داشته باش. این جدول رو لینک کن به جدول اصلی که اطلاعات کاربرا توش ذخیره شده، بعد مثلاَ وقتی یه کاربر خواست یه مقدار رو پاک کنه، بیاد چک کنه مثلا اگر فیلد AddI یک بود اینکار رو انجام بده در غیر اینصورت نه.

Hamedm
پنج شنبه 11 اسفند 1384, 15:23 عصر
کاری که خود sqlserver 2000 انجام می دهد را چرا دوباره خودمان باید انجام دهیم؟؟
شما می تونید در sqlserver کاربر تعریف کنید سطح دسترسی به جدولها حتی به feild ها هم
را هم کنترل کنید.

سلام

ببین عزیز جان بستگی به کارت داره. ولی من سطح دسترسی در برنامه رو ترجیح میدم.
یک پروژه حقوق و دستمزد داشتم که باید سطح دسترسی هر کاربری که به برنامه LOGIN میکرد رو هم تعیین میکردیم. مثلا فرم1 مثلا به اطلاعات جدول2 و جدول3 نیاز داشت. و فرم2 به اطلاعات جدول1 و جدول2 و جدول4 . حالا کاربری فقط اجازه دیدن فرم 2 رو داره. با این تفاصیل باید Permissionها چگونه باشه؟ تکلیف جدول2 این وسط چیه؟

هر فرم که به یک جدول ارتباط نداره که دسترسی رو در SQL Server بدیم. ممکنه این وسط کلی جدول و فیلد مشترک باشه.

خوشحال میشم بقیه دوستان و مخصوصا جناب زواری در این زمینه اظهار نظر کنند.


در پناه حق موفق باشید و پرتوان

HO457
پنج شنبه 11 اسفند 1384, 15:36 عصر
حامد حان، تو اکثر برنامه هایی که دیدم و برنامه هایی که نوشتم سطح دسترسی کاربر به این صورت تعیین میشه که مثلا کاربر امکان گزارش گیری، امکان اضافه کردن سند جدید، امکان حذف اطلاعات، تغییر اطلاعات و ... که برای هر بخش به صورت جدا قابل تعریف هستش. نه که بیاد بر اساس جدول سطح دسترسی رو تعیین کنه.
مثلاَ یه برنامه بود که کاربر فقط میتونست امکان تعریف سند رو داشته باشه. حالا فرض کن من بیام امکان دسترسی کاربر به جدول حسابهای معین رو ببندم، صد در صد کاربر برای اینکه بیاد سند ایجاد کنه باید به اون جدول هم دسترسی داشته باشه.

Hamedm
پنج شنبه 11 اسفند 1384, 16:57 عصر
حامد حان، تو اکثر برنامه هایی که دیدم و برنامه هایی که نوشتم سطح دسترسی کاربر به این صورت تعیین میشه که مثلا کاربر امکان گزارش گیری، امکان اضافه کردن سند جدید، امکان حذف اطلاعات، تغییر اطلاعات و ... که برای هر بخش به صورت جدا قابل تعریف هستش. نه که بیاد بر اساس جدول سطح دسترسی رو تعیین کنه.
مثلاَ یه برنامه بود که کاربر فقط میتونست امکان تعریف سند رو داشته باشه. حالا فرض کن من بیام امکان دسترسی کاربر به جدول حسابهای معین رو ببندم، صد در صد کاربر برای اینکه بیاد سند ایجاد کنه باید به اون جدول هم دسترسی داشته باشه.

سلام

جناب HO457، من منظورم این نبود که بیایم بر اساس جدول سطح دسترسی رو بدیم. چون اگه بخواهیم در SQL Server سطح دسترسی رو بدیم فقط میتوانیم روی جداول و فیلدها این کارو کنیم، من همچین مثالی زدم تا جناب لینوکس متوجه بشند که سطح دسترسی در جداول و فیلدها امکان پذیر نیست.

من هم دقیقا منظورم حرف جنابعالی است.
بقیه دوستان نظری ندارند؟

در پناه حق موفق باشید و پرتوان

بابک زواری
پنج شنبه 11 اسفند 1384, 17:08 عصر
اگر برای End User شما میخواهید تعیین سطح دسترسی کنید بالطبع باید همین کار رو انجام بدید که دوستان گفتن ؛ یعنی داخل برنامه تعیین کنید .
بحث مفصلی داره اینکه در چه مواردی از داخل برنامه باشه و در چه مواردی هم از داخل برنامه و هم از داخل دیتا بیس .
و عموما چون ما به کاربرامون اجازه نمیدهیم که به بانک دسترسی داشته باشن پس تعیین سطح دسترسی از داخل برنامه هست .

linux
پنج شنبه 11 اسفند 1384, 20:23 عصر
سلام

ببین عزیز جان بستگی به کارت داره. ولی من سطح دسترسی در برنامه رو ترجیح میدم.
یک پروژه حقوق و دستمزد داشتم که باید سطح دسترسی هر کاربری که به برنامه LOGIN میکرد رو هم تعیین میکردیم. مثلا فرم1 مثلا به اطلاعات جدول2 و جدول3 نیاز داشت. و فرم2 به اطلاعات جدول1 و جدول2 و جدول4 . حالا کاربری فقط اجازه دیدن فرم 2 رو داره. با این تفاصیل باید Permissionها چگونه باشه؟ تکلیف جدول2 این وسط چیه؟

هر فرم که به یک جدول ارتباط نداره که دسترسی رو در SQL Server بدیم. ممکنه این وسط کلی جدول و فیلد مشترک باشه.

خوشحال میشم بقیه دوستان و مخصوصا جناب زواری در این زمینه اظهار نظر کنند.


در پناه حق موفق باشید و پرتوان
یک کاربر کرمی هم پیدا میشه یه اکسس پروجکت می سازه اگر شما اینجا سطح دسترسی برای کاربر تعیین نکرده باشید این کاربر یک بلایی سر دیتا بیس می یاره که همه زحمت های یک تیم 10 نفره را بر باد میده.
من فکر می کنم میشه با استفاده از تعریف رل ها و کاربرها در دیتابیس سطح دسترسی را مشخص کرد.
مثلا برای مثال شما خوب باید بگم در هر برنامه تعداد رل ها مشخص هست میشه اینطور تصور کرد که یک رل داریم به نام رل1 که کارش ورود دیتا هست یک رل دیگه داریم به نام رل2 که کارش گزارش گیری هست حالا دسترسی ها را برای رل ها تعریف می کنیم رل یک به همه جداول دسترسی خواندن و نوشتن داره و رل2 به بعضی از جداول دسترسی خواندن و به بعضی دسترسی نداره حالا موقع اجرای برنامه بر اساس نام کاربر رل را مشخص کرده و تصمیم می گیرم که این رل حق دسترسی به فرم را دارد یا نه.
من سر این پرسجوها (این کلمه پرسجو پرسیدن و جوستجو کردن به نظرم معادل خوبی هست) مشکل دارم.

Hamedm
پنج شنبه 11 اسفند 1384, 20:57 عصر
یک کاربر کرمی هم پیدا میشه یه اکسس پروجکت می سازه اگر شما اینجا سطح دسترسی برای کاربر تعیین نکرده باشید این کاربر یک بلایی سر دیتا بیس می یاره که همه زحمت های یک تیم 10 نفره را بر باد میده.

سلام

وقتی که سطح دسترسی رو بصورت اس کیو ال سروری تعریف کنیم و توی اون هم یک کاربر اون هم sa داشته باشیم(برنامه با این Permission به دیتابیس وصل بشه)، کاربر چطوری میتونه با اکسس پروجکت دیتابیس رو بر باد بده؟

در پناه حق موفق باشید و پرتوان

Hamedm
پنج شنبه 11 اسفند 1384, 21:01 عصر
من فکر می کنم میشه با استفاده از تعریف رل ها و کاربرها در دیتابیس سطح دسترسی را مشخص کرد.

سلام مجدد

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

در پناه حق موفق باشید و پرتوان

linux
پنج شنبه 11 اسفند 1384, 22:06 عصر
سلام

وقتی که سطح دسترسی رو بصورت اس کیو ال سروری تعریف کنیم و توی اون هم یک کاربر اون هم sa داشته باشیم(برنامه با این Permission به دیتابیس وصل بشه)، کاربر چطوری میتونه با اکسس پروجکت دیتابیس رو بر باد بده؟

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

meh_secure
پنج شنبه 11 اسفند 1384, 23:34 عصر
خود microsoft هم سطح دسترسی از فرم ها رو پیشنهاد میده.(البته به صورت استاندارد)

asilverisis
جمعه 12 اسفند 1384, 09:22 صبح
سلام
من یه جوابی دادم ولی کسی در موردش نظر نداد

به نظر من سطح دسترسی در SqlServer مطمئن تره (هم عقیده با Linux)

و کاملا هم قابل کنترل
ضمنا هیچ کد فوق العاده ای نیاز نیست نوشته بشه
ما برنامه رو خیلی عادی می نویسیم طوری که بدون در نظر گرفتن Permission ها
اطلاعات رو ذخیره کنه در نهایت هنگام ,Update از یک بلوک try Catch استفاده می کنیم

حال اگر Error ای داد چک می کنیم می تونه یکی از این Error ها مربوط به Permission باشه
اونوقت بهش پیغام میدیم که شما مجوز ندارید ...

meh_secure
جمعه 12 اسفند 1384, 15:20 عصر
ما هم نمی گیم Sql Server مطمئن نیست. گفته شده که باتوجه به شرایط و محیط این انتخاب رو انجام بدید. حالا شما با SQL Server راحتی. یه عده با Windows برخی هم مثل خودم ترکیب این دو.

AminSobati
شنبه 13 اسفند 1384, 00:12 صبح
سلام به همه دوستان عزیز،
به طور کلی، دو نوع ساختار در پیاده سازی امنیت روی بانک اطلاعاتی وجود داره. روش اول این هست که تماما از امکانات Security خود SQL Server مثل Permissionها استفاده کنیم. در این حالت مثلا شما با استفاده از یک View میتونین متوجه بشین کاربر فعلی به چه جداولی دسترسی داره:
SELECT * FROM Information_Schema.Tables
و یا اینکه از SP_Helprotect که دوستان اشاره کردند استفاده کنیم.
اما در یک نرم افزار، مثلا ثبت یک سند، شاید به مفهوم دسترسی به چندین جدول باشه. لذا ممکنه ترجیح بدین به جای کنترل دسترسی کاربر به تک تک جدول، موضوع دسترسی اون به بخشهای مختلف نرم افزار رو بررسی کنیم. این روش به Hand-Roled Security معروفه و کاملا رایجه. یکی از راهها اینه که جدولی داشته باشیم و به تعداد بخشها (یا عملیات ممکن) که قصد داریم Permission تعریف کنیم، فیلد اضافه کنیم. حالا هر کاربر، یک رکورد در این جدول برای خودش داره. اگر اختیاری رو قراره بهش بدیم، فیلد مربوطه رو 1 و در غیر اینصورت 0 میکنیم. در این حالت وقتی کاربر Login میکنه، با select کردن یک رکورد (مربوط به کاربر)، میتونیم تمام اختیاراتش رو بدست بیاریم و به تناسبش، بعضی Menuها رو فعال یا غیر فعال کنیم.

Hamedm
شنبه 13 اسفند 1384, 01:11 صبح
سلام به همه دوستان عزیز،
به طور کلی، دو نوع ساختار در پیاده سازی امنیت روی بانک اطلاعاتی وجود داره. روش اول این هست که تماما از امکانات Security خود SQL Server مثل Permissionها استفاده کنیم. در این حالت مثلا شما با استفاده از یک View میتونین متوجه بشین کاربر فعلی به چه جداولی دسترسی داره:
SELECT * FROM Information_Schema.Tables
و یا اینکه از SP_Helprotect که دوستان اشاره کردند استفاده کنیم.
اما در یک نرم افزار، مثلا ثبت یک سند، شاید به مفهوم دسترسی به چندین جدول باشه. لذا ممکنه ترجیح بدین به جای کنترل دسترسی کاربر به تک تک جدول، موضوع دسترسی اون به بخشهای مختلف نرم افزار رو بررسی کنیم. این روش به Hand-Roled Security معروفه و کاملا رایجه. یکی از راهها اینه که جدولی داشته باشیم و به تعداد بخشها (یا عملیات ممکن) که قصد داریم Permission تعریف کنیم، فیلد اضافه کنیم. حالا هر کاربر، یک رکورد در این جدول برای خودش داره. اگر اختیاری رو قراره بهش بدیم، فیلد مربوطه رو 1 و در غیر اینصورت 0 میکنیم. در این حالت وقتی کاربر Login میکنه، با select کردن یک رکورد (مربوط به کاربر)، میتونیم تمام اختیاراتش رو بدست بیاریم و به تناسبش، بعضی Menuها رو فعال یا غیر فعال کنیم.
سلام آقای ثباتی

من همیشه از روش Hand-Roled Security استفاده میکنم اما اقای لینوکس گفتند که ممکنه یک کاربر با Access Project بیاد تمام اطلاعاتو بر باد بده. میشه در این مورد هم توضیح بدید.

در پناه حق موفق باشید و پرتوان

HO457
شنبه 13 اسفند 1384, 02:35 صبح
من همیشه از روش Hand-Roled Security استفاده میکنم اما اقای لینوکس گفتند که ممکنه یک کاربر با Access Project بیاد تمام اطلاعاتو بر باد بده. میشه در این مورد هم توضیح بدید.

همه چیز وقتی از طرف خود برنامه نویس تعیین بشه خیلی بهتره، چون چیزی که در میاد کاملاَ دلخواه آدم هست. مثلاَ شما میتونی برای ایجاد کانکشن به بانکت از ویزارد دات نت استفاده کنی یا بیای تمام موارد مورد نیاز رو با کد تعریف کنی. خود مایکروسافت روش دوم رو توصیه میکنه، برای تعیین سطح دسترسی هم همینه، اگه بخوای بیای تو خود SQL دسترسی کاربرها رو محدود کنی صد در صد روش HRS خیلی بهتر جواب میده. یه موضوع دیگه که هست اینه که شما حتی با بانک اکسس هم میتونی یه بانک اطلاعاتی برای برنامت ایجاد کنی که امنیت بسیار بالای داشته باشه (از طریق کد). پس معلوم میشه که امنیت فقط و فقط به برنامه نویس و کسی که مدیر پروژه هست بستگی داره. یه مقاله در این باره داشتم. اگه پیداش کنم میزارم اینجا که همه دوستان بتونن دانلود کنن.

habedijoo
شنبه 13 اسفند 1384, 08:54 صبح
سلام به همگی دوستان

به نظر شخصی من این بحث دو قسمت داره : 1 - میزان کارایی و راحتی 2- جنبه تجاری
دوستان چیزی که من همیشه شاهدش بودم و توی بحث ها نیومده بود ، جنبه تجاری موضوع هست .
ببینید وقتی یه مدیر پروژه سیاست برنامه رو مشخص میکنه حتما باید نکات مدیریتی و مالی قضیه رو در نظر بگیره .
فرض کنید شما در سطح Sql Server سطوح دسترسی را تعریف کنیم . با این کار اولا استفاده کننده یه جورایی نیازمند به یک ادمین برای بانک اطلاعاتش میشه . در ثانی میباید جنبه تجاری قضیه و پشتیبانی نرم افزار رو هم در نظر گرفت .
وقتی سطح دسترسی در Sql Server تعریف شده باشه . ادمین کاربری به راحتی می تونه سطوح دسترسی را تغییر بده و مدیریت کنه . این مورد از نظر ساختار برنامه بسیار قویه ولی از نظر تجاری جالب به نظر نمیرسه . چون باید نبض نرم افزار دست تولید کنندش باشه نه استفاده کننده . اگر سطوح دسترسی در برنامه باشه برای هر تغییر یا تکمیلی شما میتوانید درآمد بیشتری نصیب خود یا شرکتتون کنید .

AminSobati
شنبه 13 اسفند 1384, 23:33 عصر
سلام آقای ثباتی

من همیشه از روش Hand-Roled Security استفاده میکنم اما اقای لینوکس گفتند که ممکنه یک کاربر با Access Project بیاد تمام اطلاعاتو بر باد بده. میشه در این مورد هم توضیح بدید.

در پناه حق موفق باشید و پرتوان
سلام،
به هر حال Access Project هم باید به نحوی به SQL Server لاگین کنه. اگر این لاگین در اختیار کاربر نباشه پس Access Project هم برای کاربر سودی نداره.
از طرفی شما میتونین از کاربر، Username و Password دریافت کنین ولی اینها رو خودتون در جدولی نگه داری کنید و جدای از لاگین های SQL Server باشه. پس کاربر با این Username و Password نمیتونه اصلا به SQL Server وارد بشه.
از طرفی میتونین از امکانات لاگین SQL Server استفاده کنین و بعد از اینکه کاربر Connection رو باز کرد و از Authentication مطمئن شدین، حالا اون رو ببندین و مثلا با sa (دور از چشم کاربر، در برنامه کامپایل شده) مجددا Connection باز کنین. ولی نباید به اون لاگین اولیه در SQL Server هیچ گونه Permission داده باشید. فقط در حد ورود یا اصطلاحا Authentication. در غیر اینصورت همون مشکل Access Project پیش میاد

Hamedm
شنبه 13 اسفند 1384, 23:48 عصر
سلام



از طرفی میتونین از امکانات لاگین SQL Server استفاده کنین و بعد از اینکه کاربر Connection رو باز کرد و از Authentication مطمئن شدین، حالا اون رو ببندین و مثلا با sa (دور از چشم کاربر، در برنامه کامپایل شده) مجددا Connection باز کنین. ولی نباید به اون لاگین اولیه در SQL Server هیچ گونه Permission داده باشید. فقط در حد ورود یا اصطلاحا Authentication. در غیر اینصورت همون مشکل Access Project پیش میاد
ایده جالبیه. ممنون.

در پناه حق موفق باشید و پرتوان

HO457
یک شنبه 14 اسفند 1384, 01:36 صبح
اینجا رو یه نیگاه بندازید:
http://www.barnamenevis.org/forum/showthread.php?p=198434#post198434