ql 주입 공격 탐지 및 실례 분석
mysql> show create table zzz;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| zzz | CREATE TABLE `zzz` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`password` varchar(64) NOT NULL,
`score` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
표 내용:
mysql> select * from zzz;
+----+-------+----------+-------+
| id | name | password | score |
+----+-------+----------+-------+
| 1 | taoge | 123 | 100 |
+----+-------+----------+-------+
1 row in set (0.00 sec)
mysql>
설명하고자 하는 것은 암호를 명문으로 저장하는 것 자체가 안전하지 않다는 것이다.밀문 저장소를 사용해도 안전하지 않으니 소금을 넣은 해시를 고려해야 한다.그러나 본문은 간편하게 보기 위해 우선 이 문제를 토론하지 않는다.
현재 사용자가 name과password를 입력한 다음에 score의 값을 조회해야 한다고 가정하면 페이지는 백엔드로 보내기를 요청하고 백엔드에서 위조 코드는 다음과 같다.
string strName = ... ;
string strPassword = ... ;
select * from zzz where name=strName and password=strPassword ...
이 때 taoge가 직접 검색하면name(taoge)과password(123)를 입력한 후 실행하는 검색 동작은 다음과 같습니다.
mysql> select * from zzz where name='taoge' and password='123';
+----+-------+----------+-------+
| id | name | password | score |
+----+-------+----------+-------+
| 1 | taoge | 123 | 100 |
+----+-------+----------+-------+
1 row in set (0.00 sec)
mysql>
자신의 점수를 정확하게 알아낼 수 있어 합리적이다.
그러나 위의 코드는 sql 주입 위험이 있다. 만약에 Jack이 Taoge의 점수를 조회하고 싶지만 Taoge의 비밀번호를 모르면 어떡하지?또는 조회 가능: Jack이 페이지에 각각 입력
사용자 이름: taoge'or 1 = 1; #
암호:hehe
그러면 페이지를 통해 백그라운드로 전송된 후 백그라운드에서 수행되는 작업은 다음과 같습니다.
mysql> select * from zzz where name='taoge' or 1 = 1 ; #' and password='hehe';
+----+-------+----------+-------+
| id | name | password | score |
+----+-------+----------+-------+
| 1 | taoge | 123 | 100 |
+----+-------+----------+-------+
1 row in set (0.00 sec)
이를 통해 알 수 있듯이 Jack이 Taoge의 비밀번호 123을 몰라도 sql 주입을 통해 이루어질 수 있다.위 문장에서 #은 주석 기호의 역할을 하고 1=1은 영원히 진실이기 때문에 백그라운드를 도는 암호 검사 논리에 해당한다.
백엔드 시스템은 어떻게 이런 ql 주입 공격에 대항해야 합니까?
1.매개 변수에 대해 엄격한 검사를 진행하다
2. mysql_real_escape_string 만들기
3. 버퍼 오버플로우 방지
......
ql의 주입 공격에 관해서는 뒤에도 계속 소개할 것입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MYSQL 최대 연결 수 보기 및 최대 연결 수 수정우 리 는 MySQL 의 최대 연결 수의 기본 값 이 100 이라는 것 을 잘 알 고 있 습 니 다. 연결 요청 이 기본 연결 수 보다 많 으 면 데이터 베 이 스 를 연결 할 수 없 는 오류 가 발생 할 수 있 기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.