Почему вызывает процедуру, которая имеет & ldquo; WITH EXECUTE AS & rdquo; разрешить больше разрешений, чем вызывающий пользователь или исполняемый как пользователь? [Дубликат]

Я предполагаю, что у вас есть проблемы с захватом ответа. discord.py перегружает синтаксис function(args, *, kwargs) для команд, так что один аргумент после * является текстом остальной части сообщения.

from discord.ext.commands import Bot

bot = Bot('#')

my_user_id = ""  
# You can get your id through the discord client, after activating developer mode.

@bot.command(pass_context=True)
async def survey(ctx):
    await bot.send_message(ctx.message.author, "What's your name?")

@bot.command(pass_context=True)
async def respond(ctx, *, response):
    owner = await bot.get_user_info(my_user_id)
    await bot.send_message(owner, "{} responded: {}".format(ctx.message.author.name, response))

bot.run("token")

3
задан Louie Bao 10 May 2016 в 04:15
поделиться

2 ответа

Это вопрос о цепях владения.

См. «Книги в Интернете»> Цепочки прав собственности: https://technet.microsoft.com/en-us/library/ms188676 (v = sql.105 ) .aspx

Сначала мы можем продемонстрировать, как работают цепочки прав без EXECUTE AS внутри хранимой процедуры, тогда мы можем увидеть, как это работает с EXECUTE AS.

Создайте две таблицы и вставьте данные.

CREATE TABLE dbo.T1 (id int IDENTITY(1,1));
CREATE TABLE dbo.T2 (id int IDENTITY(1,1));

INSERT INTO dbo.T1 DEFAULT VALUES;
INSERT INTO dbo.T2 DEFAULT VALUES;

Создайте двух пользователей.

CREATE USER U1 WITHOUT LOGIN;
CREATE USER U2 WITHOUT LOGIN;

Измените право собственности на таблицу T2 на пользователя U2.

ALTER AUTHORIZATION ON OBJECT::dbo.T2 TO U2;

Убедитесь, что мы изменили право собственности.

SELECT name, principal_id
    FROM sys.tables
    WHERE name IN (N'T1', N'T2');

Демонстрировать, что пользователь U1 не имеет разрешения SELECT в таблице T1 или T2 .

EXECUTE AS USER = 'U1';
SELECT * FROM dbo.T1;
SELECT * FROM dbo.T2;
REVERT

Создайте две хранимые процедуры и разрешите пользователю U1 выполнять оба.

CREATE PROCEDURE dbo.P1
AS 
    SELECT * FROM dbo.T1;
GO  
CREATE PROCEDURE dbo.P2
AS 
    SELECT * FROM dbo.T2;
GO

GRANT EXECUTE ON dbo.P1 to U1;
GRANT EXECUTE ON dbo.P2 to U1;

Выполнить P1 как пользователь U1. Это работает, потому что существует цепочка неразрывной связи. P1 и T1 имеют одного и того же владельца (который является владельцем схемы dbo). В этом случае проверка разрешений внутри хранимой процедуры пропускается.

EXECUTE AS USER = 'U1';
EXEC dbo.P1;
REVERT

Выполнить процедуру P2 как пользователь U1. Это терпит неудачу, так как цепочка прав собственности нарушена, и поэтому проверяются разрешения внутри хранимой процедуры. P2 и T2 имеют разных владельцев.

EXECUTE AS USER = 'U1';
EXEC dbo.P2;
REVERT

Затем продемонстрируйте, как хранятся хранимые процедуры, когда они содержат EXECUTE AS.

Создайте еще две хранимые процедуры.

CREATE PROCEDURE dbo.P1A
AS 
    EXECUTE AS USER = 'U1';
    SELECT * FROM dbo.T1;
    REVERT
GO  
CREATE PROCEDURE dbo.P2A
AS 
    EXECUTE AS USER = 'U1';
    SELECT * FROM dbo.T2;
    REVERT
GO

Выполните P1A, и это работает. Непрерывная цепочка выполнения, поэтому разрешения внутри хранимой процедуры не проверяются.

EXEC dbo.P1A;

Выполнить P2A, и это не удается. Неверная цепочка выполнения, поэтому проверяются разрешения внутри хранимой процедуры.

EXEC dbo.P2A;

Обратите внимание, что существует инструкция EXECUTE AS, которую мы используем в этих примерах. Существует также предложение EXECUTE AS, которое используется с хранимыми процедурами, функциями и триггерами.

Электронная документация> EXECUTE AS (Transact-SQL): https://msdn.microsoft.com /en-us/library/ms181362.aspx

Книги в Интернете> EXECUTE AS Clause (Transact-SQL): https://msdn.microsoft.com/en-GB/ библиотека / ms188354.aspx

2
ответ дан RichardCL 28 August 2018 в 06:08
поделиться

Это нормальное поведение из-за «сцепления с собственностью»

. Внутри процедур разрешения не проверяются, если ссылки, на которые ссылаются, имеют одинаковую АВТОРИЗАЦИЮ в качестве хранимой процедуры. В этом случае они оба находятся в схеме «dbo», поэтому разрешения не проверяются. Это включает разрешения DENY

create proc dbo.newproc2
with EXECUTE AS CALLER
as
select * from dbo.newtable
GO

GRANT EXEC ON dbo.newproc2 TO newuser
EXEC as user = 'newuser'
exec dbo.newproc2
REVERT


GO

DENY SELECT ON dbo.newtable TO newuser
exec dbo.newproc
GO
EXEC as user = 'newuser'
exec dbo.newproc2
REVERT
GO
1
ответ дан gbn 28 August 2018 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: