程序开发中的几个请不要相信

链接中的例子是一些脚本攻击相关的内容,有时间的朋友可以点开看看。

1.不要相信Request.QueryString:

相信在asp时代,这个问题比较严重,不信,随便到网络上找几个asp的企业站,找到这种url"view.asp?id=xxx",改成"view.asp?id=xxx or 1=1",相信你会看到不一样的东西,到了.net,应该很少了,不过上次看到有人说CSDN爆过哦,简单的解决方法是在取得数据时做数据类型验证或转换。比如:
int ViewID = 0;
if(int.TryParse(Request.QueryString["ID"], out ViewID)){
//...
}
2.不要相信maxlength:
 有时候我们想客户端输入的某个值不超过一定的长度,这个时候可能就会用到input的maxlength,但maxlength能100%保证这个值的长度不超过maxlength吗?

忽略Maxlength

正常情况下你只能在上面的输入框中输入4个字符,但用户post给我们的数据是不是一定就
javascript:alert(window.c=function(){document.getElementsByTagName("input")[0].value = "你看看我的长度有没有4个字符呢?"}())

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

显然,maxlength是不可信的,简单的解决办法是后台代码验证数据长度:
string UserName = Request.QueryString["UserName"];
if(!string.IsNullOrEmpty(UserName)&&UserName.length > x){
//...提示错误或截断数据
}
3.不要相信Hidden:
有时候我们想把些信息保存到前台页面,然后再发送回来,但是我们又不想让客户看到这个信息,于是,我们把数据放到了hidden里面,那客户提交数据时,hidden里的内容真的是我们放的内容吗?

改变Hidden的值

function ShowValue(){
alert("Hidden 的 Value 是: " + document.getElementById("Type").value);
}

用户名:

请先点击"查看Hidden"查看原来的值.正常情况,客户端提交给你的Type的值应该是"Robot!",但是你把下面的代码复制到地址栏然后Enter一下,再点查看Hidden看看;

javascript:alert(window.c=function(){document.getElementById("Type").value = "我不是Robot!"}())

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

这个我一时也没想到好的验证方法,暂时也没有特殊的需求说必须验证。
4.不要相信客户端验证:

比如2和3中的问题,可能有的朋友觉得,我客户端再加个验证不就OK了吗?可是,往往,客户端验证也是不安全的,首先,如果客户端禁用脚本,那客户端验证是完全失效的,另外,在脚本有效的情况下,脚本验证也是可以被篡改的。

覆盖Submit验证

function ValidateForm(){
if(document.getElementById("UserName").value == ""){
alert("用户名不能为空!");
return false;
}
return true;
}

正常情况,点提交按钮会验证用户名不能为空,并弹出提示,但是你把下面的代码复制到地址栏然后Enter一下,再点提交看看;

javascript:alert(window.c=function(){document.getElementsByTagName("form")[0].onsubmit=function(){alert("我是不会验证数据的哦!");return true;}}())

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

以前QQ空间里可以通过这个方法免费使用黄钻模板,不知道现在还有没有。这个就没有什么好的解决办法,只能后台再验证一次。
5.不要相信编辑器:

有的时候,可能项目中要用到一些简单的编辑器,于是,我们就找到了一些编辑器,把不需要的功能(比如:编辑源码、插入图片等)剔除掉,就成了个简单的编辑器,那这样的编辑器还会有什么问题吗?

无标题文档

window.onload = function(){
document.getElementById("sampleEditor").contentWindow.document.designMode = "on";
}

真正的编辑器应该会有些加粗、倾斜什么的功能,我就不弄了,以最原始的iframe为例。

这个简单的编辑器没有查看源码的功能,那客户是不是真的就改变不了里面的内容了?
请将下面的代码复制到地址栏然后Enter;

javascript:alert(window.c=function(){document.getElementById("sampleEditor").contentWindow.document.body.innerHTML = '';}())

如果用户在里面插入个script标签再提交给你呢?

其实还有个更简单的方法,直接去另一个页面复制,然后回到编辑器里粘贴,什么都过来了。

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

暂时也没有什么好的解决办法,以前找到过过滤script标签的代码,但似乎不太完美。
6.不要相信Cookie:
网站中不可避免的会使用到Cookie,但如果一不注意,小心你的Cookie成了别人的"Cookie",
http://img.jb51.net/online/demo0415/Cookie.asp
取Cookie和写Cookie的js方法是在网上找到的,具体链接也找不到了。解决办法,似乎是Cookie加密(当然,即使是加密了,也尽量不要把敏感数据放到Cookie中),不知道各位高手还有没有其它好办法。
7.不要相信Request.UrlReferrer:
如果有朋友用这个来验证请求,那么请注意了,这个东西也是不可信的。见代码;
System.Net.HttpWebRequest request = System.Net.WebRequest.Create("http://www.jb51.net/") as System.Net.HttpWebRequest;
request.Referer = "http://www.jb51.net/";
...
那么,这个时候你取得的Urlreferrer会是http://www.jb51.net/,但这个请求却是伪造的。
8.不要相信用户:
用户就是你潜在的威胁,客户端的东西,永远都不要轻信。
另,select标签的内容也是不可信的,大家可以动手试试,随便建个页面,里面放个select,然后:


代码如下:

