如何保护传递给CI中控制器的段

时间:2012-01-27 01:30:44

标签: security codeigniter controller

我正在尝试将段传递给控制器​​。 url类似于base_url / controller / function / seg1。我想确保如果用户尝试在地址栏中输入段,控制器将确保除了我想要传递的段之外没有其他单词要继续。

例如,如果用户尝试在地址栏中键入base_url / main / function /(将其更改为其他字),则控制器将过滤该段。我不知道该怎么做,如果有人可以帮助我,我会很感激。

2 个答案:

答案 0 :(得分:1)

你的结构是

base_url/controller/action

因此,您的控制器已经“过滤”了它,因为如果您在控制器中没有方法/功能(methods = actions),那么您的控制器将触发404 Page Not Found错误。然而,粗略的,您可以处理您认为合适的错误,但根据您提供的内容,您希望过滤的项目称为控制器操作。

所以,例如;

http://www.base_url.com/users/add

表示您希望在用户控制器中调用add(function)。

如果你想将add动作传递给参数,那么你可以这样做;

http://www.base_url.com/users/show/1

show是控制器动作,1是你想要显示的用户的id。 我知道似乎我正在给MVC方法论一个基本的介绍,但就像我说的那样,你展示的结构就像我描述的一样。

希望这有帮助。

答案 1 :(得分:1)

好的,所以“保护”这些事情的最佳方法是在用户登录您的网站时创建一个会话,并在该会话中存储两个值;

1)他们的数据库主键id,和 2)名为'logged_in'的会话项

当您的用户登录您的网站时,您会将这两个值存储起来;

$this->session->set_userdata('logged_in', true);
$this->session->set_userdata('user_id', $id);

在身份验证期间从其用户记录中提取$ id。

既然你有那些,那么下一部分就是,在你的控制器中,如果用户登录,你会在那里检查一个if语句,就这样;

function show($id) {
  if($this->session->userdata('logged_in')) {
    $posts = $this->Model_posts->get_user_posts($id);
  }
}

现在,在您的模型中,您将创建一个函数来拉取您希望用户能够根据其user_id查看的记录。我们将举例说明用户帖子。

function get_user_posts($user_id, $post_id) {
   $sql = "SELECT * FROM posts WHERE user_id = ? AND id = ?";
   $binds = array($user_id, $post_id);
   $qry = $this->db->query($sql, $binds);
   $result = array();

   while($row = $qry->result_array()) {
     array_push($result, $row);
   }
   return $result;
}

现在,当登录用户或访问者尝试访问不属于他们的记录时,他们将不会检索任何记录,因为select语句限制仅返回给该用户的记录。