[SQL] .NET / SQL에서 매개 변수화 된 테이블 이름?
SQL.NET / SQL에서 매개 변수화 된 테이블 이름?
주제는 내가 .NET을 사용하여 매개 변수로 테이블 이름을 통과 할 수하고자하는 제안 및 SQL 서버 (문제가있는 정말 언어를하지 않습니다)로.
나는 예를 들어, 값이 작업을 수행하는 방법을 알고 command.Parameters.AddWithValue ( "무엇", 무엇이든) 매개 변수를 표시하기 위해 쿼리에서 @whatever를 사용하여. 문제는 내가 같은 컬럼과 테이블 이름과 같은 쿼리의 다른 부분이 작업을 수행 할 수 있도록하고자하는 상황에서 오전입니다.
이것은 이상적인 상황은 아니지만 내가 사용해야 하나, 그것은이 테이블 이름이 아닌 최종 사용자를 설정할 수있는 코드를 사용하여 사람 만 같은 SQL 주입 정말 경향이 아니에요입니다. 그러나 그것은 혼란이다.
그래서, 가능한 요구하고 무엇인가?
편집이 : SQL 주입에 대한 점을 명확하게하기 위해, 테이블 이름은 상황에 따라 소스 코드에 전달됩니다. 그것은이 지정하는 개발자이다. 개발자는 어쨌든 데이터베이스 계층에 액세스 할 수 있습니다, 그래서 요구하고있는 이유는 보안을 위해 너무 많은 것이 아니라 단지 코드 청소기를 만들기 위해.
해결법
-
==============================
1.나는 지금까지 내가 본 어떤 SQL 언어에서이 기능을 본 적이 생각하지 않는다, 그러나 전문 지식의 영역이 아니다.
나는 지금까지 내가 본 어떤 SQL 언어에서이 기능을 본 적이 생각하지 않는다, 그러나 전문 지식의 영역이 아니다.
'.'나 '_', AZ, AZ, 0-9로 문자를 제한 제시하고 ''것 - 다음 적절한 브라켓이 랩에 (예를 들어, [] SQL Server 용, 내가 믿는) 데이터베이스에 대해 무엇이든 사용 전체를 반올림. 그런 다음 바로 SQL에 직접 배치합니다.
당신은 소스 코드 만 소스 코드에있을 것입니다 이름을 의미합니까 - 전적으로 당신이이 SQL 주입 위험이없는 대해 무엇을 의미하는지 분명하지 않다? 그렇다면, 나는 더 나은 일을하게 동의합니다. 당신이 강정 (의도적으로 또는 없음)으로하지 개발자를 신뢰하는 경우에도, 자동 브라케팅 할 필요가 없습니다 수 있습니다.
-
==============================
2.직접 테이블 이름을 매개 변수화 할 수 없습니다. 당신은 sp_executesql을 통해 간접적으로 그것을 할 수 있습니다,하지만 당신은 단지뿐만 아니라 (테이블 이름을 연결 아닌 다른 값)을 (매개 변수) TSQL에서 C #을 구축하고 명령으로 내려 보낼 수 있습니다. 당신은 동일한 보안 모델을 얻을 수 (즉, 당신은 등 명시 적 선택을해야하고, 그것은 등 서명되지 않은 가정).
직접 테이블 이름을 매개 변수화 할 수 없습니다. 당신은 sp_executesql을 통해 간접적으로 그것을 할 수 있습니다,하지만 당신은 단지뿐만 아니라 (테이블 이름을 연결 아닌 다른 값)을 (매개 변수) TSQL에서 C #을 구축하고 명령으로 내려 보낼 수 있습니다. 당신은 동일한 보안 모델을 얻을 수 (즉, 당신은 등 명시 적 선택을해야하고, 그것은 등 서명되지 않은 가정).
또한 - 화이트리스트 테이블 이름을 확인합니다.
-
==============================
3.당신은 다른 매개 변수와 같은 매개 변수로 테이블 이름을 전달할 수 있습니다. 열쇠는 당신이 당신의 응용 프로그램 계층 또는 프록에 구축하는 것이 더 쉽습니다 경우 다음 고려해야 할 동적 SQL 문을 구축해야합니다.
당신은 다른 매개 변수와 같은 매개 변수로 테이블 이름을 전달할 수 있습니다. 열쇠는 당신이 당신의 응용 프로그램 계층 또는 프록에 구축하는 것이 더 쉽습니다 경우 다음 고려해야 할 동적 SQL 문을 구축해야합니다.
create procedure myProc @tableName nvarchar(50) as sp_executesql N'select * from ' + @tablename
참고로이 코드 샘플을 sp_executesql의 적절한 구문 BOL를 보라 메모리이다.
당신이 표시된 또한이 당신을 위해 문제가되지 않지만이 글을 읽는 사람이 같이 자신의 쿼리를 생성하기 위해 사용자의 입력을 받아들이는 매우 조심해야 SQL 주입에 매우 sucesptible입니다.
-
==============================
4.SQL 쿼리 매개 변수는 리터럴 값을 대신 할 수 있습니다. 당신은 테이블 이름, 열 이름, 값 목록, 또는 다른 SQL 구문에 대한 매개 변수를 사용할 수 없습니다. 즉 데이터베이스의 모든 브랜드에서 표준 SQL의 행동입니다.
SQL 쿼리 매개 변수는 리터럴 값을 대신 할 수 있습니다. 당신은 테이블 이름, 열 이름, 값 목록, 또는 다른 SQL 구문에 대한 매개 변수를 사용할 수 없습니다. 즉 데이터베이스의 모든 브랜드에서 표준 SQL의 행동입니다.
테이블 이름 동적 할 수있는 유일한 방법은 당신이 문으로 해당 문자열을 준비하기 전에 SQL 쿼리에 변수를 보간하는 것입니다.
BTW, 당신이있는 거 속이고 자신이이 SQL 인젝션의 위험 아니라고 생각합니다. 동적 쿼리에 테이블 이름을 보간하는 경우, 당신은 당신이 변수에서 보간 문자열 리터럴 주위에 따옴표를 사용하는 것처럼, 테이블 이름 주위에 구분 식별자를 사용합니다.
-
==============================
5.이 SQL 주입하는 경향이 아니라고 생각은 잘못이다. 이 프런트 엔드 사용자의 SQL 주입에 덜 경향이있을 수 있지만, 그것은 여전히 SQL 주입에 매우 경향이있다. 데이터베이스에서 대부분의 공격은 최종 사용자하지, 회사가 공격을 받고 내부에서 온다.
이 SQL 주입하는 경향이 아니라고 생각은 잘못이다. 이 프런트 엔드 사용자의 SQL 주입에 덜 경향이있을 수 있지만, 그것은 여전히 SQL 주입에 매우 경향이있다. 데이터베이스에서 대부분의 공격은 최종 사용자하지, 회사가 공격을 받고 내부에서 온다.
직원들은이 불만 될 수 있습니다, 그들은 부정직 할 수있다, 원한을 가질 수있다, 또는 그들이 너무 밝은하지하고 우회 보안에 그것의 확인은 그들이 데이터베이스에 수행해야한다고 생각한다는 것입니다 무엇이든 할 수 있다고 생각 할 수 있습니다.
-
==============================
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.난 그냥 확인 것 OBJECT_ID (@tablename)를 선택 아이디어는 당신이 테이블 이름이어야한다 알고 주입을 방지하는 것입니다이이 반환 숫자가 다음 내가 실제 쿼리를 실행한다면이었다,
난 그냥 확인 것 OBJECT_ID (@tablename)를 선택 아이디어는 당신이 테이블 이름이어야한다 알고 주입을 방지하는 것입니다이이 반환 숫자가 다음 내가 실제 쿼리를 실행한다면이었다,
from https://stackoverflow.com/questions/372033/parameterise-table-name-in-net-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 이동 평균 MySQL을 계산? (0) | 2020.05.06 |
---|---|
[SQL] 자바 - 연결 닫은 후 결과 집합 사용할 수 없습니다 (0) | 2020.05.06 |
[SQL] ASP.Net에서 SQL 주입을 방지 (0) | 2020.05.06 |
[SQL] 당신은 어떻게 하나 개는 mysql_query에서 여러 SQL 문을합니까? (0) | 2020.05.06 |
[SQL] 가장 빠른 방법은 반경 MySQL을 내 포인트에 대한 큰 테이블을 조회하는 뭐죠 (위도, 경도) (0) | 2020.05.06 |