مطالب
نحوه ذخیره کلمات عبور در SQL Server
در این مقاله قصد داریم با نحوه ذخیره کلمات عبور در SQL Server و نحوه کار با آن‌ها آشنا شویم.
به عنوان توسعه دهنده / مدیر، احتمالا از طریق لاگین ویندوزی به SQL Server دسترسی پیدا می‌کنید. با این حال طریق گزینه‌ی دیگری به صورت تغییر در Instance SQL به حالت مخلوط (Mixed mode)، و از طریق SQL Login به SQL نیز می‌توان به آن دسترسی پیدا کرد. این SQL Logins در دیتابیس Master ساخته می‌شوند و از طریق sys.server_principals می توان لیست آنها را مشاهده کرد.
همچنین اطلاعات اضافی در sys.sql_logins وجود دارند که از sys.server_principals ارث‌بری شده‌اند. این ۳ ستون اضافه شده، is_policy_checked ،is_expiration_checked و password_hash هستند.
اگر شما با استفاده از تابع HASHBYTES یک متن مشخص را هش کنید و با کلمه عبوری که در زمان ساخت SQL Login وارد کرده‌اید مقایسه کنید، خواهید دید که این دو با هم برابر نمی‌باشند (ستون password_hash در sys.sql_logins). این اختلاف به علت اطلاعات اضافی (salt) است که به کلمه عبور افزوده شده‌است.
(x = Hash(PlainText + Salt به جای استفاده از (x = Hash(PlainText
SELECT HASHBYTES('SHA2_512',CAST(N'VMT' AS VARBINARY(MAX)))
--0x53DB8AFD20AA76B93DB7BBE855950E679288C843A83899ED4E713B829873306495B6025B7B4FBCDC1BA3EE19C7005BE843A30AC51050C9652E5D1E978DBC3A11
SELECT HASHBYTES('SHA2_512',CAST(N'VMT' AS VARBINARY(MAX))+0xBFE14699)
--0xEF934A8668BD52BEC3295C5DBD2E99555CC074AECBDF32A496C39851A35847DDA7270486B3EC3C77B99334693ECE598617F232C5DC3FCD67EC7D734196913A05
این کار به امنیت بیشتر کمک می‌کند؛ اگرچه SQL Server اطلاعات Salt را به عنوان بخشی از اطلاعات هش نگهداری می‌کند. اگر به ستون password_hash دقت کنید، Salt را مشاهده خواهید کرد.
0x0200  BFE14699  EF934A8668BD52BEC3295C5DBD2E99555CC074AECBDF32A496C39851A35847DDA7270486B3EC3C77B99334693ECE598617F232C5DC3FCD67EC7D734196913A05
همانطور که مشاهده می‌کنید 4 بایت (به صورت جدا شده) برابر با Salt استفاده شده در مثال قبل است. قسمت سمت راست Salt، هش کلمه عبور ماست.

حدس کلمه عبور مربوط به SQL Logins

با استفاده از قطعه کد زیر سعی در حدس کلمه عبور SQL Loginهای سیستم خودم را دارم. از نسخه SQL Server 2012 به بعد، الگوریتم هش کلمه عبور از SHA1 به SHA2-512 تغییر کرده‌است.
-- جدول کلمات مورد استفاده برای حدس کلمه عبور
DECLARE @WordList TABLE
    (
        [Plain] NVARCHAR (MAX)
    );

-- درج کلمه عبور با تغییر در نام کاربری
INSERT INTO @WordList ( [Plain] )
            SELECT [name] FROM [sys].[sql_logins]
            UNION
            SELECT REPLACE (REPLACE (REPLACE ([name], 'o', '0'), 'i', '1'), 'e', '3')
            FROM   [sys].[sql_logins]
            UNION
            SELECT REPLACE (REPLACE (REPLACE ([name], 'o', '0'), 'i', '1'), 'e', '3') + '.'
            FROM   [sys].[sql_logins]
            UNION
            SELECT REPLACE (REPLACE (REPLACE ([name], 'o', '0'), 'i', '1'), 'e', '3') + '!'
            FROM   [sys].[sql_logins];
-- درج کلمات معمول برای کلمه عبور
INSERT INTO @WordList ( [Plain] )
            SELECT N''
            UNION ALL
            SELECT N'password'
            UNION ALL
            SELECT N'sa'
            UNION ALL
            SELECT N'dev'
            UNION ALL
            SELECT N'test'
            UNION ALL
            SELECT N'server'
            UNION ALL
            SELECT N'123456'
            UNION ALL
            SELECT N'654321'
            UNION ALL
            SELECT N'asd!@#'
            UNION ALL
            SELECT N'VMT';

-- تشخیص نوع الگوریتم مورد استفاده در هش کردن کلمه عبور
DECLARE @Algorithm VARCHAR (10);
SET @Algorithm = CASE WHEN @@MICROSOFTVERSION / 0x01000000 >= 11
                          THEN 'SHA2_512'
                      ELSE 'SHA1'
                 END;

-- در صورت یافتن کلمه عبور اطلاعات مربوط به آن در این قسمت بدست می‌آید
SELECT
     [name] ,
     [password_hash] ,
     SUBSTRING ([password_hash], 3, 4)                                                                [Salt] ,
     SUBSTRING ([password_hash], 7, ( LEN ([password_hash]) - 6 ))                                    [Hash] ,
     HASHBYTES (@Algorithm, CAST([w].[Plain] AS VARBINARY (MAX)) + SUBSTRING ([password_hash], 3, 4)) [ComputedHash] ,
     [w].[Plain]
FROM [sys].[sql_logins]
     INNER JOIN @WordList [w]
                ON SUBSTRING ([password_hash], 7, ( LEN ([password_hash]) - 6 )) = HASHBYTES ( @Algorithm , CAST([w].[Plain] AS VARBINARY (MAX)) + SUBSTRING ([password_hash], 3, 4));

-- همه نام‌های کاربری و اطلاعات مربوط به آنها را در اینجا بدست می‌آید
SELECT
     [name] ,
     [password_hash] ,
     SUBSTRING ([password_hash], 3, 4)                             [Salt] ,
     SUBSTRING ([password_hash], 7, ( LEN ([password_hash]) - 6 )) [Hash]
FROM [sys].[sql_logins];
همانطور که مشاهده می‌کنید کلمه عبور دو تا از SQL Login‌ها را بدست آوردیم:

با تغییر در دیکشنری کلمات مربوط به کلمه عبور، کارهای بیشتری را می‌شود انجام داد.
یکی دیگر از روش‌های بررسی کلمه عبور استفاده از تابع  PWDCOMPARE است.
SELECT [name],[password_hash]
FROM sys.sql_logins
WHERE PWDCOMPARE(N'VMT',[password_hash]) = 1
مطالب
استفاده از قابلیت Script Data اس کیوال سرور 2008 از طریق برنامه نویسی

همانطور که مطلع هستید قابلیت تهیه عبارات Insert از جداول یک دیتابیس، به صورت استاندارد به management studio 2008 اضافه شده است. برای استفاده از این قابلیت از طریق برنامه نویسی به صورت زیر می‌توان عمل نمود:

الف) سه ارجاع را به اسمبلی‌های زیر اضافه نمائید:
Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo

ب) اکنون کدی که عملیات Script Data را با استفاده از قابلیت‌های SMO ارائه می‌دهد به صورت زیر خواهد بود:

using System;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Sdk.Sfc;

/// <summary>
/// تهیه اسکریپت رکوردها
/// </summary>
/// <param name="dbName">نام دیتابیس مورد نظر</param>
/// <param name="table">نام جدولی که باید اسکریپت شود</param>
/// <param name="instance">وهله سرور</param>
/// <param name="userName">نام کاربری جهت اتصال</param>
/// <param name="pass">کلمه عبور جهت اتصال به سرور</param>
/// <returns>اسکریپت تهیه شده</returns>
public static string ScriptData(string dbName, string table, string instance, string userName, string pass)
{
try
{
ServerConnection serverConnection = new ServerConnection(instance, userName, pass);
Server server = new Server(serverConnection);
Database database = server.Databases[dbName];
if (database == null) return string.Empty;
Table tb = database.Tables[table];
Scripter scripter = new Scripter(server) {Options = {ScriptData = true}};
if (tb == null) return string.Empty;
StringBuilder sb = new StringBuilder();
foreach (string s in scripter.EnumScript(new Urn[] {tb.Urn}))
sb.AppendLine(s);
return sb.ToString();
}
catch(Exception ex)
{
//todo: log ...
return string.Empty;
}
}

نکته:
اسمبلی‌های SMO به همراه مجموعه SQL Server 2008 نصب می‌شوند. بنابراین متد و برنامه‌ی فوق بر روی سروری با این مشخصات بدون مشکل اجرا خواهد شد. اما اگر قصد توزیع برنامه خود را دارید باید Microsoft SQL Server 2008 Management Objects را نیز به همراه برنامه خود نصب نمائید.

مطالب
سه ابزار امنیتی جدید جهت توسعه دهندگان وب

مایکروسافت سه ابزار امنیتی رایگان جدید را جهت توسعه دهندگان وب ارائه داده است که فعلا در مرحله آزمایش به سر می‌برند و قرار است این مجموعه به صورت جرئی از مجموعه power tools ویژوال استودیو 2010 ارائه شوند. این سه ابزار به شرح زیر هستند:

الف) CAT.NET 2.0 CTP
CAT.NET کاملا از صفر بازنویسی شده و از موتور جدیدی کمک می‌گیرد. نگارش CTP فعلی آن فقط از طریق خط فرمان قابل اجرا است.
دریافت

ب) WACA 1.0 CTP
نام این ابزار مخفف Web Application Configuration Analyzer است که جهت بررسی تنظیمات برنامه‌های وب شما، همچنین IIS و SQL Server بکار می‌رود و نقایص امنیتی آن‌ها را گوشزد خواهد کرد.
دریافت

