例如:
<form action="?UserID=1" method="POST">
   权限设置:
    <select name="Rule">
        <option value="1">管理员</option>
         <option value="2" selected="selected">普通用户</option>
    </select>
    <input type="submit" value="修改" />
</form>
ASP可以通过Request.Form("Rule")来限制仅取Form中值,这样就不会造成安全问题。但是jsp的request.getParameter("Rule")是不区分GET和POST的,这就造成了一个很大的安全问题了:只要访问.....jsp?UserID=1&Rule=1这样的网址,就能直接将用户设置为管理员。假设我是管理员,从后台进入论坛,遇到一张图片,地址为.......jsp?UserID=10&Rule=1,那UserID为10的用户岂不会直接被设置成管理员了吗?难道JSP会这么不安全?有没有GET和 POST安全取值的方法?

解决方案 »

  1.   

    根据REQUEST_METHOD来确定是否有POST操作?这倒是个安全补救措施。
    但我觉得JSP如果没有GET和POST的取值区分方法,本身是一个很大的安全漏洞。
      

  2.   

    存在你说的这种漏洞,但是最好还是不要用get方法来传送数据了。
    解决的方法好多了。比如hidden表单就是很简单的了
      

  3.   

    那么说,JSP很不安全了。我倒是不想用GET来传送数据,但是有用户恶意从URL传递表单值我也没办法。
      

  4.   

    yongpost 可以在form里面设置隐藏域  用作你的传值
      

  5.   


    1.一般jsp作为显示层是要和逻辑层分开的,处理逻辑你可以用servlet  servlet里有doGet doPost方法
    2.用session来标记用户才是比较好的办法。你现在这种做法,就算是用post,黑客只要写个程序发个post方法的http请求,你就悲剧了
      

  6.   

    但是被黑的几率大大降低了。至少不会出现看帖子的时候无缘无故把别人提权了得问题。至于黑客模拟的POST,很难通过身份认证了。
      

  7.   

    至于黑客模拟的POST,很难通过身份认证了。
    ===========================================
    以你现在设计的情况,我想知道黑客模拟post怎么就难于通过身份认证了
      

  8.   

    建立一个拦截器,获取提交的request的 METHOD,根据这个值与传入的权限标示进行判断,不合要求直接返回错误提示
      

  9.   

    ServletActionContext.getRequest().getMethod();判断get,post
      

  10.   

    JSP本来就不是单独使用的。
    建议看看Struts和Servlet的教程,然后再来讨论这个问题
      

  11.   

    黑客如果需要提权,首先就需要有管理员权限才能够成功更改用户权限。如果采用POST攻击,这个攻击怎么让网站管理员去触发就是一个大难题,而GET攻击很简单,只需要在论坛帖张图片,管理员不小心打开帖子,提权就完成了。
      

  12.   

    有人说可以通过servlet的doGet和doPost来处理。但实际上,不管doGet和doPost,都是采用request.getParameter来获取参数值,因此,doPost也就相当于加了一个判断,REQUST_METHOD是否为POST而已。实际上,request.getPrameter("ID"),你仍然看不出这个ID是存在URL中,还是post的body中。
      

  13.   

    一般像权限这种东西最好不要明码出现,要不用hidden表单提交,要不就用session进行获取,这样比较安全
      

  14.   


    jsp要被编译成servlet,是放到service方法里面的,因此,jsp本身是不区分get还是post的。
    如果想要严格控制是get还是post,需要用servlet。现在流行的SpringMVC之类的框架都是提供@Get,@Post之类的注解,这样就一目了然了。
      

  15.   

    想到了一种好办法
    String query = request.getQueryString();
    boolean flag = query.contains("Rule=");
    if (flag) {
        //怀疑是黑客行为,用日志记录
    }
    else {
       request.getParameter("Rule");
    }其中
    request.getQueryString();
    是用来获得http url 中问号后面的部分
      

  16.   

    还是自己写程序,分析request.getInputStream()或request.getReader(),这样会比较安全!