我们在开发一个网站的时候,不单单是想着把功能实现就OK了,它的性能,安全,效率等我们都要考虑进去,经常听见别人说自己网站被黑客攻击,被挂木马,这些有可能是服务器的漏洞,也有可能是程序的漏洞,现在就来简单的介绍几种网站安全策略:
1 sql注入(现在还不太明白别人是通过什么方式进行sql注入,正在研究中)安全策略:
在根目录下面创建一个asax文件,在Application_BeginRequest方法中加入以下代码
//SQL防注入
string Sql_1 = "exec|insert+|select+|delete+|update+|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|creat+table";
string Sql_2 = "exec+|insert|insert+|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|truncate+|char+|+char(|declare+|drop+|creat+|drop+table|creat+table";
string[] sql_c = Sql_1.Split('|');
string[] sql_c1 = Sql_2.Split('|');
if (Request.QueryString != null)
{
foreach (string sl in sql_c)
{
if (Request.QueryString.ToString().ToLower().IndexOf(sl.Trim()) >= 0)
{
Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");//
Response.Write(sl);
Response.Write(Request.QueryString.ToString());
Response.End();
break;
}
}
}
if (Request.Form.Count > 0)
{
string s1 = Request.ServerVariables["SERVER_NAME"].Trim();//服务器名称
if (Request.ServerVariables["HTTP_REFERER"] != null)
{
string s2 = Request.ServerVariables["HTTP_REFERER"].Trim();//http接收的名称
string s3 = "";
if (s1.Length > (s2.Length - 7))
{
s3 = s2.Substring(7);
}
else
{
s3 = s2.Substring(7, s1.Length);
}
if (s3 != s1)
{
Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");//
Response.End();
}
}
}
2 连接字符串加密:我们往往把连接字符串放到web.config中,有些木马可以通过查看web.config来查看数据
库用户和密码,从而攻击你的数据库和删除数据,所有要对其加密:
public class EnDeCrypt
{
private int key="longpaissrs";
public int Key
{
get { return key; }
set { key = value; }
}
public static string Encrypt(string encryptString)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] keyIV = keyBytes;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
public static string Decrypt(string decryptString)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] keyIV = keyBytes;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
}
3 关于数据库这块,一个网站最好用一个用户名和密码,最好不要用sa用户
4 sql语句传参的时候最好不要拼,用command.paramers.add()方式添加
5 上传文件控制格式
if (File1.PostedFile.ContentLength != 0)
{
bool fig = false;
string[] gs = new string[8]{ "rar", "doc", "ppt", "txt", "xls", "jpg", "gif", "pdf" };
for (int j = 0; j < gs.Length; j++)
{
string filename = File1.PostedFile.FileName;
if (filename.Substring(filename.LastIndexOf(".") + 1) == gs[j])
{
fig=true;
}
}
if (fig == false)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('上传文件格式不正确')</script>");
return;
}
}
6 cc攻击:大概可以理解为同一时间模拟多个用户同时访问你的服务器有可能造成你的服务器由于消耗
多大占用资源较多 使你的服务器处于瘫痪状态
那么怎样防范呢?
protected void Page_Load(object sender, EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (Request.ServerVariables["HTTP_VIA"] != null)
{
string user_IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] == null)
{
Response.Write("系统正在维护中");
Response.End();
}
if (Request.ServerVariables["HTTP_VIA"] == Request.ServerVariables["REMOTE_ADDR"])
{
Response.Write("系统正在维护中");
Response.End();
}
}
else
{
string user_IP = Request.ServerVariables["REMOTE_ADDR"].ToString();
if (Request.ServerVariables["Remote_Host"] != Request.ServerVariables["REMOTE_ADDR"])
{
Response.Redirect("error.html");
}
}
string path = Server.MapPath("~/");
if (!System.IO.File.Exists(path+"/CCLOG/CCLOG.txt"))
{
System.IO.File.CreateText(path+"/CCLOG/CCLOG.txt");
}
StreamWriter w = File.AppendText(path+"/CCLOG/CCLOG.txt");
w.WriteLine(GetIP()+" && "+DateTime.Now.ToLongTimeString());
w.Close();
}
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
public static string GetIP()
{
// 优先取得代理IP
string userHostAddress = HttpContext.Current.Request.ServerVariables
["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(userHostAddress))
{
//没有代理IP则直接取客户端IP
userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
if ((userHostAddress != null) && !(userHostAddress == string.Empty))
{
return userHostAddress;
}
return "0.0.0.0";
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
这种可以在防范并查出攻击的IP,然后将其屏蔽就可以了
或者采用另外一种可以方式cc攻击的方法,在后面会讲到
7 注册的时候要加上注册验证码,最好是中文的,用来防止批量注册。
8 还是说到加密这块,因为现在网上加密的方法很多,DNS,MD5等,但是建议最好在此基础之上加上自己的一些东西或者自己写个加密程序,要不然即使你加密,别人也可以试出来。
9 为了防止暴露表和字段,一般在数据访问层我们会把表的前缀和后面分开,可以把表的前缀写在web.config中,用的时候直接读出来,然后拼到一起,这样真实的表面就很难被识破
上面只是大概的说一个安全问题!