Web开发原则
一 最小权限原则
只允许用户做***,而不是“不允许用户做***”。
(总有一些非法权限是没有考虑到的,所以应该只分配给用户需要的权限)
理解解释:
浏览器查看的是服务器执行输出的文本,除非服务器有漏洞,否则浏览者无法查看服务端的代码。
二 能放在客户端的就不要放到服务器端
比如隐藏一个控件,
可以直接在客户端用
οnclick=”document.getElementById(“xx”).style.display=’none’”
而不用在服务端执行
xx.visible=false
三 不可信的客户端校验
①客户端的验证不能代替服务端验证,因为浏览器可以禁用JS
示例:在银行系统中如果你的余额不足100,设置不能取大于余额的金额。
客户端:
<form id="form1" runat="server" οnsubmit="if(parseInt(document.getElementById('TextBox1').value,10)>parseInt(document.getElementById('Label1').value,10)){alert('余额不足');return false;}">
服务端:
Label2.Text="取款成功,金额:"+TextBox1.Text;
分析:
这里使用的是JS方式来校验取款金额是否合理的。但当用户禁用了JS之后就可以不管多少,自由取款了。这个校验就完全没有用了。
IE可以通过(Internet选项->安全->自定义级别->脚本->活动脚本->禁用)来设置禁用script。
运行结果可自行设置检验一下效果。
所以应该改为下面的服务器校验:
int i = Convert.ToInt32(TextBox1.Text);
if (i > 100)
{
Label2.Text = "金额大于100不可取";
}
else
{
Label2.Text = "取款成功"+i;
}
②不要隐藏机密信息到HTML
这个很好理解,比如不要把用户名密码的校验直接写在JS中,因为JS等代码都是可以直接看到的。要写也应该写在外部的文件夹中。以路径的形式添加进来使用。
③XSS(Cross Site Scripting)漏洞
简而言之就是利用网页本身实现的漏洞,通过脚本来达到我们自己的目的。
这里通过一个例子更好的来理解,这个问题。
示例:实现添加评论与显示评论的功能。
添加评论
Add.aspx
<body>
<form id="form1" runat="server">
<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="添加评论" />
</form>
</body>
Add.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
File.AppendAllText("H:/1.txt",TextBox1.Text+"<br/>");
}
查看评论
View.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
string s = File.ReadAllText("H:/1.txt");
Response.Write(s);
}
输入:
你好呀!
View运行结果:
Add
输入:
<script type="text/javascript">alert("恭喜你中奖了,请到www.nihao.com领取奖品!")</script>
在此处添加:ValidateRequest="false"
View运行结果:
处理方法:
1.目前aspx中默认队请求的数据进行了校验,如果数据中有<、/等有潜在XSS攻击的字符,则会报错。
2.在显示的时候对内容进行HTMLEncode。
将View.aspx.cs改为:
protected void Page_Load(object sender, EventArgs e)
{
string s = File.ReadAllText("H:/1.txt");
Response.Write(HttpUtility.HtmlEncode(s));
}
或者使用Literal控件显示,其自带Encode属性。