복붙노트

[SQL] .NET / SQL에서 매개 변수화 된 테이블 이름?

SQL

.NET / SQL에서 매개 변수화 된 테이블 이름?

주제는 내가 .NET을 사용하여 매개 변수로 테이블 이름을 통과 할 수하고자하는 제안 및 SQL 서버 (문제가있는 정말 언어를하지 않습니다)로.

나는 예를 들어, 값이 작업을 수행하는 방법을 알고 command.Parameters.AddWithValue ( "무엇", 무엇이든) 매개 변수를 표시하기 위해 쿼리에서 @whatever를 사용하여. 문제는 내가 같은 컬럼과 테이블 이름과 같은 쿼리의 다른 부분이 작업을 수행 할 수 있도록하고자하는 상황에서 오전입니다.

이것은 이상적인 상황은 아니지만 내가 사용해야 하나, 그것은이 테이블 이름이 아닌 최종 사용자를 설정할 수있는 코드를 사용하여 사람 만 같은 SQL 주입 정말 경향이 아니에요입니다. 그러나 그것은 혼란이다.

그래서, 가능한 요구하고 무엇인가?

편집이 : SQL 주입에 대한 점을 명확하게하기 위해, 테이블 이름은 상황에 따라 소스 코드에 전달됩니다. 그것은이 지정하는 개발자이다. 개발자는 어쨌든 데이터베이스 계층에 액세스 할 수 있습니다, 그래서 요구하고있는 이유는 보안을 위해 너무 많은 것이 아니라 단지 코드 청소기를 만들기 위해.

