如何对抗注入漏洞

lliiqiang 2014-03-26 01:02:27
加精
其实注入漏洞的本质是数据与代码混合在一起造成的.
我建议
(1)迅速开发出计算机自身专有的文字,该文字专门用于计算机执行命令,这样可以与用户的数据文字分开,用户输入的文字不会含有也不允许含有计算机程序内部专用的文字.即便是客户端想输入该文字(例如技术论坛就是专门交流代码的),可以使用表面一样,但是实际的文字编码不一样的字符,不过要是拷贝代码就麻烦了,估计需要IDE处理。现在的计算机编程代码用的文字仍然是人类语言文字,只是它们被赋予了计算机意义了,但是这样会和人类文字产生歧义,这就给注入漏洞空子.
(2)对于数据特别是查询数据要在程序中重新定义一个类型赋值,对于数据库sql语句得到的数据并且再次校验数据.即客户端得到的是程序赋予的数据,而不能直接从数据库中得到
(3)对于客户端提交的数据中确实有输入代码的必要的部分采用白名单策略处理它,反正客户端传递的数据是在程序允许的框架环境下输入的,那么我们可以在框架下规定好相应的歧义不大的代码加入白名单,这些代码限定了客户端代码的功能。这样服务器端对这些代码只接收其中白名单中有的(现在过滤大多数采用黑名单策略,这样黑名单不全会导致过滤不周全,白名单策略即便考虑不周全最多是功能不完善,但是安全),但是如果是复制的话,有可能被复制对象中有白名单中没有的代码但是效果差不多,我们就没有办法了.
(4)富文本编辑器等提供用户操作的,客户端记录用户操作,而不是操作结果,然后由服务器端根据这些操作决定结果。这种方法能够防止大量的XSS
...全文
3041 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
忘记呼吸 2014-04-12
  • 打赏
  • 举报
回复
谢谢分享 看一下
caokanshang 2014-04-11
  • 打赏
  • 举报
回复
不太懂 太专业了
Legend-Hu 2014-04-11
  • 打赏
  • 举报
回复
很好,顶!虽然不懂,但是留着以后慢慢研究!
hayi1230 2014-04-11
  • 打赏
  • 举报
回复
收藏,慢慢学习
侧面 2014-04-08
  • 打赏
  • 举报
回复
顶一个,lz理解挺深刻的
lliiqiang 2014-04-02
  • 打赏
  • 举报
回复
最本质的核心是区分代码和数据,请求和命令.客户端不能传递命令,服务器端产生命令给客户端. 目前建议大家用iframe加载文本编辑器并且用noscript标签 <noscript> <iframe src="content.jsp?id=42354535"/> </noscript> 其中content.jsp是根据id获取html代码的服务页面.noscript能够过滤一部分script代码,里面的</noscript>标签也无法结束外面的. 当然后台过滤是最安全的方法,但是难度大,我们考虑得不周全,因为也没有统一的方法识别代码.代码花样太多了. 另外变量名和方法名,可以随机产生,这样可以加大XSS破坏难度 例如: <% String onsave="abdfbujefsdi";//在这里重命名,还可以利用随机函数.动态随机生成一个名字 %> <script type="text/javascript"> function <%=onsave%>(){//我们要对此方法名重命名 alert("保存"); } </script> <input type="button" value="保存" onclick="<%=onsave%>()"/> 顺便提一下csrf,其实它不是注入攻击,但是防御它最常用的方法是token,我建议也采用随机直接加载 <% String token="aafddfsfgsgsdfds"; String name="fsdfsfsdfdsfsdf";//随机生成名字 %> <script type="text/javascript"> function onsave<%=name%>(){//我们要对此方法名重命名 var form=document.getElementById("form<%=name%>"); form.onsubmit=null;//防止有人窃听 var uid=document.getElementById("uid"); uid.value="<%=name%>"; var token=document.getElementById("token<%=name%>"); token.value="<%=token%>"; form.submit(); uid.value=null; token.value=null;//记得临时使用完清空,避免被窃听。 } <form id="form<%=name%>"> <input id="uid"/> <input type="hidden" id="token<%=name%>"/> <input type="button" value="保存" onclick="onsave<%=name%>()"/> </form> 后台 <% String name=request.getParementer("uid"); String token=request.getParementer("token"+name);//这么获取值。 %> name可以写在session中,也可以动态创建表单,然后清空,大家来讨论.
my03131302 2014-04-01
  • 打赏
  • 举报
回复
mj100100 2014-04-01
  • 打赏
  • 举报
回复
对sql语句做检查
rumlee 2014-03-31
  • 打赏
  • 举报
回复
那么文本编辑器发送什么东西呢?是产生html代码的请求,注意是请求而不是html本身。 这个想法非常好,只是这样会增加大量的服务器端负担,而且服务器端程序开发复杂度也会大大增加。个人还是觉得服务器端对接收到的html代码进行过滤比较合适一些。
浪里花 2014-03-31
  • 打赏
  • 举报
回复
我知道java的jsoup可以过滤这个xss攻击,不过还是楼主说对了,客户端只应该发送请求,而不是”命令“
lliiqiang 2014-03-31
  • 打赏
  • 举报
回复
引用 9 楼 xiangnan129 的回复:
确实,文本编辑器是一个很大的注入漏洞。上次在公司就跟组长探讨了这个问题,结果直接被组长给忽略掉了。因为说如果做判断和处理的话很麻烦。所以就放弃处理了。
建议文本编辑器的html代码由后台生成. 前台生成请求,用json记录客户端的行为。例如:[{type:"text",value:"abcdafdd"},{type:"a",src:"网址",rom:"4",to:"7"}]这个发送给后台,意思是用户先输入了abcdafdd,然后将4-7的字符变成超级链接,这样后台就可以以此形成html代码,前台记录了客户端的所有行为即可.也可以使用ajax技术,html代码在后台生成,并且对应一个标识符,前台传递给后台标识符也行.
nettman 2014-03-30
  • 打赏
  • 举报
回复
xuwr284 2014-03-30
  • 打赏
  • 举报
回复
cy1375 2014-03-30
  • 打赏
  • 举报
回复
这个帖子有点意思,值得看看。
DevilDust 2014-03-30
  • 打赏
  • 举报
回复
scott_129 2014-03-29
  • 打赏
  • 举报
回复
确实,文本编辑器是一个很大的注入漏洞。上次在公司就跟组长探讨了这个问题,结果直接被组长给忽略掉了。因为说如果做判断和处理的话很麻烦。所以就放弃处理了。
my03131302 2014-03-29
  • 打赏
  • 举报
回复
line_us 2014-03-29
  • 打赏
  • 举报
回复
推倒重来的成本难以承受。
sxax 2014-03-29
  • 打赏
  • 举报
回复
对XSS跨站脚本注入,把能构造的" ' 等一些敏感字符进行过滤,也可以把# &等在进行过滤避免字符编码进行构造XSS跨站
皮特尔 2014-03-29
  • 打赏
  • 举报
回复
谢谢楼主分享。
加载更多回复(13)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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