阻止用户更改URL中的ID以查看其他记录

时间:2014-07-02 07:30:01

标签: asp.net-mvc security

您可能已经看过有关HotelHippo泄露数据的新闻报道。基本上一旦登录,您可以更改URL中的五位数ID号,并查看系统上的其他预订。 对我来说,我在MVC中编码网站,所以我习惯了URL的{controller} / {action} / {id}外观。 bbc news - Scott Helme

我的问题是:使用MVC,如何防止更改显示其他用户数据的URL?是否有“接受”的方式/最佳做法?

我能想到一对夫妇:

  • 构建一个安全模块,在访问权限时检查数据库中的记录
  • 更改路由,以便用户永远不会在网址中看到ID(虽然当您点击链接并将其传递给操作时仍会使用ID ...如何?)
  • 只是不使用顺序ID(但这不是通过默默无闻的安全性而不是完全依赖?)

2 个答案:

答案 0 :(得分:0)

您可以将Guid而不是整数作为实体的ID

答案 1 :(得分:0)

有点晚了,但这里是我的答案= D

你可以使用一个令牌(至少我是怎么做的^^):

<强> Token.php

class Token {

    //generate the token name
    public static function generate(){

        return Session::put(Config::get('session/token_name'), md5(uniqid()));

    }//end generate()

    //chek token is correct
    public static function check($token){

        $tokenName = Config::get('session/token_name');

        //check if session exists and if token supplied is equal to the one given to the user
        if(Session::exists($tokenName) && $token === Session::get($tokenName)){

            Session::delete($tokenName);
            return true;

        }//end if exists

        return false;

    }//end check()

}//end class Token

<强> Input.php

//with this class, we catch the input of the user

class Input {

//check if data exists in post or get
public  static function exists($type = 'post'){

    switch($type){

        case 'post':
                return(!empty($_POST)) ? true : false;
            break;

        case 'get':
                return(!empty($_GET)) ? true : false;
            break;

        default:
                return false;
            break;

    }//end switch $type

}//end exists

//get selected $item
public static function  get($item){

    if(isset($_POST[$item])){

        return $_POST[$item];

    }else if (isset($_GET[$item])){

        return $_GET[$item];

    }//end if else

    return '';

}//end get

}//end class

<强> HTML

在您的HTML网站上,该网站将重定向到ID为

的下一页

使用输入文件

创建表单
<!-- Form comes here -->

<!--add a token to the form(security, so you cant edit the url)-->
<input type="hidden" name="token" value="<?php ECHO Token::generate(); ?>">

检查表格提交时的令牌

if(Token::check(Input::get('token'))) {
//do your redirect and other stuff here
}

通过这种方式,您应该能够让用户无法更改URL。然后,您可以重定向到frobidden站点,如果符号存在&#34;如果令牌存在&#34;检查。

我希望它可以帮助你^^