Только принятие определенного ajax запрашивает от аутентифицируемых пользователей

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

См. «Книги в Интернете»> Цепочки прав собственности: 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

8
задан Shog9 23 January 2013 в 07:35
поделиться

2 ответа

Вы были корректны в попытке использовать переменные сеанса. После того как Ваш пользователь проходит проверку подлинности, необходимо хранить ту информацию на их сессии так, чтобы каждый последующий просмотр страницы видел это. Удостоверьтесь, что Вы звоните session_start() на обеих страницах (blog.php и delete.php) прежде, чем получить доступ к $ _SESSION. Также удостоверьтесь, что Вам включили cookie - и в противном случае необходимо передать дополнительный параметр в строке запроса, обычно PHPSESSID = <session_id()>.

7
ответ дан 5 December 2019 в 19:04
поделиться

Не рекомендуется полагаться на сессии для аутентификации, не принимая дополнительные меры. Читайте больше на.

2
ответ дан 5 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

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