資料庫跨庫訪問問題

2022-03-26 23:34:28 字數 2401 閱讀 9303

sql server中的所有權鏈及其問題

沒有多少朋友對所有權鏈真的理解的。我自己有時候經常回過來看看這些資料,覺得還是很有意思的。下面的內容摘自微軟文件,介紹得比較好

簡而言之

1. 如果在同乙個資料庫中,只要兩個物件的所有者是一樣的,

那麼他們之間的訪問是不檢查訪問者身份的。

例如乙個檢視和乙個表是屬於同乙個所有者,

那麼只要使用者有訪問檢視的許可權,就等於擁有了訪問表的許可權,即便在表上面明確拒絕了使用者的許可權。

你可能會奇怪了,我們不是經常講「拒絕優先」嗎?沒錯,拒絕優先是對的,但事情的關鍵主要在於這個時候,

sql server根本就不檢查許可權了,當然就不存在任何問題。

這個特性可能在規劃安全時很有用

2. 如果在不同資料庫中,也可以實現與上面同樣的所有權鏈結,此時我們稱為「跨資料庫所有權鏈」。因為有安全隱患,所以預設該選項是被禁用的

--以管理員登入

use master

go ---建立兩個資料庫

create database db1

go create database db2

go --在第乙個資料庫中新增乙個表,並新增一點資料

use db1

go create table table1(id int)

go insert into table1 values(1);

insert into table1 values(1);

insert into table1 values(1);

insert into table1 values(1);

--在第二個資料庫中新增乙個檢視,讓他去訪問第乙個資料庫中的表

use db2

go create view db1table1view

asselect * from db1.dbo.table1

--因為當前使用者是管理員,它會屬於sysadmin角色,所以可以訪問到。即便沒有開啟跨資料庫所有權鏈

select * from db1table1view

--建立乙個login1

create login [login1] with mailto:password=n%27pass@word%27

--將該登入對映到db2,成為乙個使用者

create user [login1] for login [login1];

go --使用該使用者的身份去訪問那個檢視

execute as user = 'login1'

select current_user --此時會切換到login1這個使用者

select * from db1table1view --此時會失敗,因為該使用者不具備對檢視的訪問許可權

--授予使用者對檢視的select 許可權

revert --回到之前的身份,因為要做授權

select current_user --此時的身份會切換回到chenxizhang所代表的使用者,也就是dbo

grant select on [dbo].[db1table1view] to [login1]

--再次切換為login1身份

execute as user ='login1';

select current_user

select * from db1table1view

--此時出現下面這樣的錯誤,說明當前使用者確實試圖去訪問db1的table1,但因為不能進行上下文鏈結,所以還是失敗了

/*訊息 916,級別 14,狀態 1,第 3 行

伺服器主體 "login1" 無法在當前安全上下文下訪問資料庫 "db1"。

--切換回chenxizhang身份,啟用db1資料庫的所有權鏈結

revert

select current_user

alter database db1 set db_chaining on

alter database db2 set db_chaining on

--再次切換為login1身份

execute as user ='login1';

select current_user

select * from db1table1view

/*此時仍然出現乙個錯誤。和上面是一樣的。既然實現了所有權鏈結,為什麼還是不行呢?

原因是因為在db1中也要存在該使用者,即他至少要能訪問資料庫

*/ revert

use db1

go create user login1 for login [login1]

go use db2

go--再次切換為login1身份

execute as user ='login1';

select current_user

select * from db1table1view

資料庫 mysql 跨庫訪問 資料庫跨庫訪問問題

sql server中的所有權鏈及其問題 沒有多少朋友對所有權鏈真的理解的。我自己有時候經常回過來看看這些資料,覺得還是很有意思的。下面的內容摘自微軟文件,介紹得比較好 簡而言之 1.如果在同乙個資料庫中,只要兩個物件的所有者是一樣的,那麼他們之間的訪問是不檢查訪問者身份的。例如乙個檢視和乙個表是屬...

跨域訪問問題

瀏覽器跨域 跨域問題 於瀏覽器的同源策略,瀏覽器為了提高 的安全性,在傳送ajax請求時,只有在當前頁面位址與請求位址的協議 網域名稱 埠號相同時才允許訪問,否則會被攔截。協議即通訊協議,比如我們現在常見的http和https,如果當前頁面位址使用http協議,請求的位址使用https協議,那麼這個...

angularjs 跨域訪問問題

最近使用angular js 訪問restful 後台時需要考慮cors跨域訪問的問題,angular js 的http訪問本身也是ajax,在跨域訪問時需要做響應的設定 1.伺服器端設定 當跨域訪問時,伺服器端需要設定響應的header,access control allow origin 表示...