SQL 주입 및 예방

3917 단어 sql
SQL 주입 원리
예전 에 웹 프로그램 이 데이터 베 이 스 를 방문 할 때 보통 문자열 을 연결 하 는 형식 을 취 했 습 니 다. 예 를 들 어 로그 인 할 때 사용자 이름과 비밀번호 에 따라 조회 합 니 다.
string sql = “select * from user where UserName = ‘” + userName + “’ and Password = ‘” + password + “’”;

그 중에서 userName 과 password 두 변수의 값 은 사용자 가 입력 한 것 입 니 다.password 의 값 이 'or' = '이 라 고 가정 하면 userName 의 값 이 임 의 입 니 다. 그 변수 sql 의 값 은:
select * from user where UserName = ‘user’ and Password = ‘’ or ‘’ = ‘’;

'=' 은 항상 진실 이기 때문에 User 표 에 데이터 가 있 으 면 UserName, Password 의 값 이 일치 하 든 안 일치 하 든 이 SQL 명령 은 기록 을 찾 을 수 있 습 니 다.
예방 조치 - 파라미터 화 조회
파라미터 화 조회 (Parameterized Query 또는 Parameterized Statement) 는 데이터베이스 와 링크 를 설계 하고 데 이 터 를 방문 할 때 수치 나 데 이 터 를 입력 해 야 하 는 곳 에서 파라미터 (Parameter) 를 사용 하여 값 을 주 는 것 을 말한다. 이 방법 은 현재 SQL 삽입 공격 (SQL Injection) 을 예방 하 는 가장 효과 적 인 방어 방식 으로 여 겨 지고 있다.
매개 변수 화 조 회 를 사용 하 는 상황 에서 데이터베이스 서버 는 매개 변수 화 된 내용 을 SQL 명령 의 일부분 으로 처리 하지 않 고 데이터베이스 에서 SQL 명령 의 컴 파일 을 완성 한 후에 야 매개 변 수 를 사용 하여 실행 합 니 다.따라서 매개 변수 에 악성 명령 이 포함 되 어 있 더 라 도 컴 파일 이 완료 되 었 기 때문에 데이터 베 이 스 를 실행 하지 않 습 니 다.
매개 변수 가 있 는 SQL 명령
1)Microsoft SQL Server
Microsoft SQL Server 의 매개 변수 형식 은 '@' 문자 에 매개 변수 이름 을 추가 하고 익명 매개 변수 도 지원 합 니 다.
select * from user where sex=@sex
insert  into  user(c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)

2)Microsoft Access
Microsoft Access 는 익명 의 인자 만 지원 합 니 다. "?"
update  user  set c1 = ?, c2 = ?, c3 = ? where c4 = ?

3)MySQL
MySQL 의 매개 변수 형식 은 '?' 문자 에 매개 변수 이름 을 붙 여 만 든 것 입 니 다.
update  user  set c1 = ?c1, c2 = ?c2, c3 = ?c3 where c4 = ?c4

비고: 익명 매개 변수 "?" 는 매개 변수 에 값 을 부여 할 때 반드시 순서대로 값 을 부여 해 야 합 니 다. 그렇지 않 으 면 실 수 를 할 수 있 습 니 다.
클 라 이언 트 프로그램
1) ADO. NET 예시
user 표 의 남성 사용 자 를 찾 으 려 면 SQL 문 구 는 다음 과 같 습 니 다.
select * from user where sex=1

매개 변수 화 SQL 문 구 를 사용 하여 다음 과 같이 표시 합 니 다.
select * from user where sex=@sex

SQL 문장의 매개 변수 값 을 지정 합 니 다. 만약 에 user 표 의 모든 연령 이 30 세 이상 인 남성 사용 자 를 찾 으 려 면 이 매개 변수 화 SQL 문 구 는 이렇게 쓸 수 있 습 니 다.
select * from user where sex=@sex and age>@age
//   Connection  
SqlConnection connect =newSqlConnection("server=localhost;database=test;uid=root;pwd=''");
//   Command  
SqlCommand command =newSqlCommand("select * from user where sex=@sex and age>@age", connect);

//             
command.Parameters.AddWithValue("@sex",true);

//             
SqlParameter parameter =newSqlParameter("@age", SqlDbType.Int);//User age   int 
parameter.Value = 30; 
command.Parameters.Add(parameter);//    

//       DataTable     
//   DataAdapter
SqlDataAdapter adapter =newSqlDataAdapter(command); 
DataTable data =newDataTable();

2)PHP
$sex = ‘ ’;
$age = ‘27’;
$query = sprintf("select * from user where sex='%s' and age>'%d'",
mysql_real_escape_string($sex),
mysql_real_escape_string($age));
mysql_query($query);

  :
$db = new mysqli("localhost", "user", "pass", "database");
$stmt = $mysqli -> prepare("select * from user where sex=? and age>?");
$stmt -> bind_param("sd", $sex, $age);
$sex = ‘ ’;
$age = ‘27’;
$stmt -> execute();

3)JDBC
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE USERNAME=? AND PASSWORD=?");
prep.setString(1, username);
prep.setString(2, password);

좋은 웹페이지 즐겨찾기