javascript:alert(window.c=function(){var s=document.getElementsByTagName("select")[0];for(var x = 0; x < 100; x++){s.options[x]=new Option("选项" + x, x)}}());

欢迎高手不吝赐教。示例代码下载。

(0)

相关推荐

  • 程序开发中的几个请不要相信

    链接中的例子是一些脚本攻击相关的内容,有时间的朋友可以点开看看. 1.不要相信Request.QueryString: 相信在asp时代,这个问题比较严重,不信,随便到网络上找几个asp的企业站,找到这种url"view.asp?id=xxx",改成"view.asp?id=xxx or 1=1",相信你会看到不一样的东西,到了.net,应该很少了,不过上次看到有人说CSDN爆过哦,简单的解决方法是在取得数据时做数据类型验证或转换.比如: int ViewID =

  • C/C++程序开发中实现信息隐藏的三种类型

    无论是模块化设计,还是面向对象设计,还是分层设计,实现子系统内部信息的对外隐藏都是最关键的内在要求.以本人浅显的经验,把信息隐藏按照程度的不同分成(1)不可见不可用(2)可见不可用(3)可见可用. 1 不可见不可用 就是说模块内部的变量.结构体.类定义对外部而已完全隐藏,外部对此一无所知.常用的实现方法就是利用不透明指针,请参见我的博文C语言开发函数库时利用不透明指针对外隐藏结构体细节. 这种方法同样适用于C++语言,一种可能的实现方式为面向接口编程. 头文件 IMyClass.h class

  • 深入解析微信小程序开发中遇到的几个小问题

    本地图片不显示,开发工具运行是没问题的,但真机调试却显示不了 item.img = '/goods/img/图片.png' <image src=" { { item.img } } " class="image"> </image> 经过仔细观察发现,路径是没问题的,问题在于图片名不能是中文的,把它改成字母+数字就好了. 使用FileSystemManager.readdir(Object object)方法读取本地文件夹中的所有图片,报错

  • Echarts在Taro微信小程序开发中的踩坑记录

    背景 近期笔者在使用Taro进行微信小程序开发,当引入Echarts图表库时,微信检测单包超限2M的一系列优化措施的踩坑记录,期望能指导读者少走一些弯路. 为什么选择Echarts? 微信小程序目录市面上使用最多的两款图表库,如下: echarts-for-weixin--echarts微信小程序版本 wx-charts--基于微信小程序的图表库 对比两款图表库优缺点刚好相反. echarts-for-weixin:功能强大,但体积非常大 wx-charts:功能相对简单,但体积小 由于笔者对e

  • 原生微信小程序开发中 redux 的使用详解

    前提 复杂场景中有不少数据需要在多个不同页面间来回使用和修改.但是小程序页面直接的数据通信方式十分的简单.通常情况需要自己维护一个全局的对象来存放共有数据.但是,简单的维护一个共有数据实体,会随着业务逻辑的不断复杂化而变的过分庞大,并且数据的修改往往无法很好的溯源.加之公共数据实体中数据的修改和页面的UI之间没有太好的同步手段,往往需要在页面和对应的数据实体中同时都维护一份相同的数据,操作十分的不方便. 之前使用过Taro以react+redux的结构来开发微信小程序,依托redux整体上可以解

  • Android程序开发中单选按钮(RadioGroup)的使用详解

    在还没给大家介绍单选按钮(RadioGroup)的使用,先给大家展示下效果图吧: xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

  • 微信小程序 开发中遇到问题总结

    微信小程序 开发中遇到问题总结 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载.例: //app.js App({ ajax:function(){ let that = this; wx.request({ url: 'https://a.com/url.php', method: 'GET', success: function(e){ that.data = 123; } }) }; }) //conte

  • 微信小程序开发中var that =this的用法详解

    在微信小程序开发中,var that =this的声明很常见.举个例子,代码如下! 示例代码1 //index.js Page({ data: { toastHidden: true, }, loadData: function () { var that = this//这里声明了that:将this存在that里面 wx.request({ url: 'test.php', data: {a: 'a', b: 'b'}, header: { 'content-type': 'applicat

  • 微信小程序开发中的疑问解答汇总

    前言 最近总结一篇微信小程序解答,作为小程序填坑人深有体会这里的变化,小程序刚发布消息的时候我就说了一个观点,只要小程序提供的组件或API丰富,稳定,兼容性好,才能实现小程序快速开发的理念,先如今还有很多组件的兼容不理想,有一些还在的优化中,因基于小程序这个平台开发限制很大,只能坐等中...如果想用第三方库来实现,小程序明文规定不支持第三方库的做法,这样做最终小程序审核环节百分百的不通过. 1.scroll-view 在 iOS 上存在 bug 在使用这个组件开发页面的时候,因自带滚动效果,Y

  • 在小程序开发中使用npm的方法

    微信小程序在 2.2.1 版本后增加了对 npm 包加载的支持,使得小程序支持使用 npm 安装第三方包. 1. 在小程序中加载 npm 包 npm install miniprogram-datepicker --production node_modules可以 在小程序根目录下,也可以存在于小程序根目录下的各个子目录中.但是不可以 在小程序根目录外.使用--production选项,可以减少安装一些业务无关的 npm 包,从而减少整个小程序包的大小. 2. 构建 npm 包 在微信小程序开

随机推荐