1 A页面是用户注册页面,B页面是用户信息页面,当A页面注册成功之后方redirect到B进行用户信息提交.由于A页面所有信息(用户名,密码,密码问题,密码答案,权限我都用MD5加密),因此我用SESSION传递用户名到B页面以方便B页面update xxx where id = '用户名',我想问问各位这样做安全性如何.2 以前看见有朋友说分配不同用户操作SQL的权限,把insert select update delete等分配到各个单独用户.难道意思就是说在web.config里面根据数据库设定的用户来添加N个ConfigurationSetting.AppSettings么? 具体应该怎么做呢,请各位大大指点指点3 在web.config中,我的服务器连接字符串用户名是用明文写的,其他用户有没有可能取得这个明文表示的用户名和密码,如果能,我应该怎么加密.4 页面中所有验证都是用的RegularExpressionValidator,这个控件是不是先在客户端验证,客户端通过了在postback的时候再在服务器验证一次?如果是,是否可以理解为:除非表达式有缺陷,否则就不可能出现任何问题呢?5 前几天看帖子有朋友说session可能站用服务器资源,而cookie又存在客户端 看来这是个双刃剑啊,如何把握中间的平衡点呢?6 我做了一个checkcode.aspx的页面用来生成带图片的验证字符串,在regist.aspx里面通过<img src = "path">调用,但是我在运行时查看原代码时候发现path是可见的,如何才能避免别人看见这个路径.或者说有没有更好的办法可以实现这个验证功能7 看见许多网站传递参数时候参数是加密的.类似http://www.abc.com/page.aspx?a=235432523535256
当然,加密很好做到,但是md5是不可逆的.如何才能做到从A页面传递某个加密参数到B页面,而又需要B页面显示这个参数的没加密的值.
例如我传递的是id=abc 
而地址形式是http://www.abc.com/page.aspx?id = w4rt345235632rtr3
加密是加密了 可是我如何在B页面Request.Querystring的时候取出加密前的值abc?以上就是我最近遇见的问题.某些问题难免钻牛角尖,还请各位大哥多指点指点.谢谢啦

解决方案 »

  1.   

    再加一个问题 :)
    我所有的sql语句均用存储过程,这样是不是能防止注入攻击.除了这个之外,SQL还可能存在其他缺陷么.或者说,在输入验证的时候,应该注意什么?我现在知道的仅仅只有 注入攻击和转义符
      

  2.   

    1、这个地方用MD5加密似乎没啥作用,最多让数据库管理员看不到密码而已,要完全的保密可以使用SSL(在SSL上也不要配置为MD5或者SHA0加密方式)
    2、所以很多人直接设定一个账户为db_owner;可以考虑Windows集成认证方式操作,这篇文章涉及ASP.NET的安全框架:http://www.microsoft.com/china/technet/security/guidance/secmod38.mspx
    3、确实有这个问题,可以参考MS PetShop的方式,web.config里面存储的是加密后的内容,使用时再解密(选择一种非哈希算法)
    4、服务端也有验证的,基本上可以这么说
    5、使用加密了的cookies,ASP.NET对用户的认证和授权方面提供了很多有用的API,还是参考上面的链接
    6、不可能隐藏这个img的src,这种验证应该已经很不错了,泄漏src不会造成问题
    7、使用非哈希算法就是了(就是不能用MD5,SHA0之类)
      

  3.   

    呵呵~~~~俺的理解:
    1、会存在安全性问题,比如把你的用户名的值改为: 
      ;exec master.dbo.sp_addlogin Test, Test, master-- // 建立用户
      ;EXEC master.dbo.sp_addsrvrolemember 'Test', 'sysadmin'-- // 将用户test提升为管理员组
    结果可想而知;
    2、分配不同用户操作SQL的权限,应该是在SQL SERVER数据库中针对不同用户进行设置;
    3、web.config别人获取的可能性不大;
    4、也可以那么理解;
    5、然后把握平衡点要看你的WEB系统的需求;
      

  4.   

    如果永远都能保证不去拼接SQL语句的话,那就是安全的
    所有需要传送参数的地方都应该使用SqlParameter
    这种写法:
    string sqlQuery = "SELECT * FROM TB WHERE PID = '" + textBox1.Value + "'";
    全部都要改成:
    string sqlQuery = "SELECT * FROM TB WHERE PID = @PID";
    然后向这个SqlCommand传入一个名为@PID的SqlParameter(new SqlParameter("@PID",textBox1.Value))注意存储过程也未必能保证不会有注入攻击
    因为存储过程内部还是可以拼接查询字符串然后EXEC执行
    这种问题特别危险,一不小心就是严重的安全漏洞,需要多加注意
      

  5.   

    6 我做了一个checkcode.aspx的页面用来生成带图片的验证字符串,在regist.aspx里面通过<img src = "path">调用,但是我在运行时查看原代码时候发现path是可见的,如何才能避免别人看见这个路径.或者说有没有更好的办法可以实现这个验证功能我就想说你都能做出验证功能。难道你就不知道他的工作原理吗。。
      

  6.   

    up 这是我第一次做web项目,对安全问题了解不多.需要各位兄弟的经验帮助啊~~
      

  7.   

    嗯我还以为John Ca开始转行.NET了,哈哈
      

  8.   

    2、所指的不同用户操作sql的权限,是在存储过程中实现,而.net 程序仅仅分配数据库的读权限及存储过程的使用权限。
    3、web.config不容易被获取。
    4、差不多吧。
    5、这要根据实际需要而定了。
    6、获取这个路径,对程序影响不大。实在要隐藏的话,只有可以建一个中间页面,实现代码跳转。
    7、使用可逆加密算法就可以了,需要的话可以在加密数据后使用自己的加密算法再进行加密,当然前提是自己不怕麻烦啦。