楼上说的很好,总之做前端安全,永远不要相信浏览者输入的信息,有必要在前端和后台同时进行验证。
关于SQL注入,方法就是过滤请求特殊字符和参数传递执行SQL语句。
发个比较新的文章:http://www.cnblogs.com/jirigala/archive/2010/07/28/1787291.html
归纳一下,主要有以下几点:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
参考:
http://msdn.microsoft.com/en-us/magazine/cc163917.aspx
http://www.unixwiz.net/techtips/sql-injection.html
http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
http://xkcd.com/327/
http://ferruh.mavituna.com/makale/sql-injection-cheatsheet/
严重鄙视过虑所谓的特殊字符的方法.
public static void sqlJ() {
string flashack_In, flashack_db, flashack_dbstr, types; int flashack_Xh;
string[] flashack_Inf; flashack_In = "'※;※and※exec※insert※select※delete※update※count※*※%※chr※mid※master※truncate※char※declare"; flashack_Inf = flashack_In.Split('※');
if (Request.Form != null)
{
foreach (string flashack_Post in Request.Form)
{
for (flashack_Xh = 0; flashack_Xh <= flashack_Inf.GetUpperBound(0); flashack_Xh++) { if (Request.Form[flashack_Post].ToLower().Contains(flashack_Inf[flashack_Xh])) { Response.Write("<script language='javascript'>alert('系统提示你:请不要在参数中包含非法字符尝试注入');</script>"); Response.Write("<script language='javascript'>window.history.go(-1);</script>"); Response.End(); } } } } if (Request.QueryString != null) { foreach (string flashack_Get in Request.QueryString) { for (flashack_Xh = 0; flashack_Xh <= flashack_Inf.GetUpperBound(0); flashack_Xh++) { if (Request.QueryString[flashack_Get].ToLower().Contains(flashack_Inf[flashack_Xh])) { Response.Write("<script language='javascript'>alert('系统提示你:请不要在参数中包含非法字符尝试注入');</script>"); Response.Write("<script language='javascript'>window.history.go(-1);</script>"); Response.End(); } } } } }
使用参数化就是基本,不要去迷信过滤关键字啥的。
使用参数化SQL