在删除用户的时候,直接用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发出来呀。
光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。
#2
用post提交
#3
有权限控制 记录操作人员动作就行了
即使post 传值 只要人家想拦截 也是能看到的
只要他的session是合法的 谁操作谁负责呗 日志为证
即使post 传值 只要人家想拦截 也是能看到的
只要他的session是合法的 谁操作谁负责呗 日志为证
#4
这和action有什么关系呢,假设action只打印了一句话,然后就return "rolelist"了
#5
页面上的“删除”是一个链接<a>,能用post吗,post不是在form提交时设定的吗
#6
如果只打印一句然后就return,那么他的地址是会变的,如果在return前处理一下,那地址是会刷一下又回到原来的地址。
#7
把<a>里的数据的ID加密,提交到Action后解密就OK了。
#8
<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
AJAX的请求不能拦截嘛 谁说AJAX就安全了
你只需要执行合法session用户的操作就行了
#14
用AJAX删除???? AJAX一半都是直接调用后台方法了。。。。 这个一半都会把权限系统给跳过去, 建议你还是别用 最好就是加密 用post方式提交 后台判断权限后再删除 虽然听起来麻烦 但是这个安全机制基本得到保障
#15
看到这 忍不住说句话 JSP这东西 安全性实在是太薄弱了。。。
#16
有道理!
#17
struts2的这个配置是什么意思呢,是redirect还是dispatcher呢?
<result name="rolelist" type="redirectAction">FindRoleList.action</result>
#18
能用啊。<a href="javascript:submitForm()"></a>
function submitForm()
{
form.submit();
}
#19
建议大家出更好的注意。jsp相应action form时确实是明码啊
#20
自己写一个加密,比如删除的时候你弄一个超链接,
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
安全性都是根据你自己的需要去加的,就比如同样的电脑,装了杀毒的和没装杀毒的安全性肯定不一样,你不能只靠电脑本身去防护,他能做到的肯定是有限的,病毒永远是走在杀毒之前的。
#22
用post的提交方式也是一个好方法,或者加密url。
lz所页面地址不会改变,用户就看不到,其实这是有问题的。
lz用过一些页面请求监控的工具没?
像httpwatch和firefox上一个插件“httpfox”都可以监控到你的所有页面url请求,
你用明文的方式一下很容易被捕捉到了,要破坏你的数据库用户信息那就太简单了。
就算你记录了所有账户的操作,但是万一某个账户的密码被他人窃取,来进行破坏,那就悲剧了,我觉得是不可取的。
lz所页面地址不会改变,用户就看不到,其实这是有问题的。
lz用过一些页面请求监控的工具没?
像httpwatch和firefox上一个插件“httpfox”都可以监控到你的所有页面url请求,
你用明文的方式一下很容易被捕捉到了,要破坏你的数据库用户信息那就太简单了。
就算你记录了所有账户的操作,但是万一某个账户的密码被他人窃取,来进行破坏,那就悲剧了,我觉得是不可取的。
#23
解决方案:
1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制
如果系统没有权限的约束,那么这个系统就是不能使用的。
1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制
如果系统没有权限的约束,那么这个系统就是不能使用的。
#24
权限控制是有的,只不过会有两个用户同时拥有删除这个权限,而他们看到的资源却是不同的,那么这就有可能恶性删除其他用户的资源了
#25
用连接传递数据 来删除,在URL 地址下会出现地址咯,这样也很不安全
建议传递数据的时候用脚本去传递数据值,这样会比较的安全些!
建议传递数据的时候用脚本去传递数据值,这样会比较的安全些!
#26
#1
不是有权限控制么?
光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。
光发个配置是看不出跳得太快还是不改变URL的,你得把处理的action发出来呀。
#2
用post提交
#3
有权限控制 记录操作人员动作就行了
即使post 传值 只要人家想拦截 也是能看到的
只要他的session是合法的 谁操作谁负责呗 日志为证
即使post 传值 只要人家想拦截 也是能看到的
只要他的session是合法的 谁操作谁负责呗 日志为证
#4
这和action有什么关系呢,假设action只打印了一句话,然后就return "rolelist"了
#5
页面上的“删除”是一个链接<a>,能用post吗,post不是在form提交时设定的吗
#6
如果只打印一句然后就return,那么他的地址是会变的,如果在return前处理一下,那地址是会刷一下又回到原来的地址。
#7
把<a>里的数据的ID加密,提交到Action后解密就OK了。
#8
<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
AJAX的请求不能拦截嘛 谁说AJAX就安全了
你只需要执行合法session用户的操作就行了
#14
用AJAX删除???? AJAX一半都是直接调用后台方法了。。。。 这个一半都会把权限系统给跳过去, 建议你还是别用 最好就是加密 用post方式提交 后台判断权限后再删除 虽然听起来麻烦 但是这个安全机制基本得到保障
#15
看到这 忍不住说句话 JSP这东西 安全性实在是太薄弱了。。。
#16
有道理!
#17
struts2的这个配置是什么意思呢,是redirect还是dispatcher呢?
<result name="rolelist" type="redirectAction">FindRoleList.action</result>
#18
能用啊。<a href="javascript:submitForm()"></a>
function submitForm()
{
form.submit();
}
#19
建议大家出更好的注意。jsp相应action form时确实是明码啊
#20
自己写一个加密,比如删除的时候你弄一个超链接,
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
安全性都是根据你自己的需要去加的,就比如同样的电脑,装了杀毒的和没装杀毒的安全性肯定不一样,你不能只靠电脑本身去防护,他能做到的肯定是有限的,病毒永远是走在杀毒之前的。
#22
用post的提交方式也是一个好方法,或者加密url。
lz所页面地址不会改变,用户就看不到,其实这是有问题的。
lz用过一些页面请求监控的工具没?
像httpwatch和firefox上一个插件“httpfox”都可以监控到你的所有页面url请求,
你用明文的方式一下很容易被捕捉到了,要破坏你的数据库用户信息那就太简单了。
就算你记录了所有账户的操作,但是万一某个账户的密码被他人窃取,来进行破坏,那就悲剧了,我觉得是不可取的。
lz所页面地址不会改变,用户就看不到,其实这是有问题的。
lz用过一些页面请求监控的工具没?
像httpwatch和firefox上一个插件“httpfox”都可以监控到你的所有页面url请求,
你用明文的方式一下很容易被捕捉到了,要破坏你的数据库用户信息那就太简单了。
就算你记录了所有账户的操作,但是万一某个账户的密码被他人窃取,来进行破坏,那就悲剧了,我觉得是不可取的。
#23
解决方案:
1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制
如果系统没有权限的约束,那么这个系统就是不能使用的。
1:删除是需要有权限控制的,就算知道了 ID 也无法进行删除
2:不知道数字作为 ID,而使用 UUID 作为 ID,再加上权限控制
如果系统没有权限的约束,那么这个系统就是不能使用的。
#24
权限控制是有的,只不过会有两个用户同时拥有删除这个权限,而他们看到的资源却是不同的,那么这就有可能恶性删除其他用户的资源了
#25
用连接传递数据 来删除,在URL 地址下会出现地址咯,这样也很不安全
建议传递数据的时候用脚本去传递数据值,这样会比较的安全些!
建议传递数据的时候用脚本去传递数据值,这样会比较的安全些!