<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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 runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<input type="button" value="删除" onclick="return confirm('确定要删除吗');" />
<asp:Button ID="Button1" runat="server" Text="服务端的alert"
onclick="Button1_Click"/>
<br />
<br />
<asp:Button ID="Button2" runat="server" onclick="Button2_Click"
Text="Message" />
<br />
<br />
<asp:Button ID="Button3" runat="server" onclick="Button3_Click" Text="中木马" />
<br />
<br />
<br />
<asp:Button ID="Button4" runat="server" onclick="Button4_Click" Text="Button" />
<asp:Label ID="Label1" runat="server" Text="0"></asp:Label>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
//using System.Windows.Forms;
/* web开发的一些基本原则
* 最小权限原则,只允许用户做....,而不是"不允许用户做....."
*
* 浏览器查看的是服务端代码的执行输出的文本,除非服务器有漏洞,否则浏览者无法查看服务端的aspx,cs代码
* 目标另存为也是保存的aspx的执行结果,而看不到aspx的原代码
* js html是被输出到浏览器上执行的,因此无法禁止浏者查看js, html
*
* C#代码是运行在服务器端的,js代码是运行在浏览器客户端的
*
* 能在浏览器完成的事情,就不要到服务端去做
* 客户端是不可信的
*
*原则1:
* 案例1: 在项目中添对System.Widnows.Forms的引用(但我在测试的时候总是失败),然后MessageBox.Show("Hello");
* 用CassiniDev.exe启动测试程序让学生们远程测试,证明C#代码是过行在服务端的
*
* 127.0.0.1 是回环地址(LoopBack),就是表示通过回环地址访问本机,哪些怕是本机外网地址也访问不了,localhost就是127.0.0.1别名,是无法在外部访问
*
* 0.0.0.0任意IP(Any IP),不用写死绑定的IP了,通过任何一块网卡都可以访问网络程序
*
* 案例2: 伟大的ASP.net,可以在访问者创建磁盘中创建木马文件
*
* File.WriteText("c:/muma.exe","木马木马木马木马木马");
*
*
* 用CassiniDev.exe启动测试程序让学生们远程琐(VS内置的服务器不能远程访问).exe生成到了服务器的磁盘中,而不是访问者的磁盘中
* 因为C#代码是运行在服务器中的,而不是在浏览器中的,浏览器得到的只有返回html内容
*
* 案例3: 两个学生别访问点南自增1的界面,互不影响,因为不同用户变量内容是隔离的
*
*
*
* 原则2:
* 能在浏览器端完成的事情,就不要到服务端去做
* 按钮隐藏一个控件就不要写服务端代码,在客户端用javascript,dom来操作就可以,比如要操作数据库,显示是在浏览器端做不到的
* 这时候就要写服务端代码,校验用户名,密码这样的操作可以放到浏览端(用户名,密码是写死的),技术上可以,但是这样安全性太差,因为必须放到服务端
*
* 不要把敏感数据,算法写在浏览器端
* $("#btnLogin").click(function(){
* if($("#username").val() == "admin" && $("#password").val() == "123456")
* {
* alert("登录成功");
* }else{
* alert("登录失败");
* }
* });
*
* 用户在浏览器中查看源代码就可以看到用户名,密码是什么,在动态网站空间还是很稀有的那个年代,很多个人主页都这用这方式进行数据的"保密"
*
* 不要把机密信息隐藏在于html中
* 只有密码输对了才显示下载地址,实现代码见备注
*
* 应该在服务端控制驿不对则Visible=false,服务端控件的HyperLink1.Visible=false是根本不输出到客户端
* 在和jquery等结合的时候是无法用$("#id").show()来显示的,visible=false的控件,因为控件根本没有渲染到HTML中
*
* 应该是在机密页面打开之前做权限校验,而不是在一个页面中做校验,如果正确就倒向机密页面,不正确就不导向
*
*
* XSS漏洞
*
* 不要轻信用户提交上来的数据
*
* alert消息太难看了,因此开发一个ashx页面用来统一展示消息,showMessage.ashx
*
*
* aspx中默认对请求的数据进行了校验,如果数据中有< /等有潜在XSS攻击的字符,则会报错,对于一些CMS系统等确实需要提交html内容的地方要关闭它
* 在页面机部的page中加入ValidateRequest='false'这个属性
*
* 在显示的进修如果需要对内容在显示之前进行HTMLEncode,除了可以使用户HttpUtility.HtmlEncode进行手动编码的话,还可以使用Literal控件显示,
* 如果修改Literal的model属性为Encode那么就会自动进行HTMLEncode然后显示
*/
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode("<a href=''>哈哈</a>"));
//HttpUtility.HtmlEncode(s); 将字符串中的< > 等特殊字段转换为>等转义符
}
protected void Button1_Click(object sender, EventArgs e)
{
//这里直接出现alert
Response.Write("<script type='text/javascript'>alert('你确定要删除吗?');</script>");
//Response.Write("xxdxd");
}
protected void Button2_Click(object sender, EventArgs e)
{
//这里不能弹出,好像是少引用文件了
//MessageBox.Show("多简单啊,服务端弹出对话框");
}
protected void Button3_Click(object sender, EventArgs e)
{
File.WriteAllText("c:/muma.exe", ",木马(){木马木马木马木马木马}");
}
protected void Button4_Click(object sender, EventArgs e)
{
string i = Label1.Text;
int v = Convert.ToInt32(i) + 1;
Label1.Text = v.ToString();
}
}