복붙노트

[SQL] 문자열로 안전 SQL 문 만들기

SQL

문자열로 안전 SQL 문 만들기

나는 C # 및 .NET 3.5을 사용하고 있습니다. 내가 생성하고 원격 서버에 나중에 실행됩니다 문 삽입 일부 T-SQL을 저장해야합니다.

예를 들어, 나는 종업원의 배열을 가지고 :

new Employee[]
{
   new Employee { ID = 5, Name = "Frank Grimes" },
   new Employee { ID = 6, Name = "Tim O'Reilly" }
}

그리고이 같은 문자열의 배열로 끝날해야합니다

"INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')",
"INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')"

나는 및 String.format와 함께 삽입 문을 만들어 몇 가지 코드를 찾고 있어요,하지만 느낌이 좋지 않습니다. 나는 (같은 것을 할 것을 희망)하는 SqlCommand를 사용하는 것으로 간주하지만, 매개 변수를 사용하여 명령 텍스트를 결합 할 수있는 방법을 제공하지 않습니다.

그것은 단지 작은 따옴표를 대체 문자열을 구축하기에 충분한가요?

string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')",
    employee.ID,
    replaceQuotes(employee.Name)
    );

내가이 일을 할 때 염려해야 하는가? 소스 데이터는 매우 안전하지만, 나는 너무 많은 가정을하고 싶지 않다.

편집 : 그냥이 경우, 내가도록 SqlConnection 또는 SQL 서버에 직접 연결 어떤 방법이없는 것을 지적하고 싶다. ) (그렇지 않으면 내가 SqlCommand.Parameters.AddWithValue을 사용하는 것 -이 특정 응용 프로그램은 다른 곳에서 실행되는 SQL 문을 생성하고이를 대기열 필요

해결법

  1. ==============================

    1.사용 명령을 매개 변수화. 원격 서버에 따라 매개 변수를 전달할뿐만 아니라, 그 여전히 SQL 자체와 매개 변수 값의 차이를 유지, SQL Server에 전화를 얻는다.

    사용 명령을 매개 변수화. 원격 서버에 따라 매개 변수를 전달할뿐만 아니라, 그 여전히 SQL 자체와 매개 변수 값의 차이를 유지, SQL Server에 전화를 얻는다.

    만큼 당신이 코드로 치료 데이터를 혼합하지 마십시오, 당신은 괜찮을 것 같네요.

  2. ==============================

    2.지금처럼 SqlCommand 개체를 만듭니다

    지금처럼 SqlCommand 개체를 만듭니다

    SqlCommand cmd = new SqlCommand(
            "INSERT INTO Employees (id, name) VALUES (@id, @name)", conn);
    
    SqlParameter param  = new SqlParameter();
    param.ParameterName = "@id";
    param.Value         = employee.ID;
    
    cmd.Parameters.Add(param);
    
    param  = new SqlParameter();
    param.ParameterName = "@name";
    param.Value         = employee.Name;
    
    cmd.Parameters.Add(param);
    
    cmd.ExecuteNonQuery();
    
  3. ==============================

    3.대체 수정하여 따옴표는이 방식으로 작동 :

    대체 수정하여 따옴표는이 방식으로 작동 :

    void string replaceQuotes(string value) {
         string tmp = value;
         tmp = tmp.Replace("'", "''");
         return tmp;
    }
    

    건배!

  4. ==============================

    4.흠 난 당신이 매개 변수가있는 쿼리를 사용해야하고 그것을 떠날 것을 다른 사람에 동의합니다. 그러나 당신은 어떻게 당신의 원격 서버에 이러한 SQL 문을 통과 건가요? 당신은 동의하고 실행하는 임의의 SQL 명령을 또는 클라이언트 응용 프로그램은 직접 DB를 칠려고하는 웹 서비스와 같은 서비스의 어떤 종류가 있습니까?

    흠 난 당신이 매개 변수가있는 쿼리를 사용해야하고 그것을 떠날 것을 다른 사람에 동의합니다. 그러나 당신은 어떻게 당신의 원격 서버에 이러한 SQL 문을 통과 건가요? 당신은 동의하고 실행하는 임의의 SQL 명령을 또는 클라이언트 응용 프로그램은 직접 DB를 칠려고하는 웹 서비스와 같은 서비스의 어떤 종류가 있습니까?

    당신은 프록시 일종의 통과하는 경우에는 당신이 해커 수 당신의 응용 프로그램 바이 패스, 클라이언트에 데이터를 소독하고 서비스를 맞았 얼마나 중요하지 않습니다. 이 경우 케이드는 실제로 명령을 실행하기 전에 그런 다음 SQL 오른쪽을 구축 할 것을 권장하고 (JSON, 이진 등) 어떤 형식을 선택한 예 또는를위한 XML로 데이터를 전달하는 일을.

  5. ==============================

    5.피할 주입에, 당신은 (아마도 XML)에 원격 서버에 데이터를 제공하기 위해 다음 원격 서버에서 데이터를 변환 적절한 데이터 유형으로 다시 및 매개 변수가있는 쿼리 또는 저장 발동에 사용해야합니다.

    피할 주입에, 당신은 (아마도 XML)에 원격 서버에 데이터를 제공하기 위해 다음 원격 서버에서 데이터를 변환 적절한 데이터 유형으로 다시 및 매개 변수가있는 쿼리 또는 저장 발동에 사용해야합니다.

  6. from https://stackoverflow.com/questions/293254/creating-safe-sql-statements-as-strings by cc-by-sa and MIT license