代码之家  ›  专栏  ›  技术社区  ›  Jonathan Swinney

通过id签名实现webapp安全

  •  2
  • Jonathan Swinney  · 技术社区  · 15 年前

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

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

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

    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;
    }
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   mikerobi    15 年前

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

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

    编辑