PDA

View Full Version : راهکار شما برای مقابله با sql injection



hmm
سه شنبه 04 بهمن 1384, 12:48 عصر
سلام دوستان؛
من یه سایت دارم طراحی میکنم که تو هر صفحه مقدار زیادی text box داره و مقادیر اون یا مستقیماً به یک select میره و گزارش ایجاد میشه و یا مقادیر مستقیما به یک دستور insert تبدیل میشه و وارد بانک میشه حالا با توجه به اینکه این روش خطرناکه چه روش بهتره رو معرفی میکنید (در صورت امکان یه کد نمونه هم ارسال کنید)
مرسی!

anubis_ir
سه شنبه 04 بهمن 1384, 15:03 عصر
/*
HttpUtility.HtmlEncode essentially converts all HTML special characters
to a version suitable for displaying on a browser, such as “<” to &lt;
This causes any scripts that were entered into web forms to be interpreted
as text as opposed to JavaScript that could cause problems on your website.
*/

/// <summary>
/// هنگام نمایش اطلاعات حتما از این تابع جهت جلوگیری از حملات اسکریپتی باید استفاده شود
/// </summary>
public string echoSafe(string htmlInput)
{
// Encode the string input from the HTML input text field
StringBuilder sb = new StringBuilder(HttpUtility.HtmlEncode(htmlInput));
// Selectively allow <b> and <i>
sb.Replace("&lt;b&gt;", "<b>");
sb.Replace("&lt;/b&gt;", "</b>");
sb.Replace("&lt;i&gt;", "<i>");
sb.Replace("&lt;/i&gt;", "</i>");

return
sb.ToString();
}





/// <summary>
/// هر نوع ورودی دریافت شده از طرف کاربر باید ابتدا توسط این تابع اصلاح شود. بسیار مهم
/// </summary>
public string correctUserInput(string strInitialAttempt)
{
string tmp = string.Empty;
//example :
//id = hi' or 1=1--
//pass = hi' or 1=1--

strInitialAttempt = strInitialAttempt.ToLower();

//replacing a single quote with a two single quotes -
//the way to escape single quotes in SQL.
tmp = strInitialAttempt.Replace("'", "''");

//script attack
tmp = tmp.Replace("<script", " ");

//reject input that contains the following characters
tmp = tmp.Replace(";", " ");
tmp = tmp.Replace("--", " ");
tmp = tmp.Replace("/*", " ");
tmp = tmp.Replace("*/", " ");
tmp = tmp.Replace("xp_", " ");

//Note that if you are using a LIKE clause, wildcard
//characters still need to be escaped:
tmp = tmp.Replace("[", "[[]");
tmp = tmp.Replace("%", "[%]");
tmp = tmp.Replace("_", "[_]");

//dang. words!
tmp = tmp.Replace("union", "_union");
tmp = tmp.Replace("having", "_having");
tmp = tmp.Replace("shutdown", "_shutdown");
tmp = tmp.Replace("insert", "_insert");
tmp = tmp.Replace("select", "_select");
tmp = tmp.Replace("delete", "_delete");
tmp = tmp.Replace("update", "_update");
tmp = tmp.Replace("drop", "_drop");
tmp = tmp.Replace("exec", "_exec");
tmp = tmp.Replace("sp_", "_sp_");

return
tmp;
}





موفق باشی.

hmm
چهارشنبه 05 بهمن 1384, 13:19 عصر
عالی بود ممنون

rezanew
چهارشنبه 05 بهمن 1384, 16:49 عصر
برای منم این سوال مطرح بود

آیا می شه به جای استفاده از این روش از پارامتر ها استفاده کرد؟
(یعنی به جای اینکه به صورت مستقیم درون کوری بزاریم با پارمتر اونا رو بفرستیم)
منظور یعنی می شه به اونم اطمینان کرد؟!

titbasoft
پنج شنبه 06 بهمن 1384, 13:41 عصر
بهترین روش استفاده از stored procedure برای data manipulation است. این کار حداقل این چندتا خاصیت رو داره
1) افزایش security
2) افزایش Extendibility
3) افزایش performance

البته اگر روی SQL Server کار می کنید.

anubis_ir
پنج شنبه 06 بهمن 1384, 17:42 عصر
برای منم این سوال مطرح بود

آیا می شه به جای استفاده از این روش از پارامتر ها استفاده کرد؟
(یعنی به جای اینکه به صورت مستقیم درون کوری بزاریم با پارمتر اونا رو بفرستیم)
منظور یعنی می شه به اونم اطمینان کرد؟!

بله. اگر از روش‌های مخصوص کار با رویه‌های ذخیره شده در ADO.NET استفاده کنید قسمت عمده ای از موارد امنیتی فوق در آن به صورت توکار لحاظ شده است. ولی باز هم احتیاط شرط عقل است.

maryam_loyalty
دوشنبه 22 اسفند 1384, 22:52 عصر
سلام
لطفا اگه میشه راههای امنیت در برابر حملات SQL injection و XSS را برای وقتی که از DataAdapter و DataReader استفاده می کنیم را هم بگویید.
با تشکر