ج) WPL 1.0 CTP
نام این ابزار مخفف Web Protection Library است. این ابزار شبیه به یک فایروال جهت برنامه‌های وب شما در مقابل حملات XSS و SQL injection عمل می‌کند و بدون نیاز به تغییر کد (با کمک یک HTTP Module)، محافظت قابل توجهی را ارائه خواهد داد.
دریافت

مطالب
در مورد ادامه ...

در حال تهیه یک سیستم blogging هستم که بشود آن‌را چند کاربره یا چند نویسنده‌ای کرد. این سیستم جدید تا یک ماه دیگر جایگزین سیستم وصله پینه‌ای جاری خواهد شد (متن یکجا، css لینک شده از یک سایت دیگر، syntax highlighting از یک سایت دیگر، عکس‌ها در یک سرور مجزا، کامنت‌ها کلا در یک سرور دیگر (دیسکاس) بجز هاست بلاگر، لینک‌های روزانه در یک سایت ثالث، فایل‌های مثال‌ها در سروری دیگر! هاست اصلی بلاگ (بلاگر) هم کلا در ایران فیلتر است!). البته همین سیستم وصله پینه‌ای 4 سال است که داره کار می‌کنه!
به همین دلیل برای پیدا کردن وقت جهت بازنویسی سیستم، این سایت تا یک ماه دیگر در حالت تعلیق خواهد بود.
در این بین اگر علاقمند به مشارکت در بلاگ جدید (با همین آدرس با همین عنوان) به عنوان نویسنده هستید، یک ایمیل به من ارسال کنید (vahid_nasiri در یاهو). موضوع سایت مشخص است. اهداف آن هم به همین ترتیب. فقط فنی است. تنها مطالب فنی قرار است ارسال شود. پس از آماده شدن سایت جدید، یک اکانت نویسنده مطلب برای شما ارسال خواهد شد. با تشکر از همکاری شما.

