SQL 주입 및 예방
3917 단어 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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 중첩된 객체를 정확히 일치 검색 - PostgreSQL목차 * 🚀 * 🎯 * 🏁 * 🙏 JSON 객체 예시 따라서 우리의 현재 목표는 "고용주"사용자가 입력한 검색어(이 경우에는 '요리')를 얻고 이 용어와 정확히 일치하는 모든 사용자 프로필을 찾는 것입니다. 즐거운 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.