在Action中查询出SQL SERVER表的数据,返回一个list。怎么在JSP页面中使用Struts标签,显示出表中的内容?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Action中查询出SQL SERVER表的数据,返回一个list。怎么在JSP页面中使用Struts标签,显示出表中的内容?相关的知识,希望对你有一定的参考价值。
给你截取一小段,全文到上面网址自己看吧。Struts2安全缺陷
可以看到struts2在数据流向方面,有两个重点,一个是进入(in),一个是输出(out)。而我在做漏洞挖掘的思路,也是跟着这个数据的流 程,开始分析的,下面我们就开始让数据进入。
Action属性默认值可以被覆盖缺陷:
在日常的java项目中,我们经常会遇到保存一个新的对象(比如注册一个用户),然后给这个对象赋予一些用户提交上来的属性值,在这里,只需要定义 一个对象类:
public class User
private Long id=0l;
private String name;
private String pass;
private Integer type=1;
。。。下面的get和set方法代码略
定义后,在action中,添加一个属性
User reguser;
用户注册的页面代码如下:
<form XXXXXXX>
<input name="reguser.name">
当用户提交这个form到action中后,struts2会负责自动映射reguser.name的值到reguser的相关属性(name) 中,所以在execute这个方法中,就可以使用reguser.getName()拿到用户提交的reguser.name的值。所以我们下面的代码就 很简单了:
public String execute()
add(user);
add方法,更简单了,因为我们项目中集成了hibernate,这个框架自动映射user类中的各个属性,自动组成insert语句。我们只要在 add中调用session.save(user);就可以保存用户到数据库中。
前文提到那么多“简单”两个字,难道这些过程都是安全的而他给我们仅仅带来了方便么?
struts2只负责映射所有对象,他提供了form验证,也只能验证form中属性值的内容,比如email格式等,并不能约束用户提交其他属性 上来,于是这就变成了十分危险的功能。
当User中有个属性type,代表User是否管理员时(1为普通用户,2为管理员),麻烦来了,攻击者在原来的注册表单中,新加入一个 input,叫做
<input name="reguser.type">
然后输入值是2,把这个值一起交给action。在这个流程中,这个值,当然也会被自动带到数据库中,向下处理的逻辑中,这个用户,就已经变成管理 员了。
当你看到了一个struts2或者webwork的应用,可以尝试使用属性攻击,修改当前表单,里面有所有你猜测到的属性,一并提交上来,就可能会 影响整个逻辑,达到攻击目的。文中仅仅是一个例子,事实上,在数据传递的过程中,可以任意覆盖数据的默认值,本来就是一个危险的缺陷,而struts2和 webwork这两个框架仅仅看到了它带来的好处,忽略了这方面基于安全性的考虑,仅仅关注了用户提交数据的正确性。对比在没有struts2这个功能的 时候,我们却需要在action中一个一个的把需要的变量,从用户提交的request中解出来,一个一个处理,不可能出现这种安全问题。现在它包装了这 个过程,自以为很方面,却出了严重问题。
Action中的方法被暴力猜解缺陷
前文提到,有一种方法可以让用户访问action时,不访问默认的execute方法,而是直接访问其他action中的方法,条件是在 action中,写一个public的方法。开发人员如果需要做一个登陆后,展示所有用户列表的功能,而他的一个“解耦合”的开发习惯,将在这里导致安全 缺陷。
定义一个如下的action
public class Userlogin extends ActionSupport
private String uname="";
private String upwd;
private List list;
//getter and setter 方法略
public String login()
if(uname!=null&&upwd!=null&&uname.equals("kxlzx")&&upwd.equals("pass"))
//if login success
return list();
return false;
public String list()
list.add("kxlzx");list.add("kxlzx1");list.add("kxlzx2");list.add("kxlzx3");
return "list";
Userlogin中,因为list这个功能(显示所有用户列表),其实是一个通用的功能,很容易被其他地方调用,所以开发人员把它单独写成了一个 方法。
当用户登陆的时候,打开
!login.action
来到了用户的登陆页面,可以看到,只有用户输入正确的用户名和密码,才能最终调用list()方法,显示结果。
但是struts2把所有public的方法都暴露了出去,导致现在用户输入了
!list.action
用户访问这个链接后,struts2调用list方法,然后返回结果给用户,所以没有登陆,就显示了所有用户信息,
直接绕过了login中的登陆验证。
在没有struts2的时候,我们要在servlet的doget或者dopost方法中,写if判断等代码,才能让用户调用其他servlet中 的方法,现在看来其实这也是一种保护措施。而现在struts2为了方便开发,把所有的public方法统一映射了出去,导致开发把一个经常使用的功能, 习惯写成一个public的方法,现在居然成了严重漏洞。
struts2的action属性设计缺陷
再回头看看我们在action中的属性定义,你会发现,现在他们都成了漏洞,因为struts2规定属性的get和set方法,都必须是 public的。
那么我们定义了
private String name;
public String getName()
return name;
public void setName(String name)
this.name = name;
这段代码的时候,实际上,是写了两个public的方法。
那这两个表面上没有任何实质含义的方法,会有什么安全隐患呢?
这需要和前文联系起来,前文提到,我们在struts.xml文件中,定义如下:
<action name="user">
<result name="success">user/userlist.jsp</result>
<result name="addUser">user/addUser.jsp</result>
<result name="added">user/added.jsp</result>
<result name="false">user/false.jsp</result>
</action>
这段代码含义是,UserAction中,任何一个方法执行后,如果返回的是success这个字符串, 就会把user/userlist.jsp返回给用户。
如果返回是addUser,就会把user/addUser.jsp返回给用户。
现在UserAction是管理用户的页面,在我们的系统中,有普通管理员和超级管理员,他们的区别是普通管理员可以查看用户,但是不能添加一个用户。
所以,我们在UserAction中,写了
public String addUser()
if(true) //事实上这里是个超级管理员的判断,我偷懒了。
return "false";
参考技术A 把要展示的信息定义为一个存储对象(DTO对象)把DTO放入List 。在Action中 request.setAttribute("list",List);
在jsp中就可以用struts标签接收了。先用<logic:iterator> 循环 再用<bean:write > 把数据打印了。 参考技术B 你在action中如果有 public String list()throws Exception
UserDaoImp ud=new UserDaoImp();
List<User> list=ud.getAll();
request.put("list",list);
return "list";
这种的话,在页面中可以这样写,
<s:iterator value="#request.list">
<tr>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td><s:property value="password"/></td>
</tr>
</s:iterator>
就可以了.本回答被提问者采纳
sql如何查询出一张表的的某个字段数据更换成另一张表的字段数据
新手求指导! 用游标查出sal数据再根据job数据内容对应更换或赋值另一张sal表数据。
参考技术A UPDATE 表1SET sal=表2.sal
FROM 表2
WHERE 表1.job=表2.job追问
mysql 怎么写
本回答被提问者和网友采纳以上是关于在Action中查询出SQL SERVER表的数据,返回一个list。怎么在JSP页面中使用Struts标签,显示出表中的内容?的主要内容,如果未能解决你的问题,请参考以下文章
sql server2008如何查询在指定的数据库中所有的表名和每个表的字段名及字段类型
微软的sql2005中如何用SQL语句查询出将一个表的字段的说明