2012-05-30 1 views
0

나는 다음과 같은 방법으로 Web 서비스가 작동하지 않습니다C#하는 SqlCommand는

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    [WebMethod] 
    public string Login(string passwort, string email, string firma) 
    { 
     return LoginHelper.Login(passwort, email, firma); 
    } 

내 LoginHelper 코드 : 내 질문을 편집 한

그 도움 얘들 아에 대한

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data; 
using System.Data.SqlClient; 

namespace WebService1 
{ 
    public class LoginHelper 
    { 
     public static string Login(string passwort, string email, string firma) 
     { 
      string userName = ""; 

      SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;"); 

     SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
            WHERE email = @email", con); 
     cmd.Parameters.AddWithValue("@email", email); 

     con.Open(); 

     SqlDataReader dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
     { 
    //userName += dr["email"].ToString(); 
    //userName += dr["passwort"].ToString(); 
    userName += dr["firma"].ToString(); 
    } 
    dr.Close(); 
    con.Close(); 
    return userName; 
     } 



    } 
} 

감사합니다. 그 해결책은 지금 안전합니까? 나는 SQL-Injection을 반대한다. 내가 더 잘할 수있는 것이 더 있니?

+5

가장 먼저 잘못된 것은 SQL 문자열을 연결하는 것입니다. 대신 쿼리 매개 변수를 사용해야합니다. – David

+1

이를 위해 매개 변수화 된 SQL을 사용해야합니다. 현재 작성된 코드는 SQL 주입 공격에 취약합니다. 나는 그 변화를 먼저 만들 것이다. 그렇게 할 때 문제가 사라질 가능성이 있습니다. –

+2

또한 SqlConnection, SqlCommand 및 SqlDataReader를'using' 블록에 넣지 않고 있으며 선택의 여지가없는 한 WCF를 사용해야 할 때 ASMX 웹 서비스를 사용하고 있습니다. –

답변

6
당신이

LoginHelper.Login(passwort, email, firma);를 호출

하지만 방법

public static string Login(string email, string passwort, string firma)

이메일 주먹 매개 변수입니다. 당신이 암호가 이메일 매개 변수에 다른 대답 & 코멘트를

public static string Login(string passwort, string email, string firma) 
{ 
    string userName = ""; 

    using (SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;")) 
    using(SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData WHERE email = @email", con)) 
    { 
     cmd.Parameters.AddWithValue("@email", email); 
     con.Open(); 
     using (SqlDataReader rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       if (rdr["firma"] != DBNull.Value) 
       { 
        userName += rdr["firma"].ToString(); 
       } 

      } 
     } 
    } 

    return userName; 
} 
+0

Thx 그건 내 문제의 "하나"였습니다 :) – Bashud

+0

@Bashud는 'using'문, SQL 매개 변수, null 체크 등을 사용하여 내 대답을 업데이트했습니다. 도움이 될 수 있기를 바랍니다. – Damith

+0

정말 고맙습니다. ! – Bashud

0

아래로 LoginHelper에 어떤 결과를

변화 당신의 login 방법을 반환하지 왜

사실, 그건. 당신이 ORM을 사용하려고하지 않는 경우

당신은, 보안 문제가 (법인 프레임 워크/NHibernate에는/등) 문제를 해결 매개 변수화 된 쿼리

을 사용하십시오 :

  • 데이터베이스에 데이터가 있습니까?
  • 올바른 데이터베이스를 가리키고 있습니까?
  • 올바른 SQL입니까?
  • SQL이 실행 중입니까?
  • 실행 SQL 프로파일 러 및 SQL이 실행을 받고 무엇을보고, 다음 SQL Management Studio를
1

에 또한, 보안 및 성능 이유로, 당신은 SqlParameters를 사용해야하는지 테스트. SQL 주입 공격에 대해 읽어보십시오.

+0

고맙습니다. 해결책을 찾기 위해 귀하의 솔루션 – Bashud

+0

Thx를 사용해 보겠습니다. 나는 무언가를 배웠다 – Bashud

0

매개 변수를 전달하는 대신 매개 변수를 추가하려면 Sqlparameter를 사용하십시오. SQL 매개 변수를 사용하여 매개 변수를 추가하는 것이 가장 좋습니다. 디버깅을 통해 이메일의 가치를 확인할 수도 있습니다. 올바른 정보를 전달하고 있습니다.

 SqlConnection conn = new SqlConnection(connectionString); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
           WHERE email = @email" conn); 
     cmd.Parameters.AddWithValue("@email", email);      
     cmd.Prepare(); 
     cmd.ExecuteNonQuery(); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
      {     
       userName += dr["firma"].ToString(); 

      } 
     dr.Close(); 
     conn.Close(); 
+0

나는 당신의 해결책을 시도 할 것이다 – Bashud

+0

정보 iam 통과는 정확하다, 나는 이미 그것을 검사했다. Damith는 해결책을 게시했습니다 – Bashud

+0

그래서 U R은 UR que를 해결할 수 있습니다. 또는 여전히 동일한 것을 직면합니다 – Chets

3

이메일 주소에 @ 문자가 포함되어 있으면 문제 일 수 있습니다. @는 SQLCommand의 매개 변수 표시 자입니다. 전자 메일 주소의 후반 부분이 SQL 매개 변수라고 생각할 것입니다. 매개 변수를 사용하여 전자 메일 주소를 전달해야합니다. 그것은 또한 SQL 주입으로부터 당신을 보호합니다. Akatakritos의 답변에는 전자 메일을 전달하는 방법에 대한 예가 나와 있습니다.