2011-12-21 3 views
0

ASP.NET에서 C#을 사용하여이 웹 사이트를 개발 중입니다. 나는 오류를 얻고있다 : 할당되지 않은 변수 usn의 사용. 데이터베이스도 비어 있지 않습니다. 내 코드는 다음과 같습니다"할당되지 않은 변수 사용"오류

protected void Button1_Click(object sender, EventArgs e) 
{ 

    SqlConnection cn = new SqlConnection(); 
    SqlCommand cm = new SqlCommand(); 
    SqlDataReader dr; 
    cn.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Vijaylaxmi\Desktop\TrainReserveold\App_Data\Database.mdf;Integrated Security=True;User Instance=True"; 
    cn.Open(); 
    cm.Connection = cn; 
    String usn; 
    cm.CommandText = "Select UserName from User where UserName='" + TextBox1.Text + "'"; 
    dr = cm.ExecuteReader(); 
    while (dr.Read()) 
    { 
     usn = dr.GetString(0); 
    } 
    if (String.Compare(usn, TextBox1.Text) != 0) 
    { 
     Response.Write("Invalid user name... try again"); 
     TextBox1.Text = ""; 
     TextBox2.Text = ""; 
     TextBox1.Focus(); 
    } 
    Response.Write("user valid now"); 
} 
+3

'using' 문에서'SqlConnection','SqlCommand' 및'SqlDataReader'의 생성을 래핑해야합니다. – Oded

+2

이제 너는 무례하다. 최대한 빨리? 나는 이것을 지불받지 못했다. 그리고 이것은 방금 응답에 대한 모든 관심을 잃게 만들었습니다. – Oded

+0

또한 연결 및 명령을 작성하는 방식을 다시 작성하는 방법을 살펴볼 것입니다. 자신이 갖고있는 것을 따라 다니기 쉽도록 예제를 게시합니다. – MethodMan

답변

1

내가 또한 응용 프로그램의 종류에 따라 Web.config의 또는의 app.config에서 내 SQL의 connectiong 문자열을 읽을 것

string usn = string.empty; then go from there 
//create a Stored Procedure and put your Select Statement in there.. to avoid Sql Injection 
cmd.CommandText = "name of your stored proc"; 
cmd.CommandType = System.Data.CommandType.StoredProcedure; 

로 최고를 USN 문자열을 assing 당신 실행 중입니다.

+1

DB에 다른 사용자가없는 경우에도 빈 사용자 이름이 유효하지 않으므로 NULL을 할당하는 것이 좋습니다. –

+0

Empty는 이니셜 라이저 중 하나입니다. 나는 진정으로 그가 리팩토링하는 사람과 그의 연결을 리팩토링하고 다음을 사용하여 명령 개체를 생성/할당하는 것을 권장합니다. (SqlConnection sqlConnSqlConnection = 새 SqlConnection (strConnectionString)) {} – MethodMan

+0

모든 코드는 심하게 냄새가 난다. 그러나 나는 로마가 하루 안에 지어지지 않았다고 생각한다. 더 많은 버그를 소개 할 이유는 없습니다 :) –

0

변화 당신의 cm.CommandText = "사용자의 경우 사용자 이름 = 여기를 참조

cm.CommandText = string.Format("Select UserName from User where UserName= '{0}'",Textbox1.Text); 
+1

이것은 SQL injection을 방지하지 않을 것입니다. –

+0

예. 그는 항상 저장된 proc에서 sql 명령을 제공하도록 변경할 수 있습니다. 나는 알고 있지만 좋은 지적입니다. – MethodMan

+0

저장 프로 시저가 주입을 방지하지 못합니다. 명령 매개 변수가 있습니다. –

3

몇 가지 문제에 사용자 이름을 선택 질문에 대한 구체적인 대응하여,이 대체 할 :.

dr = cm.ExecuteReader(); 
while(dr.Read()) 
{ 
    usn = dr.GetString(0); 
} 
을 이와

:

usn = cm.ExecuteScalar().ToString(); 

하는 DBNul를 확인하십시오 내가 먼저.

더 일반적으로
a) 원시 입력을 사용하는 대신 SQL을 매개 변수화 (또는 더 좋게는 저장된 proc 사용)하십시오. 이렇게하면 SQL 주입 공격으로부터 사용자를 보호 할 수 있습니다.
b) 코드에 직접 연결 문자열을 포함하지 마십시오. 그것을 설정 파일에 넣으십시오. 가장 확실하게 인터넷에 게시하지 마십시오.

관련 문제