用户
 找回密码
 入住 CI 中国社区
搜索
查看: 8053|回复: 13
收起左侧

[URL] 如何防止URL添加数据?

  [复制链接]
发表于 2009-12-26 11:06:33 | 显示全部楼层 |阅读模式
addView页面中提交数据后,调用add函数,然后添加到数据库,但现在我直接在URL中输入
localhost/user/add
这样也可以直接添加一条数据...
mysql> select * from users;
+----+----------+------+------+
| id | name     | age  | sex  |
+----+----------+------+------+
| 41 | fhfdhdfg | 345  | 1    |
+----+----------+------+------+
直接访问localhost/user/add后
mysql> select * from users;
+----+----------+------+------+
| id | name     | age  | sex  |
+----+----------+------+------+
| 41 | fhfdhdfg | 345  | 1    |
| 43 | 0        | 0    | 0    |
+----+----------+------+------+
也已经配置了
$config['global_xss_filtering'] = TRUE;
然后删除的函数,我直接访问localhost/user/delete/43
也可以直接把数据给删除了...
有什么办法可以防止上面这2种情况吗??
还有...我add_success页面里使用
JS复制代码
<script type=text/javascript>
   var t=3;
   function later_back() {
    backL.innerHTML=t;
    t--;
    if (t==0)
     location.href = 'show';
     setTimeout("later_back();",1000);
    }
   later_back();
  </script>
复制代码

可以成功的将页面导向到localhost/user/show
可是在del_success页面中
同样的代码却不行
add_success页面的URL是localhost/user/add_success
而del_success页面的URL是localhost/user/delete/id
如果我直接使用上面的JS,则它3秒后跳转到
localhost/user/delete/show(这页面肯定是没有的...)
让我不得不在localhost.href中直接写localhost/user/show

SQL复制代码
+-------+------------------------------------------------------------------------
| TABLE | CREATE TABLE
+-------+------------------------------------------------------------------------
| users | CREATE TABLE `users` (
  `id` INT(8) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(30) CHARACTER SET utf8 DEFAULT NULL,
  `age` VARCHAR(3) CHARACTER SET utf8 DEFAULT NULL,
  `sex` VARCHAR(2) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci |
+-------+------------------------------------------------------------------------
复制代码
PHP复制代码
 
<?php
 class User extends Controller {
  function User() {
   parent::Controller();
  }
 
  function index() {
   $data = array('title'  => 'User System',
          'message' => 'Welcome to User System!'
          );
   $this->load->view('index',$data);
  }
 
  function addView() {
   $data = array('title'  => '添加用户',
          'message' => '添加新用户到当前系统。'
          );
   $this->load->view('user_view_add',$data);
  }
 
  function add() {
   $this->load->model('User_Model','User');
   $this->User->addUser();
   redirect('user/add_success','refresh');
  }
 
  function add_success() {
   $data = array('title' => '添加用户成功',
          'message' => '添加用户成功!'
          );
   $this->load->view('add_success',$data);
  }
 
  function show() {
   $this->load->model('User_Model','User');
   $result = $this->User->showUser();
   $data = array('title' => '用户列表',
          'message' => '以下是当前所有用户:',
          'values' => $result
          );
   $this->load->view('user_view_show',$data);
  }
 
  function delete($id) {
   $this->load->model('User_Model','User');
   $this->User->delUser($id);
   $data = array('title' => '删除用户成功',
          'message' => '删除用户成功!'
          );
   $this->load->view('del_success',$data);
  }
 }
?>
复制代码
PHP复制代码
 
<?php
 class User_Model extends Model {
  function User_Model() {
   parent::Model();
  }
 
  function addUser() {
   $data = array('name' => $this->input->post('name'),
          'age' => $this->input->post('age'),
          'sex' => $this->input->post('sex'),
   );
   
   $this->db->insert('users',$data);
  }
 
  function showUser() {
   $query = $this->db->get('users');
   return $query->result();
  }
 
  function delUser($id) {
   $query = $this->db->delete('users',array('id' => $id));
  }
 }
?>
 
复制代码
发表于 2009-12-26 11:12:56 | 显示全部楼层
控制器构造函数里检查session??
发表于 2009-12-26 11:42:05 | 显示全部楼层
js 里 location.href = 'show'; 这个在 CI 里是不行的,必须用绝对 URL。

关于如何限制不允许 URL 访问,这个和纯 PHP 写的程序道理一样,以前如何限制在 CI 里也那样限制,比如可以限制 POST 提交才允许等等。
 楼主| 发表于 2009-12-27 01:40:55 | 显示全部楼层
js 里 location.href = 'show'; 这个在 CI 里是不行的,必须用绝对 URL。

关于如何限制不允许 URL 访问, ...
Hex 发表于 2009-12-26 11:42

我刚学PHP...
能给个例子或是资料吗??
我google搜索到的资料
“不用curl,纯PHP实现POST提交”
“php 模拟POST提交的2种方法”
Hex说的是这种方法吗??
发表于 2009-12-27 09:54:03 | 显示全部楼层
那楼主还是应该好好学习一下 PHP,然后再来学习 CI,这样效果会比较好。

至于这个问题,我觉得没必要限制,只要用户有权限就可以让他执行。
这里重要的是权限,比如是不是登陆用户,登陆的用户是不是管理员等等。

如果你非要限制,你可以限制 POST 或 Session
限制 POST 可以在 PHP 里检查 $_SERVER 变量(具体 $_SERVER 都有什么看 PHP 手册)
限制 Session 可以在执行这个操作之前设置一个 session,执行这个操作时候,检查这个 Session

大概就是这个思路了。

我再次强调一下,CI 不是给初学者使用的框架,必须有 PHP 基础。
 楼主| 发表于 2009-12-27 17:06:01 | 显示全部楼层
那楼主还是应该好好学习一下 PHP,然后再来学习 CI,这样效果会比较好。

至于这个问题,我觉得没必要限制 ...
Hex 发表于 2009-12-27 09:54

我是有JAVA的基础...
想说看一下基本语法应该就可以了...
发表于 2009-12-27 17:50:59 | 显示全部楼层
我是有JAVA的基础...
想说看一下基本语法应该就可以了...
consatan 发表于 2009-12-27 17:06



    JAVA 和 PHP 还有差别的吧~~如果有 ASP 基础还能沾点边,呵呵
发表于 2010-1-11 02:06:48 | 显示全部楼层
然后删除的函数,我直接访问localhost/user/delete/43
也可以直接把数据给删除了...
=============================
汗。。。首先最好用post方法,其次谁有权限delete啊,不得check一下他的session或者cookies先啊。如果就是他自己,他愿意怎么delete就随他啊。
发表于 2010-2-19 22:46:22 | 显示全部楼层
对呀,这应该是属于权限的问题呢,操作之前要判断操作人有没有操作这里的权限呀
PS:location.href=XX还是改成window.location=XX比较好:)
发表于 2010-2-22 16:38:48 | 显示全部楼层
这个还是必须在User控制器里判断一下权限才行,首先检查访问者是否有权限(通过Session或者Cookie都可以),如果有权限再执行数据库操作。

本版积分规则