Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 最佳实践:如何在服务器上验证/授权AJAX调用_Javascript_Php_Ajax_Authorization_Jcryption - Fatal编程技术网

Javascript 最佳实践:如何在服务器上验证/授权AJAX调用

Javascript 最佳实践:如何在服务器上验证/授权AJAX调用,javascript,php,ajax,authorization,jcryption,Javascript,Php,Ajax,Authorization,Jcryption,前几天我在想这是怎么做的?如何验证/授权用户通过AJAX请求数据 目前我正在使用会话进行身份验证,但这只是一个次要的保护 假设我有一个名为addUserToGroup$user\u id,$group\u id的函数,它被称为via EXAMPLE: www.mysite.com/addUserToGroup/1/2 ( user_id = 1 , group_id = 2 ) 如何检查此用户是否真的被允许加入组\u id=2?每个人都可以将数据发布到我的服务器 我发现的一个解决方案是使用j

前几天我在想这是怎么做的?如何验证/授权用户通过AJAX请求数据

目前我正在使用会话进行身份验证,但这只是一个次要的保护

假设我有一个名为addUserToGroup$user\u id,$group\u id的函数,它被称为via

EXAMPLE: www.mysite.com/addUserToGroup/1/2  ( user_id = 1 , group_id = 2 )
如何检查此用户是否真的被允许加入组\u id=2?每个人都可以将数据发布到我的服务器

我发现的一个解决方案是使用jcryption公钥/私钥方法。但我认为,必须有一种更简单的方法来检查用户\u id=1是否被允许加入组\u id=2

提前谢谢

如何验证/授权用户通过AJAX请求数据

与对任何其他HTTP请求进行身份验证/身份验证的方式相同

或者现在我正在使用会话进行身份验证

会话是跟踪用户是否登录以及他们作为谁登录的明智方式

如何检查此用户是否真的被允许加入组\u id=2

会话数据告诉您用户是谁

最重要的是,您实现您的业务逻辑,以确定是否允许他们加入第2组。我们无法告诉您这是什么,因为我们不知道业务逻辑是什么

例如,如果仅允许区域2国家/地区的用户加入组2,则您的逻辑可能类似于:

IF session exists
AND user is logged in
AND user's country is in region 2
THEN authorized
确定用户所在的国家/地区是否在区域2中可以使用类似SQL的

SELECT user_id FROM members, countries WHERE user=:username AND members.country=countries.id AND countries.region=:region
如何验证/授权用户通过AJAX请求数据

与对任何其他HTTP请求进行身份验证/身份验证的方式相同

或者现在我正在使用会话进行身份验证

会话是跟踪用户是否登录以及他们作为谁登录的明智方式

如何检查此用户是否真的被允许加入组\u id=2

会话数据告诉您用户是谁

最重要的是,您实现您的业务逻辑,以确定是否允许他们加入第2组。我们无法告诉您这是什么,因为我们不知道业务逻辑是什么

例如,如果仅允许区域2国家/地区的用户加入组2,则您的逻辑可能类似于:

IF session exists
AND user is logged in
AND user's country is in region 2
THEN authorized
确定用户所在的国家/地区是否在区域2中可以使用类似SQL的

SELECT user_id FROM members, countries WHERE user=:username AND members.country=countries.id AND countries.region=:region

向表用户添加一个额外字段:允许加入吗

当用户登录时,设置

$_SESSION['is_allowed_to_join_2'] = $user['is_allowed_to_join_2'] == 1 ? true : false;
在ajax调用中,在php代码中:

if( $_SESSION['is_allowed_to_join_2'] !== true )
{
  exit("Not allowed");
}

向表用户添加一个额外字段:允许加入吗

当用户登录时,设置

$_SESSION['is_allowed_to_join_2'] = $user['is_allowed_to_join_2'] == 1 ? true : false;
在ajax调用中,在php代码中:

