从struts 1.x升级到 struts 2(三) OGNL

从struts 1.x升级到 struts 2(一) 第一个程序 Struts 2与Struts 1.x间的差比很大,从用户体验而言,基本上可以认为是两个完全不同的系统。当然,出于兼容性,原先的struts 1.x 框架下的项目仍然可以在struts 2 下运行。struts 2的MVC框架源于WebWork,有关struts 2与WebWork的关系,感兴趣的人可以去搜查相关资料,这里不再多说。struts 2也出来很长时间了,但仍有很多人仍然在使用strut 阅读详情

OGNL全称为Object-Graph Navigation Language,是一种表达式语言(EL)。

EL的支持者认为,在JSP页面中应尽可能地避免 <% %> 这样的标记,而代之以Tag,以使页面更简洁,并体现页面与后台代码分离的设计原则。对此我持保留意见,因为我并不认为使用Tag后的页面的可读性要高于使用<% %>。

Struts 2支持如下几种EL:

  • OGNL(Object-Graph Navigation Language): 可以方便地操作对象属性的开源表达式语言
  • JSTL(JSP Standard Tag Library): JSP 2.0集成的标准的表达式语言
  • Groovy: 基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些新特性
  • Velocity: 严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,据说其性能要比JSP好

Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:

  • 支持对象方法调用,如xxx.doSomeSpecial();
  • 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如: @java.lang.String@format('foo %s', 'bar')或 @tutorial.MyConstant@APP_NAME;
  • 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
  • 访问OGNL上下文(OGNL context)和ActionContext;
  • 操作集合对象。

OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等。大家经常遇到的问题是#、%和$这三个符号的使用。下面我讲述这个问题:

4.1 “#”的用途

访问OGNL上下文和Action上下文

#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

  • parameters:包含当前HTTP请求参数的Map,#parameters.id[0]作用相当于request.getParameter("id")
  • request:包含当前HttpServletRequest的属性(attribute)的Map,#request.userName相当于request.getAttribute("userName")
  • session:包含当前HttpSession的属性(attribute)的Ma, #session.userName相当于session.getAttribute("userName")
  • application:包含当前应用的ServletContext的属性(attribute)的Map,#application.userName相当于application.getAttribute("userName")
  • attr:用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
过滤和投影(projecting)集合