해결법

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

    1.나는 지금까지 내가 본 어떤 SQL 언어에서이 기능을 본 적이 생각하지 않는다, 그러나 전문 지식의 영역이 아니다.

    나는 지금까지 내가 본 어떤 SQL 언어에서이 기능을 본 적이 생각하지 않는다, 그러나 전문 지식의 영역이 아니다.

    '.'나 '_', AZ, AZ, 0-9로 문자를 제한 제시하고 ''것 - 다음 적절한 브라켓이 랩에 (예를 들어, [] SQL Server 용, 내가 믿는) 데이터베이스에 대해 무엇이든 사용 전체를 반올림. 그런 다음 바로 SQL에 직접 배치합니다.

    당신은 소스 코드 만 소스 코드에있을 것입니다 이름을 의미합니까 - 전적으로 당신이이 SQL 주입 위험이없는 대해 무엇을 의미하는지 분명하지 않다? 그렇다면, 나는 더 나은 일을하게 동의합니다. 당신이 강정 (의도적으로 또는 없음)으로하지 개발자를 신뢰하는 경우에도, 자동 브라케팅 할 필요가 없습니다 수 있습니다.

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

    2.직접 테이블 이름을 매개 변수화 할 수 없습니다. 당신은 sp_executesql을 통해 간접적으로 그것을 할 수 있습니다,하지만 당신은 단지뿐만 아니라 (테이블 이름을 연결 아닌 다른 값)을 (매개 변수) TSQL에서 C #을 구축하고 명령으로 내려 보낼 수 있습니다. 당신은 동일한 보안 모델을 얻을 수 (즉, 당신은 등 명시 적 선택을해야하고, 그것은 등 서명되지 않은 가정).

    직접 테이블 이름을 매개 변수화 할 수 없습니다. 당신은 sp_executesql을 통해 간접적으로 그것을 할 수 있습니다,하지만 당신은 단지뿐만 아니라 (테이블 이름을 연결 아닌 다른 값)을 (매개 변수) TSQL에서 C #을 구축하고 명령으로 내려 보낼 수 있습니다. 당신은 동일한 보안 모델을 얻을 수 (즉, 당신은 등 명시 적 선택을해야하고, 그것은 등 서명되지 않은 가정).

    또한 - 화이트리스트 테이블 이름을 확인합니다.

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

    3.당신은 다른 매개 변수와 같은 매개 변수로 테이블 이름을 전달할 수 있습니다. 열쇠는 당신이 당신의 응용 프로그램 계층 또는 프록에 구축하는 것이 더 쉽습니다 경우 다음 고려해야 할 동적 SQL 문을 구축해야합니다.

    당신은 다른 매개 변수와 같은 매개 변수로 테이블 이름을 전달할 수 있습니다. 열쇠는 당신이 당신의 응용 프로그램 계층 또는 프록에 구축하는 것이 더 쉽습니다 경우 다음 고려해야 할 동적 SQL 문을 구축해야합니다.

    create procedure myProc
    
    @tableName nvarchar(50)
    
    as
    
    sp_executesql N'select * from ' + @tablename
    

    참고로이 코드 샘플을 sp_executesql의 적절한 구문 BOL를 보라 메모리이다.

    당신이 표시된 또한이 당신을 위해 문제가되지 않지만이 글을 읽는 사람이 같이 자신의 쿼리를 생성하기 위해 사용자의 입력을 받아들이는 매우 조심해야 SQL 주입에 매우 sucesptible입니다.

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

    4.SQL 쿼리 매개 변수는 리터럴 값을 대신 할 수 있습니다. 당신은 테이블 이름, 열 이름, 값 목록, 또는 다른 SQL 구문에 대한 매개 변수를 사용할 수 없습니다. 즉 데이터베이스의 모든 브랜드에서 표준 SQL의 행동입니다.

    SQL 쿼리 매개 변수는 리터럴 값을 대신 할 수 있습니다. 당신은 테이블 이름, 열 이름, 값 목록, 또는 다른 SQL 구문에 대한 매개 변수를 사용할 수 없습니다. 즉 데이터베이스의 모든 브랜드에서 표준 SQL의 행동입니다.

    테이블 이름 동적 할 수있는 유일한 방법은 당신이 문으로 해당 문자열을 준비하기 전에 SQL 쿼리에 변수를 보간하는 것입니다.

    BTW, 당신이있는 거 속이고 자신이이 SQL 인젝션의 위험 아니라고 생각합니다. 동적 쿼리에 테이블 이름을 보간하는 경우, 당신은 당신이 변수에서 보간 문자열 리터럴 주위에 따옴표를 사용하는 것처럼, 테이블 이름 주위에 구분 식별자를 사용합니다.

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

    5.이 SQL 주입하는 경향이 아니라고 생각은 잘못이다. 이 프런트 엔드 사용자의 SQL 주입에 덜 경향이있을 수 있지만, 그것은 여전히 ​​SQL 주입에 매우 경향이있다. 데이터베이스에서 대부분의 공격은 최종 사용자하지, 회사가 공격을 받고 내부에서 온다.

    이 SQL 주입하는 경향이 아니라고 생각은 잘못이다. 이 프런트 엔드 사용자의 SQL 주입에 덜 경향이있을 수 있지만, 그것은 여전히 ​​SQL 주입에 매우 경향이있다. 데이터베이스에서 대부분의 공격은 최종 사용자하지, 회사가 공격을 받고 내부에서 온다.

    직원들은이 불만 될 수 있습니다, 그들은 부정직 할 수있다, 원한을 가질 수있다, 또는 그들이 너무 밝은하지하고 우회 보안에 그것의 확인은 그들이 데이터베이스에 수행해야한다고 생각한다는 것입니다 무엇이든 할 수 있다고 생각 할 수 있습니다.

  6. ==============================

    6.사용자 Vimvq1987에 의해이 게시물 대답을 참조하십시오 : TABLENAME로 MySqlParameter

    사용자 Vimvq1987에 의해이 게시물 대답을 참조하십시오 : TABLENAME로 MySqlParameter

    기본적으로 먼저 테이블 이름이 파라미터 방식으로 사용되는 스키마에 테이블 이름을 확인합니다. 모두가 확인되었을 경우, 테이블 이름은 합법적이다.

    의역 기본적인 아이디어는 다음과 같습니다

        SELECT table_name
        FROM information_schema.tables
        WHERE table_schema = 'databasename'
        AND table_name = @table;
    
        cmd.Parameters.AddWithValue("@table",TableName);
    

    테이블 이름이 반환 확인하면 메인 쿼리 가서 ...

  7. ==============================

    7.난 그냥 확인 것 OBJECT_ID (@tablename)를 선택 아이디어는 당신이 테이블 이름이어야한다 알고 주입을 방지하는 것입니다이이 반환 숫자가 다음 내가 실제 쿼리를 실행한다면이었다,

    난 그냥 확인 것 OBJECT_ID (@tablename)를 선택 아이디어는 당신이 테이블 이름이어야한다 알고 주입을 방지하는 것입니다이이 반환 숫자가 다음 내가 실제 쿼리를 실행한다면이었다,

  8. from https://stackoverflow.com/questions/372033/parameterise-table-name-in-net-sql by cc-by-sa and MIT license