2010-11-22 3 views
3

ADO.NET에서는 명령 개체에 매개 변수를 추가하여 사용자 입력을 SQL 쿼리에 안전하게 추가 할 수 있습니다. SQL 쿼리와 공통된 다른 조건 자에 해당하는 것은 무엇입니까?ADO.NET에서 변경 테이블을 안전하게 선택하여 쿼리를 만들려면 어떻게해야합니까?

본질적으로 매우 제한된 O-R 매퍼 및 SQL 생성기 (메타 정보 및 해당 메타 데이터를 준수하는 다른 데이터베이스가있는 데이터베이스 주위에 집중적으로 초점을 맞춘 프로그램)를 작성 중입니다. 합니다 (criteria 같이) 그대로 신뢰할 수있는 사용자 (내 회사에서 다른 개발자)에 의해 내 프로그램에 입력됩니다 다른 데이터가 입력되는 동안,

string sql = "select " + USER_SELECTED_COLUMNS + 
      " from " + USER_SELECTED_TABLE + 
      " where " + USER_CRITERIA; 

그것의 일부 : 결과적으로 내가 좋아하는 물건을 호출 할 수 있어야합니다 신뢰할 수없는 사용자 (고객)가 검색을 통해 내 프로그램에 넣을 수 있습니다.

나는이 프로그램을 안전하게 만들고 싶습니다. 현재 USER_SELECTED_COLUMNS이 명령 매개 변수로 대체되었지만 표준 및 표와 동일한 항목을 찾을 수 없었습니다. (또는 주문 별 열). 비 선택 술어에 사용할 수있는 SqlParameter과 유사한 ADO.NET 기능이 있습니까?

사용의 화이트리스트, NOT 블랙리스트 :

+1

이것은 SQL 주입의 악몽입니다. ​​신중하게 진행하고 앱에서 적절한 펜 테스트를 수행하십시오. – Jamiec

+0

예, 알고 있습니다. 따라서 질문. 다른 한편, 우리 고객은 16 년 동안 100 % 주입 공격에 취약한 시스템 버전을 사용하고 있습니다. 그것은 비즈니스 - 고객 관계에 대한 아름다운 것입니다. 하지만 : VB6/ADO에서 C#/ADO.NET으로 마이 그 레이션을하고 있기 때문에 추가 보안이 손상되지는 않을 것이라고 생각했습니다. – Crisfole

답변

5

은 내가 한 응답에서 SQL 주입을 방지하는 방법을 말할 수있는 것 같아요,하지만 난 당신을 줄 수있는 주요 포인터가 이것이다.

즉, USER_SELECTED_TABLE에 대한 사용자 입력을 살균하는 경우 가능한 입력은 가능한 테이블이어야합니다. Equaly의 경우 USER_SELECTED_COLUMNS의 입력은 USER_SELECTED_TABLE의 가능한 열로 제한되어야합니다.

+0

+1 허용 목록입니다. 아멘! – Steven

+0

그래서 열이 선택되지 않은 다른 매개 변수를 살균하는 실제적인 방법이 없다는 것을 모았습니까? – Crisfole

2

사용자가 테이블을 선택할 수있는 화면을 만들고 열에서 실제 이름을 사용하지 않을 때. 당신이 UserID를 가지지 만 UserName을 보여줄 수있는 종류. object_id 및 column_id (sys.tables.object_id 및 sys.columns.object_id + column_id와 같은 형식)를 사용하십시오. 프로 시저에 사람들을 PA와 시스템 뷰에 가입 만 숫자 ID를 사용하여 SQL을 구축 :

sys.tables (Transact-SQL)
sys.columns (Transact-SQL)

당신이 문자열 테이블과 열 이름을 연결할 수 있지만 시스템에서 올 것이다 사용자 입력에서가 아니라보기.

1

위에 표시된 모든 변수를 Microsoft Web Protection Library을 통해 실행하십시오. SQL Injection과 XSS 공격으로부터 안전을 제공합니다. 코드 숨김에서 사용하는 방법을 보여주는 다운로드 예제가 있습니다.

관련 문제