if( $_SESSION['is_allowed_to_join_2'] !== true )
{
  exit("Not allowed");
}

我相信你的问题是关于授权,而不是认证。如果我是对的,那么您可能已经知道用户是谁了,可能是在使用cookie之类的东西进行身份验证

现在,你必须想出一种方法来确定他们可以做什么

授权逻辑实际上是一个关键的设计决策。因此,它非常重要,并且在很大程度上取决于数据模型的形状和应用程序的体系结构

如果您可以通过对数据应用规则来一致地确定是否允许这样做,例如在上面昆廷的回答中,居住在区域2足以让用户加入组2,那么将此逻辑放入实体模型通常是最简单的。在这种情况下,我会在用户上创建一个方法来检查他们是否可以加入组

function canJoinGroup($group) {
    //if(all is well), then:
    return true
} 
或者创建一个方法来连接它们,如果不允许,则会引发错误:

function joinGroup($group) {
    //if(all is well), then:
    return true;
    //otherwise:
    throw new Exception("User ". $this->id ." cannot join group " . $group->id);
} 
您还可以向组中添加一个函数,该函数将委托给此新用户函数:

function addUser($user) {
    $user->joinGroup($this);
}
OTOH,如果关于谁可以做什么的决定是基于更细粒度的权限,或者基于管理员或用户在运行时需要更改的信息,那么您必须得到更多的支持。一种常用、通用且灵活的方法称为aka-RBAC

这可能会变得非常复杂,但应用到您的案例中的核心概念是,您拥有一个用户、一个实体、一个组和一个操作连接。您需要确定是否允许用户1以组2为参数执行名为“join”的操作

为了做到这一点,你必须在某处保留一套规则,然后做两件事:

在向系统中添加新用户和组或管理员更改其权限时,使这些表保持最新 在每个请求中检查这些表,查看用户是否可以对实体执行操作检查用户是否可以加入组
我不会深入讨论这个用例的低级细节。只要说一句,如果您今天要完成的工作最终需要发展成一个相当复杂的权限系统,那么您最好研究一下RBAC。

我相信您的问题是关于授权,而不是身份验证。如果我是对的,那么假设 您可能已经知道谁是身份验证用户,可能是使用cookie或其他东西

现在,你必须想出一种方法来确定他们可以做什么

授权逻辑实际上是一个关键的设计决策。因此,它非常重要,并且在很大程度上取决于数据模型的形状和应用程序的体系结构

如果您可以通过对数据应用规则来一致地确定是否允许这样做,例如在上面昆廷的回答中,居住在区域2足以让用户加入组2,那么将此逻辑放入实体模型通常是最简单的。在这种情况下,我会在用户上创建一个方法来检查他们是否可以加入组

function canJoinGroup($group) {
    //if(all is well), then:
    return true
} 
或者创建一个方法来连接它们,如果不允许,则会引发错误:

function joinGroup($group) {
    //if(all is well), then:
    return true;
    //otherwise:
    throw new Exception("User ". $this->id ." cannot join group " . $group->id);
} 
您还可以向组中添加一个函数,该函数将委托给此新用户函数:

function addUser($user) {
    $user->joinGroup($this);
}
OTOH,如果关于谁可以做什么的决定是基于更细粒度的权限,或者基于管理员或用户在运行时需要更改的信息,那么您必须得到更多的支持。一种常用、通用且灵活的方法称为aka-RBAC

这可能会变得非常复杂,但应用到您的案例中的核心概念是,您拥有一个用户、一个实体、一个组和一个操作连接。您需要确定是否允许用户1以组2为参数执行名为“join”的操作

为了做到这一点,你必须在某处保留一套规则,然后做两件事:

在向系统中添加新用户和组或管理员更改其权限时,使这些表保持最新 在每个请求中检查这些表,查看用户是否可以对实体执行操作检查用户是否可以加入组

