程序开发中的几个请不要相信
发布时间:2022-08-13 13:04:24
链接中的例子是一些脚本攻击相关的内容,有时间的朋友可以点开看看。
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吗?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>忽略Maxlength</title> </head> <body style="font-size:12px;line-height:25px;"> <input type="text" maxlength="4" style="width:200px;" /> 正常情况下你只能在上面的输入框中输入4个字符,但用户post给我们的数据是不是一定就<=4个字符呢?把下面的代码复制到地址栏Enter一下看; <textarea style="width:600px;height:100px;line-height:20px;"> javascript:alert(window.c=function(){document.getElementsByTagName("input")[0].value = "你看看我的长度有没有4个字符呢?"}())</textarea> </body> </html>
显然,maxlength是不可信的,简单的解决办法是后台代码验证数据长度:
string UserName = Request.QueryString["UserName"];
if(!string.IsNullOrEmpty(UserName)&&UserName.length > x){
//...提示错误或截断数据
}
3.不要相信Hidden:
有时候我们想把些信息保存到前台页面,然后再发送回来,但是我们又不想让客户看到这个信息,于是,我们把数据放到了hidden里面,那客户提交数据时,hidden里的内容真的是我们放的内容吗?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>改变Hidden的值</title> <script language="javascript" type="text/javascript"> function ShowValue(){ alert("Hidden 的 Value 是: " + document.getElementById("Type").value); } </script> </head> <body style="font-size:12px;line-height:25px;"> <input type="hidden" id="Type" name="Type" value="Robot!" /> 用户名:<input type="text" id="UserName" name="UserName" /> <input type="submit" value="提交" /> <input type="button" onclick="ShowValue();" value="查看Hidden"/> 请先点击"查看Hidden"查看原来的值.正常情况,客户端提交给你的Type的值应该是"Robot!",但是你把下面的代码复制到地址栏然后Enter一下,再点查看Hidden看看; <textarea style="width:600px;height:100px;line-height:20px;"> javascript:alert(window.c=function(){document.getElementById("Type").value = "我不是Robot!"}())</textarea> </body> </html>
这个我一时也没想到好的验证方法,暂时也没有特殊的需求说必须验证。
4.不要相信客户端验证:
比如2和3中的问题,可能有的朋友觉得,我客户端再加个验证不就OK了吗?可是,往往,客户端验证也是不安全的,首先,如果客户端禁用脚本,那客户端验证是完全失效的,另外,在脚本有效的情况下,脚本验证也是可以被篡改的。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>覆盖Submit验证</title> <script language="javascript" type="text/javascript"> function ValidateForm(){ if(document.getElementById("UserName").value == ""){ alert("用户名不能为空!"); return false; } return true; } </script> </head> <body style="font-size:12px;line-height:25px;"> <form action="" method="post" onsubmit="return ValidateForm();"> <input type="text" id="UserName" name="UserName" /> <input type="submit" value="提交" /> </form> 正常情况,点提交按钮会验证用户名不能为空,并弹出提示,但是你把下面的代码复制到地址栏然后Enter一下,再点提交看看; <textarea style="width:600px;height:100px;line-height:20px;"> javascript:alert(window.c=function(){document.getElementsByTagName("form")[0].onsubmit=function(){alert("我是不会验证数据的哦!");return true;}}())</textarea> </body> </html>
以前QQ空间里可以通过这个方法免费使用黄钻模板,不知道现在还有没有。这个就没有什么好的解决办法,只能后台再验证一次。
5.不要相信编辑器:
有的时候,可能项目中要用到一些简单的编辑器,于是,我们就找到了一些编辑器,把不需要的功能(比如:编辑源码、插入图片等)剔除掉,就成了个简单的编辑器,那这样的编辑器还会有什么问题吗?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script language="javascript" type="text/javascript"> window.onload = function(){ document.getElementById("sampleEditor").contentWindow.document.designMode = "on"; } </script> </head> <body style="font-size:12px;line-height:25px;"> 真正的编辑器应该会有些加粗、倾斜什么的功能,我就不弄了,以最原始的iframe为例。 <iframe frameborder="1" style="width:500px;height:200px;" id="sampleEditor"></iframe> 这个简单的编辑器没有查看源码的功能,那客户是不是真的就改变不了里面的内容了? 请将下面的代码复制到地址栏然后Enter; <textarea style="width:600px;height:100px;line-height:20px;"> javascript:alert(window.c=function(){document.getElementById("sampleEditor").contentWindow.document.body.innerHTML = '<img src="http://www.cnblogs.com/images/logo.gif" />';}())</textarea> 如果用户在里面插入个script标签再提交给你呢? 其实还有个更简单的方法,直接去另一个页面复制,然后回到编辑器里粘贴,什么都过来了。 </body> </html>
暂时也没有什么好的解决办法,以前找到过过滤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("https://www.jb51.net/") as System.Net.HttpWebRequest;
request.Referer = "https://www.jb51.net/";
...
那么,这个时候你取得的Urlreferrer会是https://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)}}());
欢迎高手不吝赐教。示例代码下载。
猜你喜欢
- 如下所示:>>> dict={}>>> dict['list']=[]>>&
- 0. 简介在上篇博客——《Golang调度器(4)—goroutine调度》中一
- Python程序可以调用一组基本的函数(即内建函数),比如print()、input()和len()等函数。Python本身也内置一组模块(
- 本文实例讲述了mysql中left join设置条件在on与where时的用法区别。分享给大家供大家参考,具体如下:一、首先我们准备两张表来
- fileinput模块提供处理一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行。它的工作方式和readlin
- 先要明白Fscanf的工作原理Fscanf在遇到\n才结束遇到\r时就会把\r替换成0这就有个问题,要注意自己的文本换行符是什么,在Wind
- MySQL密码正确却无法本地登录-1045 Access denied for user 'root'@'local
- 本文实例讲述了Python实现的读取/更改/写入xml文件操作。分享给大家供大家参考,具体如下:原始文档内容(test.xml):<?
- 今天在慕课网上学习了有关于python操作MySQL的相关知识,在此做些总结。python操作数据库还是相对比较简单的,由于python统一
- 年前在重写淘宝旺铺里的会员卡脚本的时候,无意中发现了一个有趣的事情。代码类似:var associative_array = new Arr
- 多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的地方,以备不时之需。常见的 MySQL 数据备份方式有,直接打包复制对应的数据
- 我看blog里,还有很多地方都引用过我写的这个类,转了不少,但自己一直也没发表过,这次正式发表一下。在蓝色理想中有人不懂怎么用,我在baid
- 第一步肯定是打上SQL SERVER最新的安全补丁.如果这一步都没有做好,那我们也没有继续下去的必要了。 第二步是修改默认的1433端口,并
- http://swik.net/Ajax/Ajax+Mistakes在某网站瞎逛时,发现这个链接,进去逛了逛,觉得很有意思,大家也可以去看看
- 需求:请求接口之后,缓存当前接口的数据,下次请求同一接口时拿缓存数据,不再重新请求添加缓存失效时间cache使用map来实现ES6 模块与
- 1、远程服务器上安装jupyter notebook(配置jupyter_notebook_config.py文件)sudo pip ins
- 博主在这个问题上卡了挺久的,贴出来解决方法帮助需要的朋友,直接上代码(测试环境:win10+Python2.7):# coding=utf-
- # encoding:utf-8import re # 使用正则 匹配想要的数据import requests # 使用requests得到
- 使用pickle模块来dump你的数据:对上篇博客里的sketch.txt文件:import osimport sysimport pick
- 一、效果展示1、普通查询加序号SELECT t1.NAME,( @i := @i + 1 ) AS '序号' FROM t1