복붙노트

[SQL] SQL 주입을 방지하는 좋은 방법은 무엇입니까? [복제]

SQL

SQL 주입을 방지하는 좋은 방법은 무엇입니까? [복제]

내 OJT 회사에 대한 응용 프로그램 관리 시스템을 프로그래밍 할 수 있습니다. 프론트 엔드는 C # 및 SQL의 백 엔드에서 수행됩니다.

지금은이 범위 이전의 프로젝트를 해본 적이있다; 학교에서 우리는 SQL에 대한 기본적인 수업을했다. 어떻게 든 우리의 교사는 완전히 SQL 주입을 논의하기 위해 난 단지 지금 인터넷에 대해 읽어와 접촉 한 일을 실패했습니다.

어쨌든 내 질문은 : 어떻게 C #에서 SQL 주입을 방지합니까? 나는 막연하게 제대로에만 지정된 형식의 입력을 받아 너무 응용 프로그램의 텍스트 필드를 마스킹하여 수행 할 수 있다고 생각합니다. 예를 들어 전자 메일 텍스트 상자의 형식은 "example@examplecompany.tld"이어야합니다. 이 방법은 충분한 수 있을까요? 또는 .NET이 같은 핸들 물건이 방법을 사전 정의는 무엇입니까? 그것은 단지 이메일 주소 형식 또는 특수 문자를 허용하지 않도록 이름 텍스트 상자를 받아 그래서 나는 텍스트 상자에 필터를 적용 할 수 있습니까?

