consatan 发表于 2009-12-26 11:06:33

如何防止URL添加数据?

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页面里使用
<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

+-------+------------------------------------------------------------------------
| 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
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
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));
}
}
?>

yangball 发表于 2009-12-26 11:12:56

控制器构造函数里检查session??

Hex 发表于 2009-12-26 11:42:05

js 里 location.href = 'show'; 这个在 CI 里是不行的,必须用绝对 URL。

关于如何限制不允许 URL 访问,这个和纯 PHP 写的程序道理一样,以前如何限制在 CI 里也那样限制,比如可以限制 POST 提交才允许等等。

consatan 发表于 2009-12-27 01:40:55

js 里 location.href = 'show'; 这个在 CI 里是不行的,必须用绝对 URL。

关于如何限制不允许 URL 访问, ...
Hex 发表于 2009-12-26 11:42 http://codeigniter.org.cn/forums/images/common/back.gif
{:3_65:} 我刚学PHP...
能给个例子或是资料吗??
我google搜索到的资料
“不用curl,纯PHP实现POST提交”
“php 模拟POST提交的2种方法”
Hex说的是这种方法吗??

Hex 发表于 2009-12-27 09:54:03

那楼主还是应该好好学习一下 PHP,然后再来学习 CI,这样效果会比较好。

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

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

大概就是这个思路了。

我再次强调一下,CI 不是给初学者使用的框架,必须有 PHP 基础。

consatan 发表于 2009-12-27 17:06:01

那楼主还是应该好好学习一下 PHP,然后再来学习 CI,这样效果会比较好。

至于这个问题,我觉得没必要限制 ...
Hex 发表于 2009-12-27 09:54 http://codeigniter.org.cn/forums/images/common/back.gif
我是有JAVA的基础...
想说看一下基本语法应该就可以了...{:3_65:}

Hex 发表于 2009-12-27 17:50:59

我是有JAVA的基础...
想说看一下基本语法应该就可以了...
consatan 发表于 2009-12-27 17:06 http://codeigniter.org.cn/forums/images/common/back.gif


    JAVA 和 PHP 还有差别的吧~~如果有 ASP 基础还能沾点边,呵呵

lzyname 发表于 2010-1-11 02:06:48

然后删除的函数,我直接访问localhost/user/delete/43
也可以直接把数据给删除了...
=============================
汗。。。首先最好用post方法,其次谁有权限delete啊,不得check一下他的session或者cookies先啊。如果就是他自己,他愿意怎么delete就随他啊。

jeongee 发表于 2010-2-19 22:46:22

对呀,这应该是属于权限的问题呢,操作之前要判断操作人有没有操作这里的权限呀
PS:location.href=XX还是改成window.location=XX比较好:)

yinzhili 发表于 2010-2-22 16:38:48

这个还是必须在User控制器里判断一下权限才行,首先检查访问者是否有权限(通过Session或者Cookie都可以),如果有权限再执行数据库操作。
页: [1] 2
查看完整版本: 如何防止URL添加数据?