我不会深入讨论这个用例的低级细节。只需说一句,如果您今天要完成的工作最终需要发展成一个相当复杂的权限系统,那么您最好学习RBAC。

您通常通过HTTPS连接使用cookies这是一个与设计相关的一般问题,并不特别与ajax或javascript绑定。您可以通过查找ACL来了解您通常通过HTTPS连接使用Cookie这是一个与设计相关的一般问题,并不特别与ajax或javascript绑定。您可以通过查找ACL来了解情况。这将完全起作用,并为特定实体和操作提供穷人的RBAC。但是,应该提醒您,如果沿着这条路走下去,很快就会吃到一顿PHP意大利面晚餐。返回变量可能是JSON格式的,因为JS逻辑可能也想得到一个真/假-但是,否则,+1.OK,我明白了。这意味着我必须对他可能采取的每一项操作设置权限,并将其写入我的会话用户_数据。但那真的太多了。但这真的是最佳实践吗这只是一个例子,而不是问题的完整解决方案,只是为了说明如何做到这一点。由于没有提供代码,这将是解决此难题的最简单方法。从这里,您可以构建一个包含所有角色的好类,为用户角色添加一个表,并将角色分配给用户。这将完全起作用,并为特定实体和操作提供穷人的RBAC。但是,应该提醒您,如果沿着这条路走下去,很快就会吃到一顿PHP意大利面晚餐。返回变量可能是JSON格式的,因为JS逻辑可能也想得到一个真/假-但是,否则,+1.OK,我明白了。这意味着我必须对他可能采取的每一项操作设置权限,并将其写入我的会话用户_数据。但那真的太多了。但这真的是最佳实践吗这只是一个例子,而不是问题的完整解决方案,只是为了说明如何做到这一点。由于没有提供代码,这将是解决此难题的最简单方法。从这里,您可以构建一个包含所有角色的好类,为用户角色添加一个表,并将角色分配给您的用户。谢谢,但如果给定的参数为真,我看不出有可能签入我的业务逻辑。@zer02-您不在乎它们是否为真,您可能在乎,但也就是说,您在乎它们是否被允许。如果你没有关于什么是允许的规则,那么要么什么都不允许删除脚本,一切都允许忘记安全性,你不需要它,要么你需要决定规则是什么。是的,在发布这个问题之前,我在谷歌上读了一些关于CRSF的结果。大多数人都在谈论代币,我发现了jcryption。有人试过吗@zer02-完全没有意义。如果您关心保护传输中的数据,请使用SSL,您应该这样做。这在很大程度上与CSRF和authz无关,尽管我不熟悉广泛使用SSL对服务器性能的影响。付款
我会使用SSL。权衡安全性和性能?谢谢,但是如果给定的参数为真,我认为没有可能检查我的businesslogic。@zer02-你不关心它们是否为真,你可能会关心,但也就是说,你关心它们是否被允许。如果你没有关于什么是允许的规则,那么要么什么都不允许删除脚本,一切都允许忘记安全性,你不需要它,要么你需要决定规则是什么。是的,在发布这个问题之前,我在谷歌上读了一些关于CRSF的结果。大多数人都在谈论代币,我发现了jcryption。有人试过吗@zer02-完全没有意义。如果您关心保护传输中的数据,请使用SSL,您应该这样做。这在很大程度上与CSRF和authz无关,尽管我不熟悉广泛使用SSL对服务器性能的影响。对于付款等,我会使用SSL。在安全性和性能之间进行权衡?非常感谢。是的,我必须考虑数据库设计和规则。这真是太多了!:不客气!对不起,如果我吓到你了。。。但是,最好先弄清楚事情会变得多么复杂,而不是在面临截止日期压力时被迫重构一个半生不熟的解决方案。非常感谢。是的,我必须考虑数据库设计和规则。这真是太多了!:不客气!对不起,如果我吓到你了。。。但最好先了解事情会变得多么复杂,而不是在最后期限压力下被迫重构一个半生不熟的解决方案。