پاسخ به بازخورد‌های پروژه‌ها
ادامه آموزش MVVM در صورت امکان با MVVM Light
ضمنا: «ارائه وصله» به معنای ارائه وصله توسط شما است. این یک روال متداول در پروژه‌های عمومی دنیا است. شخصی کار رو بررسی کرده و یک وصله یا patch جدید جهت بهبود کار به تیم اصلی ارائه داده.
مطالب
الگوریتم های داده کاوی در SQL Server Data Tools (SSDT) - قسمت اول (مقدمه)
پیشتر مطالبی در رابطه با مفاهیم مخزن داده و داده کاوی در سایت آمده است: ^ و ^ و ^.

در این سری مقالات به معرفی الگوریتم‌های داده کاوی مایکروسافت و نحوه کار کردن با آن‌ها در محیط SQL Server Data Tools (SSDT)  می‌پردازیم. بیشتر متن مقاله ترجمه آزاد از کتاب معروف  Data Mining with Microsoft SQL Server 2008 می باشد که یکی از بهترین کتاب‌ها در زمینه داده کاوی است. از آنجائیکه دسته بندی الگوریتم‌های داده کاوی در SQL Server 2016 نسبت به SQL Server 2008 قدری متفاوت می‌باشد و کتاب فوق به دلیل ورژن SQL قدیمی‌تر، این موضوع را درنظر نگرفته است، بنابراین تغییرات ورژن جدید دسته بندی الگوریتم‌ها نیز لحاظ شده است. جهت درک بهتر مطالب، سعی شده‌است مثال و توضیحاتی براساس تجربه کاری  آورده شود.
برای دریافت SSDT می‌توانید به اینجا مراجعه نمایید.
پس از دریافت و نصب SSDT می‌توان به Visual Studio مراجعه نمود و یک پروژه Analysis Services Multidimensional and Data Mining یا به اختصار  SSAS-M را به شکل زیر ایجاد کرد.

 پس از ایجاد یک پروژه SSAS-M می‌توان در بخش Mining Structure یک ساختار داده کاوی را به شکل زیر ایجاد نمود.

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

