권한이 없는 테이블에서도 외래 키가 붙어 있으면 내용을 볼 수 있는 메모
동기
"그러고 보면 외래 키를 악용되면 권한이 없는 테이블의 데이터도 볼 수 있지?"라고 해 보았다.
생각해 보면 당연한 일이지만, 해보는 것이 중요.
이전 준비
$ mysql -uroot
mysql> create database testDB;
Query OK, 1 row affected (0.00 sec)
mysql> use testDB
Database changed
mysql> create table A(num int not null unique);
Query OK, 0 rows affected (0.03 sec)
mysql> create table B(num int not null);
Query OK, 0 rows affected (0.02 sec)
mysql> alter table B add constraint num_key foreign key (num) references A(num);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
이런 식의 테이블이 완성된다
데이터 삽입
mysql> insert into A(num) values (3), (5), (8);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from A;
+-----+
| num |
+-----+
| 3 |
| 5 |
| 8 |
+-----+
3 rows in set (0.00 sec)
테이블 A에 3과 5와 8을 넣어 보았다.
mysql> insert into B(num) values (3);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (4);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
테이블 B에 3을 넣어 보았더니 무사히 삽입되었지만 4를 넣으려고 해도 연주된다.
외래 키를 붙이고 있기 때문에.
mysql> delete from B;
Query OK, 1 row affected (0.00 sec)
우선 데이터 삭제.
주제
mysql> create user cracker;
Query OK, 0 rows affected (0.04 sec)
mysql> grant all on testDB.B to cracker;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
$ mysql -ucracker;
mysql> use testDB;
Database changed
사용자를 만들고 테이블 B의 조작권만 건네주고, 그 사용자로 로그인.
mysql> select * from A;
ERROR 1142 (42000): SELECT command denied to user 'cracker'@'localhost' for table 'a'
mysql> select * from B;
Empty set (0.00 sec)
테이블 A는 볼 수 없지만 테이블 B는 볼 수 있습니다.
mysql> insert into B(num) values (0);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (3);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (4);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (6);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (7);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (8);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (9);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (10);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
0~10까지 B에 대입해 보니 A에 들어가 있는 것이 0~10의 범위에서는 3과 5와 8인 것을 알 수 있었다.
정리
권한에는 조심하자.
Reference
이 문제에 관하여(권한이 없는 테이블에서도 외래 키가 붙어 있으면 내용을 볼 수 있는 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Goryudyuma/items/4fe3ce5eeab02aa530f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ mysql -uroot
mysql> create database testDB;
Query OK, 1 row affected (0.00 sec)
mysql> use testDB
Database changed
mysql> create table A(num int not null unique);
Query OK, 0 rows affected (0.03 sec)
mysql> create table B(num int not null);
Query OK, 0 rows affected (0.02 sec)
mysql> alter table B add constraint num_key foreign key (num) references A(num);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into A(num) values (3), (5), (8);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from A;
+-----+
| num |
+-----+
| 3 |
| 5 |
| 8 |
+-----+
3 rows in set (0.00 sec)
mysql> insert into B(num) values (3);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (4);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> delete from B;
Query OK, 1 row affected (0.00 sec)
mysql> create user cracker;
Query OK, 0 rows affected (0.04 sec)
mysql> grant all on testDB.B to cracker;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
$ mysql -ucracker;
mysql> use testDB;
Database changed
mysql> select * from A;
ERROR 1142 (42000): SELECT command denied to user 'cracker'@'localhost' for table 'a'
mysql> select * from B;
Empty set (0.00 sec)
mysql> insert into B(num) values (0);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (3);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (4);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (6);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (7);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (8);
Query OK, 1 row affected (0.00 sec)
mysql> insert into B(num) values (9);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
mysql> insert into B(num) values (10);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`b`, CONSTRAINT `num_key` FOREIGN KEY (`num`) REFERENCES `A` (`num`))
권한에는 조심하자.
Reference
이 문제에 관하여(권한이 없는 테이블에서도 외래 키가 붙어 있으면 내용을 볼 수 있는 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Goryudyuma/items/4fe3ce5eeab02aa530f8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)