Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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
Security 通过id签名的webapp安全性_Security - Fatal编程技术网

Security 通过id签名的webapp安全性

Security 通过id签名的webapp安全性,security,Security,假设我编写了一个web应用程序,该应用程序在其数据库中存储了大量信息,这些信息应该只能由具有权限的用户访问。例如,一篇文章可能只能由作者阅读。在本例中,假设post中的每个单词都被分配了一个id,并且还必须检查用户是否确实拥有使用该单词的权限。将ajax请求传输到服务器时,必须将所有ID发送到服务器以获取请求(关于为什么不重要的详细信息)。为了安全起见,我想验证用户是否有权使用每个单词来阻止攻击者伪造自己的ajax请求。我可以查询SQL数据库中的每个单词来检查授权,这可能涉及一个或多个连接。这将

假设我编写了一个web应用程序,该应用程序在其数据库中存储了大量信息,这些信息应该只能由具有权限的用户访问。例如,一篇文章可能只能由作者阅读。在本例中,假设post中的每个单词都被分配了一个id,并且还必须检查用户是否确实拥有使用该单词的权限。将ajax请求传输到服务器时,必须将所有ID发送到服务器以获取请求(关于为什么不重要的详细信息)。为了安全起见,我想验证用户是否有权使用每个单词来阻止攻击者伪造自己的ajax请求。我可以查询SQL数据库中的每个单词来检查授权,这可能涉及一个或多个连接。这将导致100次查询。我想避免质疑这么多。(在我的具体实现中,我没有使用POST和WORD,但在某些请求中我需要处理大约100个数据库ID。)

我提出了一个可能的解决方案,希望得到一些反馈。它不是将整数作为id传输到web应用程序,而是将id编码到有符号的id占位符中。签名的工作原理是为每个会话分配一个密钥,该密钥存储在会话表中,不会发送给客户端。为了对id进行编码,id、id类型(“用户id”等)和密钥被附加在一起,并通过哈希算法传输。此结果哈希的固定长度部分附加到未编码的id,然后发送到客户端。为了减少其长度,它还使用0-9、A-Z、A-Z或base-62编码。结果是,实际的id是明文(尽管被不同的基址稍微掩盖了),并附加了一个签名。这样,更改id将使签名无效,服务器将不接受该请求。在我当前的实现中,我使用56位的签名长度来表示大约7.2x10^16个可能的签名

你对这个计划有什么反应?过度杀戮?有缺陷的是否有一个公认的、更好的解决方案

以下是php中签名函数的代码片段(请原谅使用幻数,这是一个测试实现):

公共函数signDbId($id,$kind)
{
$id_seg=base62($id);
$hash=md5($id\u seg.$kind.$this->session\u key);
$signed='';
对于($i=0;$i<2;++$i)
{
$signed.=base62(intval(substr($hash,$i*8,7),16),5);
//填充到5个字符
}
返回$signed.$id_seg;
}

您所描述的是CSRF令牌(跨站点请求伪造),这是一种常见做法,但我认为您使其变得比需要的更复杂

CSRF令牌可以随机生成并存储在数据库中

编辑


在重新阅读您的问题后,我意识到典型的CSRF令牌无法解决需要执行许多查询的问题,但我认为需要执行数百个查询是糟糕的应用程序设计的症状

您所描述的是CSRF令牌(跨站点请求伪造),这是一种常见的做法,但我认为您使其变得比需要的更为复杂

CSRF令牌可以随机生成并存储在数据库中

编辑


在重新阅读您的问题后,我意识到典型的CSRF令牌无法解决需要执行许多查询的问题,但我认为需要执行数百个查询是糟糕的应用程序设计的症状

这就是我想要的请求:将x标签应用于这124封电子邮件。我想验证每封电子邮件的ID,以确保用户确实拥有它们。我并没有明确地试图阻止CSRF,而是试图阻止用户A在未经许可的情况下编辑(或访问)用户B的数据。@Jonathan Swinney,一旦您对用户进行了身份验证,为什么需要多个查询,
从user\u id=X的位置选择电子邮件有什么问题?
?我需要这样写一个查询:插入电子邮件标签(email\u id,label\u id)值(…这是我想要的请求类型:将x标签应用于这124封电子邮件。我想要验证每封电子邮件的ID,以确保用户实际拥有它们。我没有明确尝试阻止CSRF,而是尝试阻止用户A编辑(或访问)用户B的数据未经许可。@Jonathan Swinney,一旦您对用户进行了身份验证,为什么需要进行多个查询,
从user\u id=X的位置选择电子邮件有什么问题?
?我需要这样写一个查询:插入电子邮件标签(email\u id,label\u id)值(…我不明白为什么授权问题和数百个查询问题必然相关。对于给定的请求,我希望首先授权用户的身份(使用CSRF令牌),然后检查该用户是否有权限执行其请求执行的操作(使用某种内部权限模块)。用户已登录。我使用安全会话cookie进行检查。没问题。用户希望修改100个项目的属性。我希望确保他没有在伪造的请求中猜测邻居项目的id。我可以对每个项目使用查询或对id签名,以使猜测邻居id变得非常困难。这是我的思考过程ess。我不明白为什么授权问题和数百个查询问题必然相关。对于给定的请求,我希望首先授权用户的身份(使用CSRF令牌),然后检查该用户是否有权限执行她请求执行的操作(使用某种内部权限模块)。用户已登录。我使用安全会话cookie进行检查。没问题。用户希望修改100个项目的属性。我希望确保他不会在伪造的请求中猜测邻居项目的ID。我可以对每个项目使用查询或对ID进行签名,以使其真正符合要求
public function signDbId( $id, $kind )
{
  $id_seg = base62( $id );
  $hash = md5( $id_seg . $kind . $this->session_key );
  $signed = '';
  for ( $i = 0; $i < 2; ++$i )
  {
    $signed .= base62( intval( substr( $hash, $i*8, 7 ), 16 ), 5 );
    // pad to 5 chars
  }
  return $signed . $id_seg;
}