در صفحه بعد الگوریتم موردنظر را انتخاب می‌نماییم.

بدیهی است که پس از ساخت ساختار داده کاوی می‌توان الگوریتم‌های دیگری را نیز برای مدل کردن مخزن داده به کار برد.

در این مقاله فرض شده است که خواننده نحوه ساخت  Cube  و  Dimension  را در یک پروژه SSAS-M توسط SSDT ، می‌داند. در صورتیکه به داده کاوی و هوش تجاری علاقمند هستید و به مقدمات بیشتری در رابطه با مطالب فوق نیاز دارید، پیشنهاد می‌شود که فصل‌های یک، سه و چهار کتاب فوق را جهت آشنایی بیشتر مطالعه نمایید.

همانطور که در شکل آخر نیز نشان داده شده است SSDT دارای الگوریتم‌های زیر است:

  • Microsoft_Naive_Bayes
  • Microsoft_Decision_Trees
  • Microsoft_Linear_Regression
  • Microsoft_Clustering
  • Microsoft_ Association_Rules
  • Microsoft_Neural_Network
  • Microsoft_Logistic_Regression
هدف این سری مقالات که به امید خدا در آینده منتشر خواهد شد، آشنایی با الگوریتم‌های داده کاوی فوق و نحوه مدل کردن مخزن داده توسط این الگوریتم‌ها و در نهایت چگونگی تفسیر مدل های داده کاوی تولید شده، می‌باشد.