Menelusuri kueri
Saat menelusuri kueri yang dijalankan, ditemukan kueri di bawah ini yang mencantumkan folder pada drive satu per satu.
declare @Path nvarchar(255)
declare @Name nvarchar(255)
select @Path = N'D:\'
select @Name = null;
create table #filetmpfin (Name nvarchar(255) NOT NULL, IsFile bit NULL, FullName nvarchar(300) not NULL)
declare @FullName nvarchar(300)
if exists (select 1 from sys.all_objects where name = 'dm_os_enumerate_filesystem' and type = 'IF' and is_ms_shipped = 1)
begin
if (@Name is null)
begin
insert #filetmpfin select file_or_directory_name, 1 - is_directory, full_filesystem_path from sys.dm_os_enumerate_filesystem(@Path, '*') where [level] = 0
end
if (NOT @Name is null)
begin
if(@Path is null)
select @FullName = @Name
else
select @FullName = @Path + convert(nvarchar(1), serverproperty('PathSeparator')) + @Name
create table #filetmp3 ( Exist bit NOT NULL, IsDir bit NOT NULL, DirExist bit NULL )
insert #filetmp3 select file_exists, file_is_a_directory, parent_directory_exists from sys.dm_os_file_exists(@FullName)
insert #filetmpfin select @Name, 1-IsDir, @FullName from #filetmp3 where Exist = 1 or IsDir = 1
drop table #filetmp3
end
end
else
begin
if(@Name is null)
begin
if (right(@Path, 1) = '\')
select @Path= substring(@Path, 1, len(@Path) - charindex('\', reverse(@Path)))
create table #filetmp (Name nvarchar(255) NOT NULL, depth int NOT NULL, IsFile bit NULL )
insert #filetmp EXECUTE master.dbo.xp_dirtree @Path, 1, 1
insert #filetmpfin select Name, IsFile, @Path + '\' + Name from #filetmp f
drop table #filetmp
end
if(NOT @Name is null)
begin
if(@Path is null)
select @FullName = @Name
else
select @FullName = @Path + '\' + @Name
if (right(@FullName, 1) = '\')
select @Path= substring(@Path, 1, len(@FullName) - charindex('\', reverse(@FullName)))
create table #filetmp2 ( Exist bit NOT NULL, IsDir bit NOT NULL, DirExist bit NULL )
insert #filetmp2 EXECUTE master.dbo.xp_fileexist @FullName
insert #filetmpfin select @Name, 1-IsDir, @FullName from #filetmp2 where Exist = 1 or IsDir = 1
drop table #filetmp2
end
end
SELECT
Name AS [Name],
IsFile AS [IsFile],
FullName AS [FullName]
FROM
#filetmpfin
ORDER BY
[IsFile] ASC,[Name] ASC
drop table #filetmpfin
Fungsi utama yang digunakan adalah sys.dm_os_enumerate_filesystem
, untuk setiap folder yang dibuka, ia bergerak lebih dalam, contoh dari tingkat kedua:
select @Path = N'D:\Data\'
Untuk login reguler
Untuk login reguler semudah menyangkal izin pilih pada TVF ini untuk membuat pengguna tidak dapat membuat daftar folder.
DENY SELECT ON master.sys.dm_os_enumerate_filesystem TO [Domain\LoginName]
Saat mencoba memilih cadangan, pengguna harus melihat pesan ini:
Pengguna kemudian hanya dapat melihat huruf drive.
Untuk pengguna yang ada
Untuk pengguna yang ada, menolak pemilihan pada TVF secara langsung tidak berfungsi
Pengguna yang terkandung dapat berhasil menjalankan contoh kueri berikutnya
declare @Path nvarchar(255)
declare @Name nvarchar(255)
select @Path = N'D:\'
select file_or_directory_name, 1 - is_directory, full_filesystem_path from sys.dm_os_enumerate_filesystem(@Path, '*') where [level] = 0
Dan .... ini tidak berhasil:
use [PartialDb]
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO [PartialUser];
GO
Msg 4629, Level 16, State 10, Line 34 Izin pada tampilan katalog yang melingkupi server atau prosedur yang tersimpan sistem atau prosedur tersimpan yang diperpanjang dapat diberikan hanya ketika database saat ini adalah master.
Pernyataan di bawah berfungsi tetapi tidak membatasi pengguna, meskipun itu bukan bagian dari dbrole
peran
DENY VIEW DATABASE STATE TO [PartialUser];
DENY VIEW DEFINITION ON SCHEMA :: information_schema TO [PartialUser];
DENY VIEW DEFINITION ON SCHEMA :: sys TO [PartialUser];
DENY SELECT ON SCHEMA :: information_schema TO [PartialUser];
DENY SELECT ON SCHEMA :: sys TO [PartialUser];
Apa yang berhasil? Dalam teori
Karena pengguna yang terkandung menggunakan akun tamu / peran publik untuk terhubung dan memilih dari dmv, (peran publik memiliki akses ke objek tertentu secara default) kami dapat mencoba membatasi peran publik.
Ini tidak ideal karena sejumlah alasan. Misalnya, menolak> berikan dan sebagai akibatnya hanya anggota yang sysadmin
dapat memilih dari TVF ini.
Hal penting lain yang perlu diperhatikan adalah bahwa mengubah pengguna tamu / peran publik dapat memiliki efek samping yang tidak diketahui pada instance atau fungsi tertentu.
USE MASTER
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public;
GO
Mengubah izin publik / tamu bukan skenario ideal.
Misalnya, menonaktifkan pengguna tamu dapat merusak basis data msdb .
Menjalankan kembali pemilihan dalam konteks pengguna yang ada:
Msg 229, Level 14, Negara 5, Baris 7 Izin SELECT ditolak pada objek 'dm_os_enumerate_filesystem', basis data 'mssqlsystemresource', schema 'sys'.
Mungkin ada atau tidak ada jalan lain yang jauh dari pendekatan ideal ini, saya belum menemukannya.
Contoh izin peran publik:
Ini diberikan karena suatu alasan, karena fungsionalitas tertentu mungkin rusak ketika menolak / mencabut benda-benda ini. Lanjutkan dengan hati hati.
Beberapa informasi lebih lanjut tentang pengguna tamu / peran publik di sini
USE MASTER; DENY SELECT ON [sys].[dm_os_enumerate_fixed_drives] TO public; DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public; USE msdb; DENY SELECT ON msdb.dbo.backupset TO public;
Sejauh ini, saya belum mengalami masalah dengan ini, tapi saya belum melakukan pengujian intensif juga.Saya terus menemukan lebih banyak tabel yang membocorkan informasi tentang database lain, maka saya memutuskan untuk mengirim kumpulan hal-hal yang saya blokir ke peran publik. Mereka tampaknya tidak mempengaruhi fungsionalitas db, meskipun saya tidak bertanggung jawab karena saya hanya menggunakan sebagian kecil dari apa yang sebenarnya ditawarkan SQL Server. Bisa jadi ini merusak sesuatu yang saya tidak sadari.
sumber