如books.{?#this.price<100}

构造Map

如#{'foo1':'bar1', 'foo2':'bar2'}

在此我演示一下这三种用途:

Book.java

这是一个Bean,用于描述一本书的信息

package example;

public class Book {
private String isbn;
private String title;
private double price;

public Book() {
}

public Book(String isbn, String title, double price) {
this.isbn = isbn;
this.title = title;
this.price = price;
}

public String getIsbn() {
return isbn;
}

public void setIsbn(String isbn) {
this.isbn = isbn;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}
}

BookDao.java

一个伪DAO类

package example;

import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class BookDao
{
private static final BookDao instance;
private static final ConcurrentMap<String, Book> data;

static {
instance = new BookDao();
data = new ConcurrentHashMap<String, Book>();
data.put("978-0735619678", new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
data.put("978-0596007867", new Book("978-0596007867", "The Art of Project Management", 35.96));
data.put("978-0201633610", new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
data.put("978-0596527341", new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
data.put("978-0735605350", new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));
}

private BookDao() {}

public static BookDao getInstance() {
return instance;
}

public Collection<Book> getBooks() {
return data.values();
}

public Book getBook(String isbn) {
return data.get(isbn);
}

public void storeBook(Book book) {
data.put(book.getIsbn(), book);
}

public void removeBook(String isbn) {
data.remove(isbn);
}

public void removeBooks(String[] isbns) {
for(String isbn : isbns) {
data.remove(isbn);
}
}
}

OgnlAction.java

演示OGNL的Servlet类

package example;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware {
private static final long serialVersionUID = 1L;

private HttpServletRequest request;
private Map<String, String> session;
private ServletContext application;
private List<Book> books;

public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

@SuppressWarnings("unchecked")
public void setSession(Map session) {
this.session = session;
}

public void setServletContext(ServletContext application) {
this.application = application;
}

public List<Book> getBooks() {
return books;
}

@Override
public String execute() {
request.setAttribute("userName", "Max From request");
session.put("userName", "Max From session");
application.setAttribute("userName", "Max From application");

books = new LinkedList<Book>();
books.add(new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
books.add(new Book("978-0596007867", "The Art of Project Management", 35.96));
books.add(new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
books.add(new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
books.add(new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));

return SUCCESS;
}
}

Ognl.jsp

演示OGNL的JSP

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Struts OGNL Demo</title>
</head>
<body>
<h3>访问OGNL上下文和Action上下文</h3>
<p>parameters: <s:property value="#parameters.userName" /></p>
<p>request.userName: <s:property value="#request.userName" /></p>
<p>session.userName: <s:property value="#session.userName" /></p>
<p>application.userName: <s:property value="#application.userName" /></p>
<p>attr.userName: <s:property value="#attr.userName" /></p>
<hr />
<h3>用于过滤和投影(projecting)集合</h3>
<p>Books more than $35</p>
<ul>
<s:iterator value="books.{?#this.price > 35}">
<li><s:property value="title" /> - ___FCKpd___3lt;s:property value="price" /></li>
</s:iterator>
</ul>
<p>The price of "Code Complete, Second Edition" is: <s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/></p>
<hr />
<h3>构造Map</h3>
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>
</body>
</html>

example.xml

struts2 的MVC配置文件

<action name="Ognl" class="example.OgnlAction">
<result>/Ognl.jsp</result>
</action>

4.2 %的用法

“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:

<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>

刷新页面,显示以下内容

%的用途

#foobar['foo1']

bar1

4.3 $的用法

“$”有两个主要的用途:

  1. 用于在国际化资源文件中,引用OGNL表达式
  2. Struts 2配置文件中,引用OGNL表达式,如
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
Struts2漏洞全解析:从OGNL注入到RCE实战与防御 在Java Web应用开发中,框架安全是保障系统稳定性的核心议题。OGNL(Object-Graph Navigation Language)作为一种表达式语言,其设计初衷是简化对象图的导航与操作,但在特定框架实现中,若对用户输入处理不当,可能导致表达式注入漏洞。其原理在于攻击者通过构造恶意参数,使框架在解析过程中将输入误认为OGNL表达式执行,从而绕过安全沙箱,实现权限提升。这类漏洞的技术价值在于揭示了“框架级”安全问题的共性模式,即参数解析链与执行上下文的耦合风险。在应用场景上,Struts2作为历史悠 阅读详情

相关推荐

Apache Struts2 S2-015漏洞复现与OGNL注入原理深度剖析

OGNL表达式注入是Java Web安全领域一种经典的远程代码执行漏洞类型。其核心原理在于,当应用程序框架(如Struts2)将未经验证的用户输入直接传递给强大的OGNL表达式引擎进行解析时,攻击者可以注入恶意表达式,从而操纵服务器端逻辑,甚至执行任意系统命令。这项技术的安全价值在于揭示了框架默认信任机制下的高风险攻击面,对于理解Java应用安全模型至关重要。其典型应用场景广泛存在于基于Struts2等MVC框架构建的Web应用中,常被用于渗透测试和红队评估,以验证系统的安全性。本文以Apache Stru

weixin_30745553的博客 714

struts1.x 升级到struts2的几点问题

最近将struts1.x+spring2+hibernate3 的环境下的struts1.x升级到 struts2,有些小问题,我将把问题记录下来 1, s:textfield 标签与struts1.x的标签差别大, 运行中生成html脚本时,s 标签会生成额外的 tr, td 标签, 需要添加theme=simple属性,才可以保持原来的页面布局 2, org.springframe...

thinkact的专栏 849

Struts2高危漏洞S2-046与S2-052:从OGNL注入到反序列化的RCE实战剖析

远程代码执行(RCE)是Web安全领域危害性极高的漏洞类型,其核心原理在于攻击者通过构造恶意输入,诱使服务器将数据错误地解析为可执行代码。在Java Web开发中,OGNL表达式注入和反序列化漏洞是两类典型的RCE成因。OGNL作为Struts2框架强大的表达式语言,若对用户输入过滤不当,可导致任意代码执行;而反序列化漏洞则源于将不受信的序列化数据还原为对象时,触发了危险的利用链。这两种技术常被用于攻击框架层面的缺陷,对应用安全构成严重威胁。本文聚焦于Struts2框架中两个经典的RCE漏洞——S2-046

weixin_33857679的博客 326

struts1.2升级struts2.5.30问题汇总

struts1.2升级struts2.5.30问题汇总

qq3892997的博客 2443

Apache Struts2 OGNL注入漏洞分析与防护实践

OGNL表达式注入是Java Web开发中常见的安全漏洞类型,其原理在于框架对用户输入数据过滤不严,导致恶意表达式被解析执行。这种漏洞常出现在MVC框架的数据绑定环节,攻击者通过构造特殊参数实现远程代码执行(RCE),对系统安全构成严重威胁。以Apache Struts2框架为例,其OGNL引擎曾多次曝出高危漏洞如S2-045,攻击者可利用Content-Type头注入恶意代码。防护方案需从输入验证、框架配置和运行时监控三个层面构建防御体系,包括升级官方补丁、过滤特殊字符、限制危险类加载等。企业级安全防护还

weixin_29325515的博客 297

Struts2 S2-061漏洞深度剖析:OGNL沙盒绕过与实战利用

OGNL表达式注入是Java Web安全领域一个经典且高危的漏洞类型,其原理在于攻击者能够将恶意表达式注入到服务器端并执行,从而突破应用逻辑,实现远程代码执行。这种技术的核心价值在于它绕过了常规的输入过滤,直接利用了应用框架的动态求值能力。在Struts2等流行框架中,OGNL被广泛用于数据绑定和视图渲染,一旦处理不当,便成为严重的攻击面。S2-061漏洞正是这一场景的典型体现,它通过利用Tomcat的InstanceManager和Commons Collections的BeanMap等合法API,巧妙地

weixin_30681121的博客 342

Struts1项目转成Struts2项目步奏

注意:要转成Struts2必须对struts2的配置以及流程要了解,不了解的话我只能说还是去了解struts2后再转成struts2吧。 1、先备份一份,不要没转成功项目搞蹦了都回不来了。 2、导入Struts2核心包以及其他依赖包(最好用myeclipse的library,勾选需要的,保证包不缺少以及不产生包冲突)。 3、按照Struts2的配置方式去配置struts.xml。 4、更改

敲码农的小代码   ; 17万+

struts1和struts2的增删改查

本人写的,希望大家多多指教,希望大家发个项目我做做

Struts1标签库如何升级到Struts2

struts1的struts-logic.tld struts-bean.tld struts-html.tld struts-nested.tld 集成在IDE里。导入struts1.就会有了如果升级到Struts2,先把struts2的jar包导入,只用在jsp头文件加上就能使用struts2.0的标签库

duck_arrow的专栏 2505

OGNL教程,简单,看完懂OGNL语言

OGNL 最初是为了能够使用对象的属性名来建立 UI 组件 (component) 和 控制器 (controllers) 之间的联系,简单来说就是:视图 与 控制器 之间数据的联系。后来为了应付更加复杂的数据关系,Drew Davidson 发明了一个被他称为 KVCL(Key-Value Coding Language) 的语言。 Luke 参与进来后,用 ANTLR 来实现了该语言,并给它取了这个新名字,他后来又使用 JavaCC 重新实现了该语言。目前 OGNL 由 Drew 来负责维护。目前很多项目中都用到了 OGNL,其中不乏为大家所熟知的,例如几个流行的 web 应用框架:WebWork【当然struts2也可以说是WebWork升级版】,Tapestry 等。

struts2从2.3.15.1升级到2.3.35

struts2从2.3.15.1升级到2.3.35相关配置说明,在附件中包含有2.3.15.1版本的jar包和2.3.35版本的jar包,以及升级过程中值得注意的事项

Apache Struts2 OGNL RCE注入

Apache Struts2(也称为 Struts2)是一个开源的 Java Web 应用框架。它主要用于构建企业级应用程序,提供MVC)架构支持,帮助开发者快速开发可维护的 Web 应用。Struts2 基于OGNL)表达式语言来处理数据绑定、表单验证和动态内容渲染等功能。它是Struts1的后继版本,从 2006 年左右开始流行,但由于历史漏洞较多,现在许多项目已转向更现代的框架如 Spring MVC。

Gse0a362g的博客 608

让struts支持jdk1.8的spring包

struts项目在jdk1.8环境下报错,提示升级到jdk1.5以上,最后修改了spring这个jar包才解决这个问题。

Struts2 S2-046漏洞深度解析:从异常处理到OGNL注入的攻防实战

在Web应用安全领域,输入验证与异常处理机制是防御体系的关键环节。其核心原理在于对用户提交的所有数据(包括HTTP请求头、参数等)进行严格的合法性校验,防止恶意输入破坏程序逻辑。这项技术的核心价值在于构建纵深防御,确保即使在非正常业务流程(如出错处理)中,应用也能保持安全状态。典型的应用场景包括文件上传、表单提交等用户交互频繁的功能模块。本文聚焦于一个经典案例——Struts2框架的S2-046漏洞,该漏洞正是由于在**异常处理**流程中对用户输入的**Content-Disposition**头部校验不足

weixin_30279315的博客 320

出个AI8051U的PWM例程 | 3相互补SPWM变频驱动,PWMA-3个相位差120度的PWM互补输出

通道2输出: P2.2, PWMA2P输出, P2.3, PWMA2N输出, PWMA2相对PWMA1滞后120度相位.通道3输出: P2.4, PWMA3P输出, P2.5, PWMA3N输出, PWMA3相对PWMA1滞后240度相位.先别修改程序, 直接下载"Objects"里的"pwm.hex"测试, 下载时选择主频24MHz.主频32.768MHz, PWM周期1422, 刷新频率23040Hz,死区0.5us,通道1输出: P2.0, PWMA1P输出, P2.1, PWMA1N输出。

USB_CAN_8051的博客 691

【实战解析】SAP EWM与PP深度集成:从后台配置到前台物料流转的全链路设计

本文深入解析SAP EWM与PP深度集成的全链路设计,涵盖后台配置与前台物料流转的实战应用。通过两种集成模式(DPI与API)的选择策略、十二个关键后台配置步骤详解,以及PMR生成、PSA补货等前台演示,帮助企业实现生产计划与物料供应的高效协同,显著提升生产效率和库存周转率。

weixin_30723433的博客 421

Struts 2安全漏洞深度解析:从OGNL注入到全生命周期防护实践

在Java Web开发领域,远程代码执行(RCE)和输入验证是核心的安全概念。其原理在于攻击者通过构造恶意输入,绕过应用程序的预期逻辑,从而执行未经授权的操作。这类漏洞的技术价值在于揭示了软件在动态特性与安全边界之间的根本矛盾,尤其在依赖表达式引擎、复杂配置的框架中风险凸显。应用场景广泛覆盖企业级Web应用、API服务及遗留系统维护。本文聚焦于Apache Struts 2框架,其历史高危漏洞(如S2-045)常源于OGNL表达式注入和默认配置缺陷,与F5 Nginx安全漏洞、MinIO CORS漏洞等共享

weixin_34110749的博客 483

STM32F4串口接收ATGM336H GPS数据,手把手教你解析NMEA协议并转换经纬度格式

本文详细介绍了如何使用STM32F4开发板通过串口接收ATGM336H GPS模块的NMEA协议数据,并解析GNRMC语句获取经纬度信息。内容涵盖硬件连接、NMEA协议深度解析、数据校验实现以及经纬度格式转换的数学原理与代码实现,为嵌入式开发者提供完整的GPS数据处理解决方案。

weixin_42522575的博客 497

Struts2 漏洞修复实战:从 2.3.31 升级到 2.5.30 的 5 个关键步骤与验证

本文详细介绍了如何将Struts2从2.3.31安全升级到2.5.30版本,涵盖5个关键步骤:版本兼容性评估、依赖管理改造、配置文件调整、深度兼容性测试及安全加固。特别针对远程代码执行漏洞提供了具体修复方案,帮助企业有效提升Java Web应用的安全性。

weixin_30236595的博客 395

基于 AUTOSAR 的域控产品软件开发进阶探索

本文深入探讨了AUTOSAR架构在汽车域控产品开发中的进阶应用。首先从系统设计角度分析了AUTOSAR分层架构原理及其在域控产品中的优化部署策略;其次详细介绍了Davinci和EBTresos等主流工具链的特点与协同使用方法;然后重点阐述了ASPICE流程与功能安全/信息安全标准的实施要点;最后分享了多核车载芯片(如NXP S32G)的适配经验与优化实践。通过架构设计、工具运用、标准遵循和芯片适配四个维度的专业解析,为域控产品的AUTOSAR开发提供了系统性指导。

SiArch的博客 1199

使用 Prometheus 监控 Spring Boot 应用

本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB

蔡定努 431

Struts 2 漏洞(上)

Struts2作为经典Java MVC框架,因OGNL表达式注入漏洞频发而面临严重安全风险。其核心高危漏洞包括:远程代码执行(如CVE-2017-5638通过Content-Type头注入)、文件上传漏洞(绕过类型校验)、路径遍历(读取敏感文件)及CSRF攻击。修复方案强调:1)升级至最新版本(2.5.12+/6.3.0.2+);2)禁用动态方法调用并限制OGNL权限;3)严格校验文件上传(白名单+大小限制);4)部署层防护(WAF+最小权限)。安全加固需重点关注输入过滤、危险配置禁用及日志监控,以降低RC

