URL安全性问题

时间:2022-09-23 13:10:14
今天同事给我提了一个问题:
在删除用户的时候,直接用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(关键是真的不显示还是太快了,我看不清?)。
而且由于有权限,这种形式只有合法登录的情况才能使用,而所有合法登录用户的操作都将被记录下来。

请问各位前辈再实现类似情况的时候是怎么控制其安全性的呢?像我这种情况是不是可取呢?

26 个解决方案

#1


不是有权限控制么?

光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。

#2


用post提交

#3


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

#4


引用 1 楼 xieruilin 的回复:
不是有权限控制么?

光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。

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

#5


引用 2 楼 liujie616 的回复:
用post提交

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

#6


引用 4 楼 drykilllogic 的回复:
引用 1 楼 xieruilin 的回复:

不是有权限控制么?

光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。

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


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

#7


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

#8


引用 5 楼 drykilllogic 的回复:
引用 2 楼 liujie616 的回复:

用post提交

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

<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了


#9


当然  你后台肯定有权限系统判断撒  或者拦截器什么的   防止别人写静态页面进行强制性提交   你也可以用MD5等都加密  什么的  或者自己写加密方式这解密方式  提高安全性啊

#10


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

#11


贴一下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";

}

#12


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

#13


引用 12 楼 drykilllogic 的回复:
同事说使用AJAX进行删除,这样有意义吗

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

#14


引用 12 楼 drykilllogic 的回复:
同事说使用AJAX进行删除,这样有意义吗


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

#15


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

#16


引用 14 楼 cjg520jie 的回复:
引用 12 楼 drykilllogic 的回复:
同事说使用AJAX进行删除,这样有意义吗


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

有道理!

#17


struts2的这个配置是什么意思呢,是redirect还是dispatcher呢?

<result name="rolelist" type="redirectAction">FindRoleList.action</result>

#18


引用 5 楼 drykilllogic 的回复:
引用 2 楼 liujie616 的回复:

用post提交

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


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

#19


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

#20


引用 19 楼 wjf11547 的回复:
建议大家出更好的注意。jsp相应action form时确实是明码啊

自己写一个加密,比如删除的时候你弄一个超链接,
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>

#21


引用 15 楼 cjg520jie 的回复:
看到这  忍不住说句话   JSP这东西   安全性实在是太薄弱了。。。

安全性都是根据你自己的需要去加的,就比如同样的电脑,装了杀毒的和没装杀毒的安全性肯定不一样,你不能只靠电脑本身去防护,他能做到的肯定是有限的,病毒永远是走在杀毒之前的。

#22


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

#23


解决方案:

1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制

如果系统没有权限的约束,那么这个系统就是不能使用的。

#24


引用 23 楼 bao110908 的回复:
解决方案:

1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制

如果系统没有权限的约束,那么这个系统就是不能使用的。

权限控制是有的,只不过会有两个用户同时拥有删除这个权限,而他们看到的资源却是不同的,那么这就有可能恶性删除其他用户的资源了

#25


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

#26


该回复于2010-12-14 14:31:41被版主删除

#1


不是有权限控制么?

光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。

#2


用post提交

#3


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

#4


引用 1 楼 xieruilin 的回复:
不是有权限控制么?

光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。

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

#5


引用 2 楼 liujie616 的回复:
用post提交

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

#6


引用 4 楼 drykilllogic 的回复:
引用 1 楼 xieruilin 的回复:

不是有权限控制么?

光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。

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


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

#7


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

#8


引用 5 楼 drykilllogic 的回复:
引用 2 楼 liujie616 的回复:

用post提交

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

<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了


#9


当然  你后台肯定有权限系统判断撒  或者拦截器什么的   防止别人写静态页面进行强制性提交   你也可以用MD5等都加密  什么的  或者自己写加密方式这解密方式  提高安全性啊

#10


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

#11


贴一下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";

}

#12


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

#13


引用 12 楼 drykilllogic 的回复:
同事说使用AJAX进行删除,这样有意义吗

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

#14


引用 12 楼 drykilllogic 的回复:
同事说使用AJAX进行删除,这样有意义吗


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

#15


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

#16


引用 14 楼 cjg520jie 的回复:
引用 12 楼 drykilllogic 的回复:
同事说使用AJAX进行删除,这样有意义吗


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

有道理!

#17


struts2的这个配置是什么意思呢,是redirect还是dispatcher呢?

<result name="rolelist" type="redirectAction">FindRoleList.action</result>

#18


引用 5 楼 drykilllogic 的回复:
引用 2 楼 liujie616 的回复:

用post提交

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


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

#19


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

#20


引用 19 楼 wjf11547 的回复:
建议大家出更好的注意。jsp相应action form时确实是明码啊

自己写一个加密,比如删除的时候你弄一个超链接,
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>

#21


引用 15 楼 cjg520jie 的回复:
看到这  忍不住说句话   JSP这东西   安全性实在是太薄弱了。。。

安全性都是根据你自己的需要去加的,就比如同样的电脑,装了杀毒的和没装杀毒的安全性肯定不一样,你不能只靠电脑本身去防护,他能做到的肯定是有限的,病毒永远是走在杀毒之前的。

#22


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

#23


解决方案:

1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制

如果系统没有权限的约束,那么这个系统就是不能使用的。

#24


引用 23 楼 bao110908 的回复:
解决方案:

1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制

如果系统没有权限的约束,那么这个系统就是不能使用的。

权限控制是有的,只不过会有两个用户同时拥有删除这个权限,而他们看到的资源却是不同的,那么这就有可能恶性删除其他用户的资源了

#25


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

#26


该回复于2010-12-14 14:31:41被版主删除