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 表示...