Cby121353的博客 1912

手把手教你学Simulink——基于Simulink的固态变压器(SST)多级协同控制

摘要:本文详细介绍了基于Simulink的固态变压器(SST)多级协同控制方法。SST作为新一代智能电网核心设备,通过AC-DC整流、DC-DC隔离和DC-AC逆变三级架构实现电能高效转换。针对多级耦合难题,提出能量-功率协同控制策略:纵向解耦电压环与功率前馈,横向联动级间功率指令。在Simulink中搭建10kV/400V系统模型,实现直流母线电压波动<2%的动态性能。特别设计了负载突变时的三级协同机制,通过虚拟惯性算法和前馈控制实现快速响应。文章包含完整的建模步骤、控制推导和参数设置,为电力电子工

MHD0815的博客 195

struts2.0升级到struts2.1

Struts2.0升级到Struts2.1原文链接:http://cwiki.apache.org/S2WIKI/troubleshooting-guide-migrating-from-struts-20x-to-21x.html#TroubleshootingguidemigratingfromStruts2.0.xto2.1.x-UpdateCustomTypeConverters

Seven的专栏 5305

VisionPro 机器视觉案例 之 硬币识别

CogPMAlignTool模板匹配工具 掩模

机器视觉李小白的博客 1893

美军利用MANET技术实现无人作战单元协同作战

本文首先介绍了移动自组织网络 (MANET)以及Wave Relay®波形中继技术,并探讨了波形中继MANET平台在美空军ABMS项目等军事方面的运用情况。

guanyifu9的博客 855
上一篇: 从struts 1.x升级到 struts 2(二) POJO
下一篇: 使用SQL Server导入Excel数据时, 有些数据会自动变成NULL的解决方案
lldwolf
博客等级 码龄26年 57粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值