해결법

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

    1.SqlCommand에와 매개 변수의 자식 컬렉션을 사용하여 SQL 주입에 대한 검사의 모든 고통은 당신에게서 박탈하고이 클래스에 의해 처리됩니다.

    SqlCommand에와 매개 변수의 자식 컬렉션을 사용하여 SQL 주입에 대한 검사의 모든 고통은 당신에게서 박탈하고이 클래스에 의해 처리됩니다.

    다음은 위의 기사 중 하나에서 촬영 한 예이다 :

    private static void UpdateDemographics(Int32 customerID,
        string demoXml, string connectionString)
    {
        // Update the demographics for a store, which is stored  
        // in an xml column.  
        string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
            + "WHERE CustomerID = @ID;";
    
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(commandText, connection);
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = customerID;
    
            // Use AddWithValue to assign Demographics. 
            // SQL Server will implicitly convert strings into XML.
            command.Parameters.AddWithValue("@demographics", demoXml);
    
            try
            {
                connection.Open();
                Int32 rowsAffected = command.ExecuteNonQuery();
                Console.WriteLine("RowsAffected: {0}", rowsAffected);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
    
  2. ==============================

    2.내 대답은 아주 간단합니다 :

    내 대답은 아주 간단합니다 :

    C # 및 SQL 데이터베이스 사이의 통신에 사용하는 엔티티 프레임 워크. 즉 SQL 인젝션에 취약하지 않습니다 매개 변수화 된 SQL 문자열을 만들 것입니다.

    보너스로, 그것은 매우 쉽게 작업에뿐만 아니라으로합니다.

  3. ==============================

    3.SQL 주입은 까다로운 문제가 될 수 있지만, 주변의 방법이 있습니다. 귀하의 위험은 단순히 Linq2Entities, Linq2SQL, NHibrenate 같은 ORM을 사용하여 위험을 감소한다. 그러나 당신도 그들과 함께 SQL 주입 문제가있을 수 있습니다.

    SQL 주입은 까다로운 문제가 될 수 있지만, 주변의 방법이 있습니다. 귀하의 위험은 단순히 Linq2Entities, Linq2SQL, NHibrenate 같은 ORM을 사용하여 위험을 감소한다. 그러나 당신도 그들과 함께 SQL 주입 문제가있을 수 있습니다.

    SQL 분사 중요한 것은 사용자 제어 입력 (AS XSS 함께). 가장 간단한 예에서는 사용자 이름과 암호를 취 로그인 폼 (난 당신이 바로이 작업을 수행 한 결코 희망을)이있는 경우.

    SELECT * FROM Users WHERE Username = '" + username + "' AND password = '" + password + "'"
    

    사용자가 입력했다 경우 '사용자 이름 관리자에 대해 다음 - 데이터베이스에 대해 실행할 때 SQL 문은 다음과 같을 것입니다.

    SELECT * FROM Users WHERE Username = 'Admin' --' AND password = ''
    

    (AN ORM가하는 일이다)를 paramaterized 쿼리를 사용하여이 간단한 경우에는 위험을 제거하는 것입니다. 또한 덜 알려진 SQL 인젝션 공격 벡터의 문제 및 저장 프로 시저와 그의를 가지고있다. 당신이 paramaterized 쿼리 또는 ORM을 사용하는 경우에도이 경우 당신은 여전히 ​​SQL 주입 문제가있는 것입니다. 저장 프로 시저 명령을 실행할 포함 할 수 있으며 그 명령 자체는 SQL 주입 공격에 suceptable 수 있습니다.

    CREATE PROCEDURE SP_GetLogin @username varchar(100), @password varchar(100) AS
    DECLARE @sql nvarchar(4000)
    SELECT @sql = ' SELECT * FROM users' +
                  ' FROM Product Where username = ''' + @username + ''' AND password = '''+@password+''''
    
    EXECUTE sp_executesql @sql
    

    이 예는 paramaterized 쿼리 또는 ORM을 사용하는 경우에도 이전과 같은 SQL 주입 문제가있는 것입니다 그래서. 예 바보 같다 비록이 같은 기록 빈도에 관한 놀라게 될 것입니다.

    내 권장 사항은 즉시 SQL 주입 문제가의 가능성을 줄이기 위해 ORM을 사용하고이를 해결하기 위해 문제와 작업을 할 수 있습니다 코드와 저장 프로 시저를 발견하는 법을 배워야 할 것이다. 나는 ADO.NET 사용하지 않는 것이 좋습니다 (하는 SqlClient을하는 SqlCommand 등 ...) 당신은 어떻게 든 매개 변수를 사용하는 것이 안전하지 때문이에 있지만이 있기 때문에 그것은 훨씬 더 쉽게 게을러 단지 SQL을 쓰기 시작에 직접하지 않는 한 쿼리 문자열을 사용하고 단지 매개 변수를 무시. ORMS는 그들이 단지 무엇 때문에 매개 변수를 사용하도록 강제 훌륭한 일을하고 있어요.

    다음 방문 OWASP의 SQL 주입 https://www.owasp.org/index.php/SQL_Injection에 사이트 당신이 파악하고 코드에서 발생하는 것이다 문제를 취할 수 있도록하기 위해 SQL 주입 컨닝 페이퍼를 사용합니다. https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet 마침내 것 당신이 SQL 주입 및 XSS 같은 것들에 대한 서로의 코드를 검토 할 수있는 기업에서 장소에 당신과 다른 개발자 사이 좋은 코드 검토를 넣어 말한다. 시간 프로그래머의 많은 그들이 어떤 기능을 급히하려고 노력하고 있기 때문에이 물건을 그리워하고 자신의 코드를 검토에 너무 많은 시간을 소비하지 않습니다.

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

    4.SQL 인젝션은 사용자의 입력을 검증하기 위해 시도하여 방지 할 수는 안된다 대신, 그 입력이 제대로 데이터베이스에 전달되기 전에 탈출해야합니다.

    SQL 인젝션은 사용자의 입력을 검증하기 위해 시도하여 방지 할 수는 안된다 대신, 그 입력이 제대로 데이터베이스에 전달되기 전에 탈출해야합니다.

    입력 방법은 완전히 데이터베이스와 인터페이스하기 위해 사용하고있는 기술에 따라 달라집니다 탈출. 대부분의 경우와하지 않는 한 당신은 당신이 무료로 보호 ​​방탄 수 있도록 프레임 워크에 의해 자동적으로 처리 될 것이다 (당신이 할 수있는 당신이 열심히하지 않도록해야합니다) 베어 SQL을 쓰고있다.

    당신은 당신의 인터페이스 기술이 될 것입니다 정확히 결정했습니다 더 후이 질문을 탐구한다.

  5. from https://stackoverflow.com/questions/14376473/what-are-good-ways-to-prevent-sql-injection by cc-by-sa and MIT license