Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

[求助] discuz论坛插件 CSRF请教

[复制链接]
baidudiscuz 发表于 2014-2-8 15:44:11 | 显示全部楼层 |阅读模式
delete.php的代码是
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}

if($_G['groupid']!=1){
showmessage(“没有权限”,'');
}

if(isset($_GET['formhash']) && $_GET['formhash'] == formhash()){
$id = intval($_GET['id']);
DB::delete('数据表1',array('id'=> $id));
showmessage(“删除成功”,'', array(), array('alert' => right));
}else{
showmessage(“操作失败”);
}
?>


模板htm页面代码是
<a href="plugin.php?id=插件名&action=delete&id=当前id&formhash={FORMHASH}">
删除</a>


请高手指点下本新手,在什么地方需要改进,防止CSRF,真心感谢.

有朋友说不要直接用$_GET['xx']获取变量,应该用 $_G['gp_xx']获取变量。但 $_G[gp_参数名]     不是弃用了么?看很多开发者都是用GET 菜鸟学习,搜索了很久,求指点
回复

使用道具 举报

 楼主| baidudiscuz 发表于 2014-2-8 19:34:23 | 显示全部楼层
一个下午没人理
回复

使用道具 举报

Singcere_ex10 发表于 2014-2-8 19:46:24 | 显示全部楼层
验证码 || submitcheck
回复

使用道具 举报

 楼主| baidudiscuz 发表于 2014-2-8 20:41:08 | 显示全部楼层
本帖最后由 baidudiscuz 于 2014-2-8 20:56 编辑


谢谢您的回复,心中一阵暖。
我以为提交表单才需要submitcheck     

回复

使用道具 举报

肥爺 发表于 2014-2-8 22:03:58 | 显示全部楼层
本帖最后由 肥爺 于 2014-2-8 22:18 编辑

当adminid已经是1即管理员的时候
神马formhash submitcheck都是浮云了
So 如果LZ的完整代码就这么多的话
这是我的写法 仅供参考
  1. if(defined('IN_DISCUZ') && $_G['adminid'] == 1) {
  2.         // 想严谨点的话 这里可以先查询一下id是否存在
  3.         DB::delete('数据表1', array('id' => intval($_GET['id'])));
  4.         showmessage('删除成功', '', array(), array('alert' => 'right'));
  5. }
  6. exit('Access Denied');
复制代码


PS: LZ要多注意符号的使用 加油啦 新年快乐
回复

使用道具 举报

 楼主| baidudiscuz 发表于 2014-2-8 22:40:26 | 显示全部楼层
肥爺 发表于 2014-2-8 22:03
当adminid已经是1即管理员的时候
神马formhash submitcheck都是浮云了
So 如果LZ的完整代码就这么多的话
...

代码确实就这么多,谢谢你,高手果然精辟很多
回复

使用道具 举报

 楼主| baidudiscuz 发表于 2014-2-8 22:45:04 | 显示全部楼层
肥爺 发表于 2014-2-8 22:03
当adminid已经是1即管理员的时候
神马formhash submitcheck都是浮云了
So 如果LZ的完整代码就这么多的话
...

我把代码改了下
如果不只是管理员,还可能是用户删除自己的话,像3楼朋友说的,要加“验证码 || submitcheck”吗?
我应该怎么加?
<?php
if(!defined('IN_DISCUZ')) {
        exit('Access Denied');
}
if(!$_G['uid']){               
        showmessage('not_loggedin', NULL, array(), array('login' => 1));
                }else{

    if(isset($_GET['formhash']) && $_GET['formhash'] == formhash()){
        $uid = intval($_G['uid']);
        $id = intval($_GET['sid']);
    $sid = DB::result_first("SELECT id FROM ".DB::table('表1'). " where id = ".$id." and uid = ".$uid."");
        if($sid){
        DB::delete('表1',array('id'=> $sid,'uid'=> $uid));
        showmessage("删除成功",'', array(), array('alert' => right));
        }else{
        showmessage("id不存在或无权限操作");
    }
  }
}
?>
CSRF的问题,问了很多人,都没人理我。。。谢谢你
回复

使用道具 举报

肥爺 发表于 2014-2-8 23:19:45 | 显示全部楼层
baidudiscuz 发表于 2014-2-8 22:45
我把代码改了下
如果不只是管理员,还可能是用户删除自己的话,像3楼朋友说的,要加“验证码 || submitc ...

就看处理的数据有多重要了
涉及积分钱财之类的话 单靠formhash submitcheck没有意义
这情况要考虑的只有账号被黑 要求输入密码+验证码还比较靠谱
闲得没事自己搞自己那也没啥好说的了
So 只要做好逻辑和验证一下传入的数据就好啦
回复

使用道具 举报

shy9000 发表于 2014-2-9 00:44:41 | 显示全部楼层
肥爺 发表于 2014-2-8 22:03
当adminid已经是1即管理员的时候
神马formhash submitcheck都是浮云了
So 如果LZ的完整代码就这么多的话
...

帖子图片标签里面放上这么个图片地址,管理员一访问这个帖子你这招可就被CSRF了。还是有必要验证formhash的

评分

1

查看全部评分

回复

使用道具 举报

 楼主| baidudiscuz 发表于 2014-2-9 00:48:58 | 显示全部楼层
不涉及帐号和财务
就是用户发表的信息,管理员和用户可删除.
就是应用中心审核过不了,(回复:请留意删除等操作可能导致的CSRF问题),很郁闷,看别人插件,也没找到可参考的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-11-25 04:26 , Processed in 0.137506 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表