今天同事给我提了一个问题:
在删除用户的时候,直接用URL传递action的方法名和需要删除数据的id,明码传输的形式他认为这样及其不安全,因为其他用户在地址栏输入相应的URL就可以删除其他用户的数据了。
但是我测试的时候发现由于使用的是struts2,在提交URL的时候地址栏并未改变,也就是说用户看不见系统提交的URL。
这是我struts2的配置:<action name="delRoles" class="com.aide.oa.systemManager.action.RoleManagerAction" method="delRoles">
    <result name="rolelist" type="redirectAction">FindRoleList.action</result>
</action>这样的话,只有有源代码的人员才可能知道提交的URL(关键是真的不显示还是太快了,我看不清?)。
而且由于有权限,这种形式只有合法登录的情况才能使用,而所有合法登录用户的操作都将被记录下来。请问各位前辈再实现类似情况的时候是怎么控制其安全性的呢?像我这种情况是不是可取呢?

解决方案 »

  1.   

    不是有权限控制么?光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。
      

  2.   

    有权限控制 记录操作人员动作就行了
    即使post 传值 只要人家想拦截 也是能看到的
    只要他的session是合法的 谁操作谁负责呗 日志为证
      

  3.   

    这和action有什么关系呢,假设action只打印了一句话,然后就return "rolelist"了
      

  4.   

    页面上的“删除”是一个链接<a>,能用post吗,post不是在form提交时设定的吗
      

  5.   


    如果只打印一句然后就return,那么他的地址是会变的,如果在return前处理一下,那地址是会刷一下又回到原来的地址。
      

  6.   

    把<a>里的数据的ID加密,提交到Action后解密就OK了。
      

  7.   

    <a href=“JAVASCRIPT:SUM(userId)”>
    href中调用JS JS中提交form啊例如
    <from id="thisform">
       <a href=“JAVASCRIPT:SUM(userId)”>
    </form>
    <form id="sumform">
    <input type="hidden" name="userId" id="userId" />
    </form>function SUM(userId){
    sumform.userId.value = userId;
    sumform.submit();
    }这样你就可以提交另一个form了
      

  8.   

    当然  你这个用户删除  一半都应该是管理员权限的人员删除   到后台的时候  最好判断下  session中当前登录的这个用户  是否有删除这个的权限   
      

  9.   

    贴一下action:/**
     * 删除角色
     * @return
     */
    public String delRoles() {

    this.log.info("delRoles操作类型:");

    String[] ids = request.getParameterValues("choose");
    for (String id : ids) {
    Role oaRole = (Role) roleBO.findbyid(Role.class, id);
    roleBO.delRole(oaRole, oaRole.getRoleId());
    }

    return "rolelist";

    }
      

  10.   

    同事说使用AJAX进行删除,这样有意义吗
      

  11.   

    AJAX的请求不能拦截嘛 谁说AJAX就安全了
    你只需要执行合法session用户的操作就行了 
      

  12.   


    用AJAX删除????  AJAX一半都是直接调用后台方法了。   这个一半都会把权限系统给跳过去,  建议你还是别用  最好就是加密  用post方式提交  后台判断权限后再删除   虽然听起来麻烦  但是这个安全机制基本得到保障  
      

  13.   

    看到这  忍不住说句话   JSP这东西   安全性实在是太薄弱了
      

  14.   

    struts2的这个配置是什么意思呢,是redirect还是dispatcher呢?<result name="rolelist" type="redirectAction">FindRoleList.action</result>
      

  15.   


    能用啊。<a href="javascript:submitForm()"></a>
    function submitForm()
    {
       form.submit();
    }
      

  16.   

    建议大家出更好的注意。jsp相应action form时确实是明码啊
      

  17.   

    自己写一个加密,比如删除的时候你弄一个超链接,
    href="del.jsp?id=8101d87612"    ‘此id为加密过的,原值为1,算法自己写,也可以找网上的自己改下。
    这样即使他抓包,也只能抓到这一个的包,如果攻击者想要操作其他的id的话,他必须要先有算法把id算成加密后的,加密后的id传到服务器之后,在用相应的密钥进行解密,就可以得到原始的数字id,在配合权限控制,这样就可以尽量防止非法删除了。我随便找了个算法,这个就是解密上面密钥的。<script language=javascript>
    function decrypt(str, pwd) {var prand = "";for(var i=0; i<pwd.length; i++) {prand += pwd.charCodeAt(i).toString();}var sPos = Math.floor(prand.length / 5);var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));var incr = Math.round(pwd.length / 2);var modu = Math.pow(2, 31) - 1;var salt = parseInt(str.substring(str.length - 8, str.length), 16);str = str.substring(0, str.length - 8);prand += salt;while(prand.length > 10) {prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();}prand = (mult * prand + incr) % modu;var enc_chr = "";var enc_str = "";for(var i=0; i<str.length; i+=2) {enc_chr = parseInt(parseInt(str.substring(i, i+2), 16) ^ Math.floor((prand / modu) * 255));enc_str += String.fromCharCode(enc_chr);prand = (mult * prand + incr) % modu;}return enc_str;}
    document.write(decrypt("8101d87612","123456"))
    </script>
      

  18.   

    用post的提交方式也是一个好方法,或者加密url。
    lz所页面地址不会改变,用户就看不到,其实这是有问题的。
    lz用过一些页面请求监控的工具没?
    像httpwatch和firefox上一个插件“httpfox”都可以监控到你的所有页面url请求,
    你用明文的方式一下很容易被捕捉到了,要破坏你的数据库用户信息那就太简单了。
    就算你记录了所有账户的操作,但是万一某个账户的密码被他人窃取,来进行破坏,那就悲剧了,我觉得是不可取的。
      

  19.   

    解决方案:1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
    2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制如果系统没有权限的约束,那么这个系统就是不能使用的。
      

  20.   

    用连接传递数据 来删除,在URL 地址下会出现地址咯,这样也很不安全
      建议传递数据的时候用脚本去传递数据值,这样会比较的安全些!