[SQL] INSERT에 대한 SQL 주입
SQLINSERT에 대한 SQL 주입
나는 우리 회사의 인트라넷에 작은 설문 조사 웹 페이지를 만들었습니다. 이 웹 페이지는 외부에서 액세스 할 수 없습니다.
양식은 단순히 라디오 버튼의 몇 가지이며 코멘트 상자.
나는 좋은 코딩 관행을 유지하고 SQL 주입을 방지하려는 싶습니다.
SQL 주입은 텍스트 상자의 의견과 함께 삽입 문에 일어날 수 있습니까? 그렇다면, 어떻게 .NET 2.0을 사용하여 방지 할 수 있습니까?
해결법
-
==============================
1.주입은 제대로 실행되지 SQL 문에 발생할 수 있습니다.
주입은 제대로 실행되지 SQL 문에 발생할 수 있습니다.
예를 들어, 귀하의 코멘트 테이블은 두 개의 필드, 정수 ID 및 주석 문자열을 가지고 척하자. 다음과 같이 그래서 당신은 INSERT 것입니다 :
INSERT INTO COMMENTS VALUES(122,'I like this website');
누군가가 다음 주석을 입력 고려 :
'); DELETE FROM users; --
당신은 어떤 코멘트 다음에 다음 두 문장에 당신의 단일 INSERT를 돌 수 있었다이를 처리하지 않고 SQL에 주석 문자열을 넣을 경우 :
INSERT INTO COMMENTS VALUES(123,''); DELETE FROM users; -- ');
이는 사용자 테이블에서 모든 것을 삭제합니다. 그리고 시행 착오와 다양한 트릭을 사용하여 비울 수있는 권리 TABLENAME을 찾는 하루 종일 지출하고자하는 사람들이있다. 여기에 당신이 SQL 주입 공격을 수행 할 수있는 방법에 대한 설명입니다.
이를 방지하기 위해 매개 변수화 된 SQL 문을 사용합니다.
그리고 이것은 단지 보안상의 이유로이 아니다. 예를 들어, 당신은 순진하게도 다음과 같은 코멘트를 SQL 문을 만드는 경우 :
I'm just loving this website
아포스트로피의 닫는 따옴표로 SQL에 의해 해석되고 때문에 SQL 구문 오류가 발생합니다.
-
==============================
2.텍스트가 자동으로 인용 될 수 있도록 사용하여 쿼리를 매개 변수화.
텍스트가 자동으로 인용 될 수 있도록 사용하여 쿼리를 매개 변수화.
SqlCommand command = connection.CreateCommand(); command.CommandText = "insert into dbo.Table (val1,val2,txt) values (@val1,@val2,@txt)"; command.AddParameterWithValue( "val1", value1 ); command.AddParameterWithValue( "val2", value2 ); command.AddParameterWithValue( "txt", text ); ...
-
==============================
3.SQL 주입하면 데이터베이스에 쿼리 등을 통과 언제든지 발생할 수 있습니다. 다음은 간단한 데모입니다 :
SQL 주입하면 데이터베이스에 쿼리 등을 통과 언제든지 발생할 수 있습니다. 다음은 간단한 데모입니다 :
SQL 인젝션은 설명했다
핵심은 .NET 내에서, 데이브 웹이이 주신대로하는 것입니다. 그것은 쿼리를 변경하는 SQL 서버에 의해 해석 또는 추가 명령을 추가 할 수있는 모든 문자를 처리, 제출 한 매개 변수로 전체 문자열을 포괄하여 주입 시도를 방지 할 수 있습니다.
그리고 SQL 주입 응용 프로그램뿐 아니라 웹 애플리케이션에서 발생할 수 있다고 지적한다. 그리고 내부 공격은 일반적으로 조직에 가장 비용이 많이 드는입니다. 하나는 안전하게 공격이 내에서 발생하지 않을 것이라고 가정 할 수 없다.
-
==============================
4.예, 그럴 수 있습니다. 하자가 클라이언트가이 보내는 말 :
예, 그럴 수 있습니다. 하자가 클라이언트가이 보내는 말 :
OR 1 = 1
그건 당신이 매우 고통 스러울 수
SELECT * FROM admin WHERE name = @name AND password = @password
당신은 이것을 방지 할 수 있습니다
-
==============================
5.네,이 발생할 수 있습니다. 이 방지하는 가장 쉬운 방법은 수동으로 SQL을 구축보다는 준비된 문을 사용하는 것입니다.
네,이 발생할 수 있습니다. 이 방지하는 가장 쉬운 방법은 수동으로 SQL을 구축보다는 준비된 문을 사용하는 것입니다.
그래서, 오히려 이보다 :
String sql = String.Format("INSERT INTO mytable (text_column) VALUES ( '{0}' )", myTextBox.Text); // Unsafe!
당신이 뭔가를 할 것이다 :
String sql = "INSERT INTO mytable (text_column) VALUES ( ? )"; // Much safer
그런 다음 자동으로 이스케이프의 원인이 될 수 있고, 대체됩니다 DbCommand에 대한 매개 변수로 텍스트 상자의 텍스트를 추가 "를?" 는 SQL있다.
-
==============================
6.당신의 SQL에 문자열을 준비 제표 및 매개 변수를 사용하여보다는 합치뿐만 아니라 당신은 또한 다음을 수행해야합니다 :
당신의 SQL에 문자열을 준비 제표 및 매개 변수를 사용하여보다는 합치뿐만 아니라 당신은 또한 다음을 수행해야합니다 :
-
==============================
7.준비된 문을 사용하여 방지 SQL 주입. placehoder (?)의 사용은 완전히 SQL 주입 취약점을 제거합니다. 예 사용자 이름이 '+ request.getparameter ( "이름") +'= user_table에서 문자열 SQL = 선택 *; statement.executeQuery (SQL);
준비된 문을 사용하여 방지 SQL 주입. placehoder (?)의 사용은 완전히 SQL 주입 취약점을 제거합니다. 예 사용자 이름이 '+ request.getparameter ( "이름") +'= user_table에서 문자열 SQL = 선택 *; statement.executeQuery (SQL);
위의 문장은 SQL 인젝션에 취약합니다.
SQL 인젝션에 대한 안전하게 확인하십시오. 스 니펫 다음 사용
문자열 SQL = user_table에서 선택 * 어디에 사용자 이름 =?; (1 자명) statement.setString;
-
==============================
8.SQL 주입의 양식을 방지하는 가장 쉬운 방법은, 오히려 그 후에 실행하는 SQL 문을 구축하는 매개 변수와 저장 프로 시저를 사용하는 것입니다. (에서 C # 또는 내부적으로 SQL 서버).
SQL 주입의 양식을 방지하는 가장 쉬운 방법은, 오히려 그 후에 실행하는 SQL 문을 구축하는 매개 변수와 저장 프로 시저를 사용하는 것입니다. (에서 C # 또는 내부적으로 SQL 서버).
그러나 지금까지 내부적으로 발생하는 가능성이 최상의 최소화로 물론 그것은 당신의 기업 정책 않는 한 나는 완전히 확실히 당신이 시간을 소비해야 아니에요, 그리고이 발생 않은 경우에, 나는 당신이 알고있는 것입니다 희망 즉시 사람 그것은.
from https://stackoverflow.com/questions/681583/sql-injection-on-insert by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열에서 MySQL의 일부 값 앞에 0을 추가 (0) | 2020.04.07 |
---|---|
[SQL] 반환 JSON의 배열 SQL에서 객체로 (포스트 그레스) (0) | 2020.04.07 |
[SQL] 어떻게 별도로 localdb 설치 하는가? (0) | 2020.04.07 |
[SQL] 어떻게 재 작성하는 구별된다과 구별되지 않는 이유는 무엇입니까? (0) | 2020.04.07 |
[SQL] 가장 빠른 방법은 120 만 개 기록을 업데이트 (0) | 2020.04.07 |