拜托大家:公司用CodeIgniter开发了一个系统,本来是要分销商登录系统后输入业务单的,结果分销商自己做了个接口...

akconns 2015-11-10 04:21:57
公司用CodeIgniter开发了一个分销商管理系统,本来是要分销商登录系统输入业务单的,结果分销商自己找软件公司,利用ajax能看到如下的代码,
function Checkup(){
$("body").delegate("#Checkup","click",function(){
$.post(context+"/Order/Checkup",{action:action,AB:AB,AC:AC,AD:AD},function(data){
其他代码......
}
}

利用能看到上面代码,POST业务单数据进来.
我不知他们是怎么做到的.
我使用了二个方法限制,
1. 使用了检查是否在浏览器登录的方法,检查用户是否登录成功.这个方法给破解了.
2.使用了在登录时,在session生成一个KEY,然后,在提交表单时,验证KEY是否与登录一致的方法,也给破解掉了,我如果换一个新地登录KEY,他像在session查到新KEY,修改一下,又发送数据过来了.

真的是搞到我头大,难道ajax的POST方法就如此不安全?
现在还是一直POST发送业务数据进来,
诚心请教大家有什么方法可以拒绝这种非法POST过来的数据?
拜托拜托。。。。


...全文
413 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
akconns 2015-11-29
  • 打赏
  • 举报
回复
#22楼的方法是可以试试. 我现在采用的方法是最笨的方法,通知他们公司,停止这种方法发送数据,如果还这样,将锁定帐号,不给登录. 这是属于暴力解决......... 唉....
xuzuning 2015-11-29
  • 打赏
  • 举报
回复
你钻进牛角里去了,把我的思路之一写了个例子,一看就明白
<?php
session_start();
if($_GET) {
  $_SESSION[$_GET['key']] = 1; //记录下有键盘输入的控件
  exit;
}
if($_POST) {
  print_r(array_diff_key($_POST, $_SESSION)); //提交项和记录项比较,得到不是键盘输入的控件
  exit;
}
?>
<script src=scripts/jquery-1.8.3.min.js></script>
<script>
$(function() {
  $(':text').keydown(function() {
    $.get(location.href, {key : $(this).attr('name')});
  });
  $('form').submit(function() {
    $.post($(this).attr('action'), $(this).serialize(), function(d) { alert(d) });
    return false;
  });
});
</script>
<form method=post>
<input type=text name=t1 value=预置>
<input type=text name=t2 value=预置>
<input type=submit value=ok>
</form>
表单由预置数据,用于模拟非键盘输入的内容 不是键盘输入的数据就不入库,这还不简单吗?
qq_28750549 2015-11-26
  • 打赏
  • 举报
回复
是否可通过判断ajax请求文件的所在位置和文件是否存在做判断
人鱼传说 2015-11-26
  • 打赏
  • 举报
回复
引用 20 楼 aken815 的回复:
[quote=引用 19 楼 baronyang 的回复:] 没看出代码有什么安全问题,期待高手出现
我把这分销商的账号锁定了,他的接口就不能接进来了,现在问题出在,他账号可以登录,就可以写入数据,我只是想只能通过我的系统来提交数据,其他方法不能POST进来,仅此而已,在提交时,用验证码,是否可以实现?[/quote] 在POST方法中写一个记录日志的方法, 将$INPUT=filter_input_array(INPUT_SERVER);的数组内容记下来, 先用用正常的方式调用POST方法,然后检查POST数据中包含这个供应商时,就记下$INPUT的值,用正常的值与非正常提交的$INPUT的值比较,看是否有差异,若有差异就增加一个检测,有异常就不提交数据到数据库!
人鱼传说 2015-11-19
  • 打赏
  • 举报
回复
没看出代码有什么安全问题,期待高手出现
xuzuning 2015-11-19
  • 打赏
  • 举报
回复
前面我已经讲过了,你可以监听表单的变化来决定是否可以入库 如果对方也模拟了键盘操作(真难为他了),那就也可算是合法的吧
akconns 2015-11-19
  • 打赏
  • 举报
回复
引用 19 楼 baronyang 的回复:
没看出代码有什么安全问题,期待高手出现
我把这分销商的账号锁定了,他的接口就不能接进来了,现在问题出在,他账号可以登录,就可以写入数据,我只是想只能通过我的系统来提交数据,其他方法不能POST进来,仅此而已,在提交时,用验证码,是否可以实现?
黄袍披身 2015-11-17
  • 打赏
  • 举报
回复
提交需要验证码不就完了... 不用想那么多...
akconns 2015-11-17
  • 打赏
  • 举报
回复
引用 17 楼 baronyang 的回复:
你的后台代码呢?
这是后端代码 <?php defined('BASEPATH') OR exit ('No direct script access allowed'); require_once APPPATH.'dbconn.php'; class SmsActOrder extends CI_Controller { function __construct() { parent::__construct(); if (!$this->session->userdata('username')) { redirect('login'); } } public function index($operator="kaitong") { if (!$this->session->userdata('username')) { redirect('login'); } $this->load->helper('cookie'); $data['username'] = get_cookie('username'); $data['password'] = get_cookie('password'); $data[$operator] = $operator; $username = $this->session->userdata('username'); if(ENVIRONMENT=="production"){ //包 $query1 = $this->db->query("EXEC getCab $username, '开通'"); // var_dump($query1->result()); // $data['channelProgCab']=$query1; //开机人 $query2 = $this->db->query("EXEC getChannelNoList $username "); $data['channelNoList']=$query2; // var_dump($query2->result()); $query3 = $this->db->query("EXEC SMS_GetChannelNo $username"); $row = $query3->first_row(); // var_dump($row); $data['currentChannel']=$row; } if(!empty($query1)){ $a='<option value="">请选择包</option>'; foreach($query1->result() as $list){ $a=$a. "<option value=".$list->vCabName.">".$list->vCabName."</option>"; } $data['channelProgCab']=$a; } $this->load->view('smsActOrder',$data); } public function authCheckup(){ $iUserNo = $this->session->userdata('UserNo'); $username = $this->session->userdata('username'); $Group = $this->session->userdata('strGroup'); $strDate=date("Y.m.d"); $LoginIDs =md5($username.$strGroup.$UserNo.$strDate); //这时是验证是否登录,是否可以通过验证继续下面的操作 if (($iUserNo=="")or($username=="")or($this->session->userdata('strGroup')=="")){ exit; } $sessionKey = $this->session->userdata('Login1D'); if ($sessionKey<>$LoginIDs){ exit; } $ChannelNos= $this->input->post('ChannelNo'); if ($ChannelNos=='101010')){//在这里强制限制了这个分销商的使用,但这个不是办法,不能这样做 exit; } try { $objDB = getdbconn(); $samt = $objDB->prepare("exec sp_Checkup ?,?,?,?,?,?,?,?,?,?,?,?,?"); $web='WEB'; $UserName=$username; $ChannelNo= $this->input->post('ChannelNo'); $Action= $this->input->post('action'); $CabName= $this->input->post('CabName'); $Serial= $this->input->post('Serial'); $Memo= $this->input->post('Memo'); $StartDate=$this->input->post('StartDate'); $EndDate=$this->input->post('EndDate'); $PointAmount=$this->input->post('PointAmount'); $PointCost=$this->input->post('PointCost'); $bEdit=$this->input->post('bEdit'); $actCount=$this->input->post('actCount'); $samt->bindParam(1,$web, PDO::PARAM_STR); $samt->bindParam(2, $UserName, PDO::PARAM_STR); $samt->bindParam(3, $ChannelNo, PDO::PARAM_STR); $samt->bindParam(4, $Action, PDO::PARAM_STR); $samt->bindParam(5, $CabName, PDO::PARAM_STR); $samt->bindParam(6, $Serial, PDO::PARAM_STR); $samt->bindParam(7, $Memo, PDO::PARAM_STR); $samt->bindParam(8,$bEdit, PDO::PARAM_INT ); $samt->bindParam(9, $StartDate, PDO::PARAM_STR); $samt->bindParam(10, $EndDate, PDO::PARAM_STR); $samt->bindParam(11,$PointAmount, PDO::PARAM_INT ); $samt->bindParam(12,$PointCost, PDO::PARAM_INT ); $samt->bindParam(13,$actCount, PDO::PARAM_INT ); $samt->execute(); //$rowsetget = $samt->fetchAll(); do { $rowsetget = $samt->fetchAll(); if (is_array($rowsetget) && count($rowsetget) > 0) { $returnValueget = $rowsetget; } } while ($samt->nextRowset()); if(!is_array($returnValueget)){ // var_dump( $returnValueget); // $Reason = "包:".$cabCode." 号码 :".$serialList." 的业务单验证有异常!"; }else{ echo json_encode($returnValueget); } } catch (PDOException $e) { echo "Connection failed!"; die('Connection failed!'); } } public function import(){ // 执行导入的接口,就是循环调用getAuthCheckup,如果验证通过,才能加入到待提交表 } public function submit(){ try { $iUserNo = $this->session->userdata('iUserNo'); $username = $this->session->userdata('username'); $strDate=date("Y.m.d"); $LoginKey =md5($this->session->userdata('username')."iSMS$%^&*()2015"); $objDB = getdb(); $samt = $objDB->prepare("EXEC getAuthSubmit ?"); $iNos= $this->input->post('iNo'); $samt->bindParam(1,$iNos, PDO::PARAM_STR); $samt->execute(); do { $rowsetget = $samt->fetchAll(); if (is_array($rowsetget) && count($rowsetget) > 0) { $returnValue = $rowsetget; } } while ($samt->nextRowset()); // var_dump($returnValue); if(!is_array($returnValue)){ // var_dump($returnValue); // $Reason = "包:".$cabCode." 号码 :".$serialList." 的业务单验证有异常!"; }else{ echo json_encode($returnValue); } } catch (PDOException $e) { echo "Connection failed!"; die('Connection failed!'); } // EXEC getAuthSubmit @iCheckNo=检查编号 // $query1 = $this->db->query("EXEC getAuthSubmit 32631"); // var_dump($query1->result()); //提交操作后,将返回一个结果集,直接显示在系统日志上即可。 } }
人鱼传说 2015-11-17
  • 打赏
  • 举报
回复
你的后台代码呢?
akconns 2015-11-16
  • 打赏
  • 举报
回复
引用 13 楼 baronyang 的回复:
你的情况是分销商在他们自已开发的系统中做了跨域调用你的url吧
我们不是一个分销一个账号,是一个一级分销下面有N多的二级三级分销.所以,有些分销的账号会比较多. 这是如下代码: <script type="text/javascript"> $(function(){ $('#file_upload').uploadify({ 'formData' : { 'timestamp' : '1447687985', 'token' : 'b6f7fa6826354e7d263e24c4395f86e2' }, 'swf' : '/assets/uploadify/uploadify.swf', 'uploader' : '/base/upload_file', 'buttonText' : '', 'width' : 213, 'height' : 33, 'fileTypeExts' : '*.txt; *.xlsx; *.xls', 'onUploadSuccess' : function(file, data, response) { if(data=='error'){ alert("请选择Excel或者Txt文件上传"); }else{ $("#importfile").val(data); alert("文件上传成功"); } // alert('The file ' + file.name + ' was successfully uploaded with a response of ' + response + ':' + data); }, 'onUploadError' : function(file, errorCode, errorMsg, errorString) { alert('文件 ' + file.name + ' 上传出现错误: ' + errorString); } }); authCheckup();// quickQuery();// }); function authCheckup(){ $("body").delegate("#authCheckup","click",function(){ var action = $("#action").val(); var CabName = $("#CabName").val(); var Serial = $("#Serial").val(); var Memo = $("#Memo").val(); var ChannelNo = $("#ChannelNo").val(); var StartDate = $("#StartDate").val(); var EndDate = $("#EndDate").val(); var PointAmount = $("#PointAmount").val(); var actCount = $("#actCount").val(); if(actCount==''){ actCount=0; } if(PointAmount==''){ PointAmount=0; } var PointCost = $("#PointCost").val(); if(PointCost==''){ PointCost=0; } var bEdit = 1; bEdit = $("#bEdit").parent().hasClass("checked")?1:0; if(action==''){ alert("请选择操作动作"); return; } if(CabName==''){ alert("请选择包"); return; } if(Serial==''){ alert("请输入号码"); return; } $.post(context+"/SmsActOrder/authCheckup",{action:action,CabName:CabName,Serial:Serial,Memo:Memo,ChannelNo:ChannelNo,StartDate:StartDate,EndDate:EndDate,PointAmount:PointAmount,PointCost:PointCost,bEdit:bEdit,actCount:actCount},function(data){ if(data){ var obj = eval(data); for(var o in obj){ if(obj[o].bResult==1){ var c = $("tr#"+obj[o].vMainCode).html(); if(c && c!=''){ var order = $("#addlog").attr("order"); $("<span><strong>"+parseInt(order)+"、</strong>号码:"+obj[o].vSerial+" 包:"+obj[o].vCabName+",重复添加输入,请修改!</span><br/>").insertBefore("#addlog span:first-child"); $("#addlog").attr("order",parseInt(order)+1); }else{ var tr = "<tr id="+obj[o].vMainCode+">"; tr+="<td style='text-align:center;'><i title='删除该业务单' style='cursor:pointer;' onclick=deliNo("+obj[o].iNo+",this) class='del-actorder icon-remove'></i></td>"; tr+="<td>"+obj[o].vAct+"</td>"; tr+="<td>"+obj[o].vCabName+"</td>"; tr+="<td>"+obj[o].vSerial+"</td>"; tr+="<td>"+obj[o].dStartDate+"</td>"; tr+="<td>"+obj[o].dEndDate+"</td>"; tr+="<td>"+obj[o].iPointAmount+"</td>"; tr+="<td>"+obj[o].vChannelNo+"</td>"; tr+="<td>"+obj[o].vChannelNoPre+"</td>"; tr+="<td>"+obj[o].vAuthState+"</td>"; tr+="<td>"+obj[o].iActCount+"</td>"; tr+="<td>"+obj[o].iPointCost+"</td>"; tr+="<td>"+obj[o].vPayKind+"</td>"; tr+="<td>"+obj[o].vChannelNo+"</td>"; tr+="<td>"+obj[o].vOrigChannelNo+"</td>"; tr+="<td>"+obj[o].vPlatform+"</td>"; tr+="</tr>"; $(tr).appendTo("#waitsubmit tbody"); var benci = parseFloat($("#bencixiaofei").html())+parseFloat(Math.abs(obj[o].iPointAmount))+parseFloat(Math.abs(obj[o].iPointCost)); var bencijiecun = parseFloat($("#shagncijiecun").html()-benci); $("#bencixiaofei").html(benci); $("#bencijiecun").html(bencijiecun); $("#iNos").val($("#iNos").val()+","+obj[o].iNo); if(parseFloat($("#bencijiecun").html())<0){ $("#submitactbtn").attr("disabled","disabled"); $("#submitactbtn").ca }else{ $("#submitactbtn").removeAttr("disabled"); } } }else{ var order = $("#addlog").attr("order"); $("<span><strong>"+parseInt(order)+"、</strong>"+obj[o].vReason+"</span><br/>").insertBefore("#addlog span:first-child"); $("#addlog").attr("order",parseInt(order)+1); } } $("#tab_1_1").addClass("active"); $("#tab_1_2").removeClass("active"); $("a[href=#tab_1_1]").parent().addClass("active"); $("a[href=#tab_1_2]").parent().removeClass("active"); } }); }); }; function quickQuery(){ $("body").delegate("#quickQuery","click",function(){ var Serial = $("#Serial").val(); if(Serial==''){ alert("请输入号码"); }else{ $.post(context+"/SmsActOrder/quickQuery",{Serial:Serial},function(data){ $("#kuaisuchaxun tbody").html(""); if(data){ var obj = eval(data); for(var o in obj){ var tr = "<tr>"; tr+="<td>"+obj[o].vCabName+"</td>"; tr+="<td>"+obj[o].vSerial+"</td>"; tr+="<td>"+obj[o].vActKind+"</td>"; tr+="<td>"+obj[o].vAuthState+"</td>"; tr+="<td>"+obj[o].dStartDate+"</td>"; tr+="<td>"+obj[o].dEndDate+"</td>"; tr+="<td>"+obj[o].iActCount+"</td>"; tr+="<td>"+obj[o].vChannelNo+"</td>"; tr+="<td>"+obj[o].vChannelNoPre+"</td>"; tr+="<td>"+obj[o].dCreateDate+"</td>"; tr+="<td>"+obj[o].vClient+"</td>"; tr+="<td>"+obj[o].vMemo+"</td>"; tr+="</tr>"; $(tr).appendTo("#kuaisuchaxun tbody"); } $("#tab_1_2").addClass("active"); $("#tab_1_1").removeClass("active"); $("a[href=#tab_1_2]").parent().addClass("active"); $("a[href=#tab_1_1]").parent().removeClass("active"); } }); } }); }; function submitact(){ var r=confirm("您确认要提交业务单吗?") if(!r){ return; } var iNos = $("#iNos").val(); if(iNos && iNos!=''){ $('#loading').modal('show'); var strs=iNos.split(","); //字符分割 for (i=0;i<strs.length ;i++ ) { if(strs[i]!=''){ $.post(context+"/SmsActOrder/submit",{iNo:strs[i]},function(data){ var obj = eval(data); for(var o in obj){ var order = $("#addlog").attr("order"); tr="<span><strong>"+parseInt(order)+"、</strong>"+obj[o].Result+"</span><br/>"; $(tr).insertBefore("#addlog span:first-child"); $("#addlog").attr("order",parseInt(order)+1); } $("#waitsubmit tbody").html(""); $("#iNos").val(""); // if(data && data=='success'){ // $("#waitsubmit tbody").html(""); // } var bencijiecun = parseFloat($("#shagncijiecun").html())-0; $("#bencixiaofei").html(0); $("#bencijiecun").html(bencijiecun); if(parseFloat($("#bencijiecun").html())<0){ $("#submitactbtn").attr("disabled","disabled"); }else{ $("#submitactbtn").removeAttr("disabled"); } $('#loading').modal('hide'); }); } } $("#StartDate").val(""); $("#EndDate").val(""); $("#PointAmount").val(""); $("#actCount").val(""); }else{ alert("请先添加业务单后再提交"); } }; function changeChannelNo(){ var ChannelNo = $("#ChannelNo").val(); $.post(context+"/SmsActOrder/get",{ChannelNo:ChannelNo},function(data){ var obj = eval("("+data+")"); $("#shagncijiecun").html(obj.iPointBalance); var bcxf = $("#bencixiaofei").html(); var bencijiecun = parseFloat($("#shagncijiecun").html())-parseFloat(bcxf); $("#bencijiecun").html(bencijiecun); if(parseFloat($("#bencijiecun").html())<0){ $("#submitactbtn").attr("disabled","disabled"); }else{ $("#submitactbtn").removeAttr("disabled"); } }); } $('#loading').modal({backdrop: 'static', keyboard: false,show:false}); function beditchange(){ if($("#bEdit").parent().hasClass("checked")){ $("#showedit").show(); }else{ $("#showedit").hide(); $("#StartDate").val(""); $("#EndDate").val(""); $("#PointAmount").val(""); $("#actCount").val(""); } } </script>
akconns 2015-11-16
  • 打赏
  • 举报
回复
引用 13 楼 baronyang 的回复:
你的情况是分销商在他们自已开发的系统中做了跨域调用你的url吧
是的,应该是分销商在他们自已开发的系统中做了跨域调用我的url,但我怎么拒绝这种跨域操作?我判断来源的域名,又是我们的官方域名,没法以他们的IP或域名来确认拒绝..
人鱼传说 2015-11-16
  • 打赏
  • 举报
回复
你的情况是分销商在他们自已开发的系统中做了跨域调用你的url吧
人鱼传说 2015-11-16
  • 打赏
  • 举报
回复
对于破解session的可能性极小,如果这也能破,web的安全机制已形同虚设,你可以把ajax代码和context+"/Order/Checkup的后台代码贴出来,让大家一起分析一下,一定是有漏洞,另外,这分销商有15个以上的账号是怎么回事,不是一个分销商一个账号吗?
akconns 2015-11-15
  • 打赏
  • 举报
回复
引用 10 楼 baronyang 的回复:
你的第一个限制都能破,如何破?
我也很佩服他们的技术,我做了验证用户是否登录了,但session的确是登录了,当我把公司系统停止,去操作他们的外接系统,也立马显示系统调用错误,所以,应该是用我不知道的方法,直接调用了我的接口. 我还测试了,我在提交的时候,加了一段代码,如果是属于这个分销商编号101010的提交,则拒绝,他们系统也立马显示不能调用,但这样做,公司系统也拒绝了正常的提交业务单,不合理的.况且,这分销商有15+个账号,也不能全部封掉啊,不给用啊, 所以很头痛...........
人鱼传说 2015-11-11
  • 打赏
  • 举报
回复
你的第一个限制都能破,如何破?
xuzuning 2015-11-10
  • 打赏
  • 举报
回复
你可以随机监听输入框,通过 ajax 传递过去并记录下来 多了少了都应该是有自动化操作的 监听用的代码也应该是动态加载的(覆盖静态函数)
akconns 2015-11-10
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
你这段代码又是谁的?
if (program == "2" || program == "4") { 上面那段代码是分销商开发的.他应该是在自己的前台网站,获取到客户提交的业务资料,然后通过接口$.POST到我们的公司系统.这样,分销商不需要人工操作,直接让客户把业务资料提交上来了,但这样隐患很大,我公司不允许这种方式.
xuzuning 2015-11-10
  • 打赏
  • 举报
回复
你这段代码又是谁的?
akconns 2015-11-10
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
你是说 Checkup 函数是你页面中的吗?那怎么会看不见呢? 通过自己的服务器抓取并修改你的页面,怎么弄都是可以的
Checkup函数是我们系统页面中的....他能看到这个js,然后,在他服务器,用了这个的代码,就可以把数据调用及写进来了. if (program == "2" || program == "4") { channelno = "101010"; var kkxxmi = $("#kami").val(); if ("" != kkxxmi) { $.post("/CreateGo", { "kami": kkxxmi, "serial": serial, "channelno": channelno, "hhjmb": hhjmb }, function (data) { alert(data); location.reload(); }); } else { alert("卡密不能为空"); $("#CreateGo").removeAttr("disabled"); } } else { channelno = "31030601"; $.post("/CreateGo", { "serial": serial, "jmbxx": jmbxx, "channelno": channelno, "hhjmb": hhjmb }, function (data) { alert(data); location.reload(); }); } 我服务端有没有办法数据这样的POST写入,我判断域名,发现数据来源,使用的是我们公司的域名,不是他们自己的域名,不算跨域,没法把他排除在外面.
加载更多回复(4)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