2011-01-09 2 views
3

사용자 그룹이 DBD::mysql을 사용하여 Perl의 DBI를 통해 mysql에 제출할 수 있도록 허용하는 경우 사용자가 데이터베이스를 변경하거나 중요하지 않은 정보를 유출하거나 중요한 문제를 일으킬 수있는 것이 무엇이든 $ 할 수 있습니다. 데이터베이스로드? 그렇다면 어떻게?mysql에서 "설명 ..."항상 안전합니까?

나는 "explain $whatever" 하나의 테이블/컬럼이 존재 알아낼 수 있습니다 통해 (는하지만, 이름을 추측에 당신이) 알고와 테이블에 얼마나 많은 기록이다 대략 또는 얼마나 많은 레코드는 인덱스 필드에 대한 특정 값이 . 인덱스되지 않은 필드의 내용에 대한 정보를 얻을 수있을 것으로 기대하지 않습니다.

DBD::mysql은 여러 개의 명령문을 허용해서는 안되므로 모든 쿼리를 실행할 수 있다고 기대하지 않습니다. 하위 쿼리조차도 실행하면 안됩니다.

하지만 저는 MySQL 전문가가 아니며 분명히 인식하지 못하는 MySQL 기능도 있습니다.

쿼리 계획을 세우려고 할 때 인덱스 된 필드를 비교할 값을 찾기 위해 옵티마이 저가 실제로 식을 실행할 수 있습니까?

explain select * from atable where class = somefunction(...) 

atable.class 색인 및 고유하지와 class='unused' 더 기록을 찾을 수 없을 것입니다하지만 class='common' 백만 기록을 찾을 것입니다된다.을 평가할 수 있습니까? 그리고 나서 somefunction(...)이 데이터를 수정하도록 작성 될 수 있습니까?

+3

아마도 안전하지만 어쨌든 그렇게하지는 않을 것입니다.)'explain '로 속일 이유가있는 사람은 DB 및 mysql CLI 테스트 사본을 받아야합니다. 테스트 DB를 필요로하지 않는 사람은 쿼리 작성으로 저장해야하므로'explain'이 필요하지 않습니다.) – hobbs

답변

6

"Explain"은 실행하는 데 오랜 시간이 걸릴 수 있습니다. 예를 들어 너무 많은 중첩 된 하위 쿼리로 인해 스택 오버플로가 발생하는 등의 일이 발생하면 충돌하는 등의 임의의 서버 리소스를 사용할 수 있습니다.

"설명"은 임시 디스크 공간, 서버 주소 공간 (32 비트 시스템에서 64 비트 시스템의 가상 메모리) 또는 스레드 스택 (고의적으로 악의적으로 생성 된 쿼리의 경우)을 쉽게 소모 할 수 있습니다.

일반적으로 전적으로 신뢰할 수없는 사용자가 SQL의 일부를 제출할 수 없습니다. 단일 테이블에 대한 액세스 권한이 없어도 서버를 열심히 시도해도 서버가 손상 될 수 있습니다.


편집 : 추가 정보

익명 뷰를 사용하는 쿼리는/종종 임시 테이블에, EXPLAIN에 따라 전체 내부 쿼리를 실행, 하위 쿼리를 구체화. 형태

SELECT * FROM (
    SELECT h1.*, h2.* FROM huge_table h1, huge_table h2) AS rediculous 

그래서 쿼리는 설명하고 TMPDIR의 디스크 공간을 소비 영원히 소요됩니다.

+1

자세한 정보를 제공해 줄 수 있습니까? 어떤 종류의 설명이 임의로 오랜 시간이 걸리거나 임시 디스크 공간이나 메모리를 소모 할 수 있습니까? – ysth

+0

감사합니다. 그것은 좋은 통찰력입니다. "설명하다"다음에 텍스트의 전체 크기를 제한하는 것처럼 다소 모자 랄 수있는 것처럼 들립니다. 적어도 ** 나는 O (n!) 또는 O (n ** 2)로 설명하기 위해 복잡성이 커지는 SQL 쿼리를 쿼리 텍스트의 길이와 비교할 수 없습니다. – tye

+0

예를 들어 보았습니다. – MarkR

1

사용자가 데이터베이스에 연결할 수 있지만 변경하지 못하도록하려면 사용자 권한을 사용하도록 설정해야합니다. SELECT 권한 만있는 경우 아무 것도 변경할 수 없습니다.

+0

감사합니다. 훌륭한 충고입니다. 읽기 전용 사용자를 추가하고 "설명"을 할 때이를 사용하면 주요 위험 ("설명"을 통해 업데이트하는 방법을 알아내는 사람)이 완전히 제거됩니다. – tye

+0

권한 시스템은 사람들이 데이터를 변경하는 것을 막지 만, 서버를 손상 시키거나 서비스 거부를 야기하지 않습니다. 내 대답을 참조하십시오. – MarkR

3

정확한 쿼리와 일치하는 행의 정확한 수를 얻기 위해 '설명'을 사용할 수있었습니다.그래서 하나는 빨리 어떤 '비밀'의 문자를 확인한 다음, 결국 '비밀'의 값을 드러내는, 문자의 순서를 결정로 이동합니다

explain select * from user where name='tye' and secret like '%a%' 

를 사용할 수 있습니다.