HO457
دوشنبه 22 اسفند 1384, 23:15 عصر
تاپیک آقای نصیری، حتما" ببینید...
http://www.barnamenevis.org/forum/showthread.php?t=5578

maryam_loyalty
سه شنبه 23 اسفند 1384, 11:59 صبح
سلام
میشه بیشتر توضیح بدین.
ممنون میشم.

hamed_bostan
سه شنبه 23 اسفند 1384, 14:36 عصر
ایا اگر از stored procuder استفاده کنیم ایا دیگه نیازی هست از کد تاپیک 2 استفاده کنیم؟

mahdi_negahi
سه شنبه 23 اسفند 1384, 19:59 عصر
استادان ! اگر من مثلا username را در سورس کدم چک کنم مثلا مثل زیر


if(Requset.Form["user"] == "admin")
{
SqlQuery = "Select * From Admin Where user='admin' and pass=+Request.Form
["pass"]

}

بعد اقدام به نوشتن دستور Sql کنم مشکل این کار کجاست(جا از این که فقط ما یک user خواهیم داشت)

mahdi_negahi
چهارشنبه 24 اسفند 1384, 12:08 عصر
آقا سوال ما را یک بزرگواری جواب بده

اینجام سری بزنید چیزهای خوبی دارد
http://forums.underground.ir/showthread.php?t=98

Farhad.B.S
چهارشنبه 24 اسفند 1384, 13:38 عصر
چون پارامتر pass به طور مستقیم در کئوری نقش داره وهمچنین فیلتری روش صورت نمیگیره بنابراین استفاده از این دستور پتانسیل مورد حمله قرار گرفتن رو خواهد داشت.

فرض کن کاربر پارامتر pass رو به این شکل تحویل صفحه بده :


' OR 1=1 --

حالا کئوری تولید شده رو چک کن.

mahdi_negahi
چهارشنبه 24 اسفند 1384, 19:33 عصر
دوست عزیز با این حالم نمی تواند login را دور بزند چون سطری را Query بر نمی گرداند

Farhad.B.S
پنج شنبه 25 اسفند 1384, 00:43 صبح
دوست عزیز با این حالم نمی تواند login را دور بزند چون سطری را Query بر نمی گرداند


چرا، یک سطر بازگشت داده میشود.
سطری که نام کاربری آن admin بوده و پسورد آن هم هرچه میخواهد باشد. -> or 1=1

با این شرط که نفوذگر مقدار پارامتر نام کاربری ارسالی به فرم را به admin ست کرده باشد.

mahdi_negahi
پنج شنبه 25 اسفند 1384, 12:02 عصر
بیشتر دستورات Access با SQL استاندارد مطابقت میکند آیا این مشکلات برای بانک اطلاعاتی Access هم (البته با همین دستورات ) وجود دارد

mahdi_negahi
یک شنبه 28 اسفند 1384, 17:43 عصر
سلام دوستان این سوال ما را کسی جواب نداد

essa_61
جمعه 02 شهریور 1386, 00:16 صبح
سلام این تاپیک مال دو سال قبل است می خواستم بدونم الان باید برای موارد زیر چی کار کرد

1)توی یک صفحه یک user name و password می گرد و کاربر را به صفحه اصلی هدایت می کند(چطور امنیت را بالا ببریم)
2)چطور بفهمیم که این کاربر login کرده یا نه

اگه امکانش هست کدی را با سی شارپ بنویسید

** ضمنا من برای چک کردن از این دستور استفاده کردم





SqlConnection conn = newSqlConnection(ConfigurationManager.ConnectionSt rings["conn"].ConnectionString);
SqlCommand comm = conn.CreateCommand();
comm.CommandText = string.Format("SELECT username, password FROM username WHERE (username = N'{0}') AND (password = N'{1}')", txt_user.Text, txt_password.Text);
conn.Open();
SqlDataReader dr= comm.ExecuteReader(CommandBehavior.SingleRow);

dr.Read() ;
if (dr.HasRows == true)
{
if (dr["username"].ToString() == txt_user.Text && dr["password"].ToString() == txt_password.Text)
{
Response.Redirect(@"admin/default.aspx");
}

}
else
Label5.Text = "رمز عبور صحیح نمی باشد";
conn.Close();


که هرچی این (hi' or 1=1--) کد را جای username و password می گدارم باز هم وارد نمی شود در صورتی که دوستان می گویند از این طریق به راحتی باید رمز عبور نادیده گرفته شود

ممنون می شوم

essa_61
جمعه 02 شهریور 1386, 11:11 صبح
هیچ کس نظری نداره

nazaninam
جمعه 02 شهریور 1386, 14:46 عصر
در مورد امنیت جناب راد در چند تاپیک کامل توضیح دادن ! در مورد sql injection جستجو کن
برای اینکه بفهمی کاربر Login شده یا خیر از متد User.Identity.IsAuthenticated به صورت زیر استفاه کن :



if (User.Identity.IsAuthenticated)
{
// Some Code
}
else
{
//Some Code
}