حل یسرس سوال SQL Injection

amirlol

Well-Known Member
دیدم خیلی مشکلات دارن سایت های ایرانی با ای مسئله ! امید وارم حل بشه
کد:
<%

theID = Server.HTMLEncode(Request.Querystring("id"))
	If theID = "" Or isNumeric(theID) = False Then
		theID = 0
		Sqlinct = "True"
	End If
sql = "SELECT theField FROM theTable WHERE theID=" & theID

%>






کد:
<%
'Format SQL Query function
Private Function formatSQLInput(ByVal strInputEntry)

	'Remove malicious characters from links and images
	strInputEntry = Replace(strInputEntry, "<", "&lt;")
	strInputEntry = Replace(strInputEntry, ">", "&gt;")
	strInputEntry = Replace(strInputEntry, "[", "[")
	strInputEntry = Replace(strInputEntry, "]", "]")
	strInputEntry = Replace(strInputEntry, """", "", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "=", "=", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "'", "''", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "select", "select", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "join", "join", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "union", "union", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "where", "where", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "insert", "insert", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "delete", "delete", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "update", "update", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "like", "like", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "drop", "drop", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "create", "create", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "modify", "modify", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "rename", "rename", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "alter", "alter", 1, -1, 1)
	strInputEntry = Replace(strInputEntry, "cast", "cast", 1, -1, 1)

	'Return
	formatSQLInput = strInputEntry
End Function
%>
 
جالب بود دستت درد نكنه
ولي اگه ميشه يكم هم توضيح بده كه چرا اينا رو جايگزين مي كنيم
البته يه چندتاشو من مي‌دونم
 

amirlol

Well-Known Member
برای اینکه تمام چیزهایی که مهم برای اینجکت اینا هستند ! تک تک مشکل ایجاد می کنه
 

fereshte22

Member
سلام
اقای amirlol عزیز میشه بیشتر توضیح دهید که استفاده از تابع بالا تا چه حد از sql injection جلوگیری میکند؟
در ضمن استفاده از sp برای جلوگیری از sqlinjection بهتر است و یا توابعی مثل تابع شما؟
 

MDP

Well-Known Member
در ضمن استفاده از sp برای جلوگیری از sqlinjection بهتر است و یا توابعی مثل تابع شما؟
سلام!

این تابع از99% حمله ها جلو گیری می کنه!

درضمن توی SQL اگه اطلاعات بره برای جلو گیری از حمله چه جوری میخواید از یه SP استفاده کنید!:D

بهتره توی سطح فرم این کار رو انجام بدید!!!

.:مسعود:.:cool:
 

fereshte22

Member
سلام!



درضمن توی SQL اگه اطلاعات بره برای جلو گیری از حمله چه جوری میخواید از یه SP استفاده کنید!:D

بهتره توی سطح فرم این کار رو انجام بدید!!!

.:مسعود:.:cool:

اخه من شنیده ام که یکی از دلایل استفاده از sp جلوگیری از sql injection است.
 

amirlol

Well-Known Member
خوب من شاید همین کد ساده رو حدوده 2 روز روش کار کردم ! و در یکی از بزرگترین انجمن های برنامه نویسی انگلیسی زبان گذاشتم و هم تست برنامه رو و بعد از بررسی های انجام شده دیدم میشه گفت بهترین نوع کار رو انجام میده ! همین و همین !


حالا درصدشو نمی دونم ولی از کارش متمعن هستم و تو همه کارهام از این روش البته به نوعی جدید تر استفاده میکنم
 

fereshte22

Member
خوب من شاید همین کد ساده رو حدوده 2 روز روش کار کردم ! و در یکی از بزرگترین انجمن های برنامه نویسی انگلیسی زبان گذاشتم و هم تست برنامه رو و بعد از بررسی های انجام شده دیدم میشه گفت بهترین نوع کار رو انجام میده ! همین و همین !
دستون درد نکند.

در ضمن ایا من تابع شما را درست استفاده کرده ام؟(خود تابع را در یک کلاس تعریف کردهام)
کد:
Dim cs As New Class1
insertsql = "insert into sabadkharid(iduser,idkala)"
                insertsql &= "values('" & cs.formatSQLInput(id1) & "','" & cs.formatSQLInput(f_ID_Item.Text) & "')"
کار دیگری هم لازم است انجام دهیم؟
تو همه کارهام از این روش البته به نوعی جدید تر استفاده میکنم

در مورد این نوع جدیدتر هم میشه لطف کنید و بیشتر توضیح دهید؟
ویه سوال دیگه با عرض شرمندگی
غیر از sql injection چه خطرات دیگری سایت ها را تهدید میکند ؟و چگونه باید از اونها جلوگیری کنیم.
 

amirlol

Well-Known Member
مهمترین نوع هملات برای تغییر در رکورد های دیتابیس عمین sql injct است ! حملات زیادی وجود داره که بر می گرده به نوع پرمیژن ها - فایل ها - شل ها - و حتی خود سرور ! - بعضی وقت ها شما کارتون از نظر دیباگر هک بدون نقصه ! ولی مثلآ یک سایت دیگه رو سرورتون هست و اون براحتی هک شده و چون سرور هم کمی کشککی هستند سایت شما هم بسلامتی و میمنت ببببببببللللللللللللللللله !


این مدل جدید تر هم کمی پیچیده تر است و کمی طولانی تر !!! بعضی مسایل رو نمیشه همه جا بازگو کرد چون سروره و امکان پریدن اطلاعات !

می دونید دیگه ! اینو فعلآ شرمنده تا کمی تغییرات توش بدم !

ببینم اگه بالا درست براش تعییر کرده باشین ! بله راه حل منطقی است ! راستی چرا شما برای sql inject ها از خود .net استفاده نمی کنید !!!

کدوم ورژن دات نت رو کار می کنید ! 1.1 یا 2 !؟
 

fereshte22

Member
من ورزن 2 کار میکنم(2005)
به چه صورت باید عمل کنم؟
این مدل جدید تر هم کمی پیچیده تر است و کمی طولانی تر !!! بعضی مسایل رو نمیشه همه جا بازگو کرد چون سروره و امکان پریدن اطلاعات !

می دونید دیگه ! اینو فعلآ شرمنده تا کمی تغییرات توش بدم !
خواهش میکنم
کاملا حق با شما است.
 

fereshte22

Member
سلام
اقای amirlol میشه توضیح دهید که در دات نت 2 به چه صورت باید کار کنم؟
در ضمن ایا استفاده از دستور insert به صورتی که من در بالا نوشتم راه خوبی است؟امنیت دارد؟
 

amirlol

Well-Known Member
من سعی می کنم بزودی یه طرح هم برای .net بزارم !!


روش شما درسته و بدون ایراد ! سعی کنید متغییر ها رو یه راست تو Query نزارید
 

amirlol

Well-Known Member
کد:
System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = '")
  .Append(txtLogin.Text).Append("' AND password='")
  .Append(txtPassword.Text).Append("'");
 

fereshte22

Member
سلام
اول بگم عذر میخواهم که یک سری چیزها را چند بار میپرسم.
اقای amirlol عزیز سوالی که برای من پیش اومده اینه که ایا برای خوندن اطلاعات (مثل همون مثالی که خود شما در بالا قرار دادید)استفاده از StringBuilder کافیه؟
لازم نیست از تابع شما استفاده شود.؟
ویا وقتی از تابع شما استفاده میکنیم(مثلا برای insert)استفاده از StringBuilder لازم نیست؟درسته؟

من توی یک سایت دیدم که گفته بود برای نمایش اطلاعات از کدزیر استفاده کنید
کد:
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();
		}
این طریقه استفاده از StringBuilder با مثالی که شما زدید تفاوتی دارد؟
ممنون
 

amirlol

Well-Known Member
هرکی سوال داره اینو بخونه اول!!

دوست من فقط این رو می تونم بگم که کد بالا کدهای html رو دیکد می کنند و در دیتابیس میریزه که باز فکر کنم کافیه 2 تا کاراکتر اینطوری بشه > و < این ها فقط بنظر من کافیه که تو دیتابیس باشه !! نیازی نیست زیاد فقط ارگومان خوندن کمی کشکل ساز میشه و ربطی به SQL INJECTION نداره
 
میشه یه مثال واسه این کدتون بزارین ؟
یا یه کم بیشتر توضیح بدین .
شما فقط کدهارو گذاشتین ، بدون هیچ راهنمایی !
برای یه مبتدی مثل من خیلی سخته یادگرفتن نحوه استفادشون .
 

shirini_forush

Well-Known Member
عزیزان من برای جلوگیری از sql injection توی .net هیچ نیازی به کار اضافه نیست. کافیه پارامتر تعریف کنید و اگه حرفه ای تر میخواید کار کنید با stored procedure کار کنید.

شاد باشید :wink:
 

MDP

Well-Known Member
بله بحث سره همینه!

معلومه Sp ها امنیت بالایی دارند!
 

جدیدترین ارسال ها

بالا