boa_流程分析

合集下载

BOA技术架构实例

BOA技术架构实例

格式转换模块
配置文件
代理运行
代理运行时 获 取 应 用 事 件 生 成 集 成 消 息 消 费 集 成 消 息 生 成 应 用 数 据
消 息 流 转
•把应用产生的数据对象转换成事先 定义好的格式,并根据发布订阅规 则放入发送队列,最后由发送线程 把消息发送到DXS上 •接收来自DXS的消息,把其中包含 的数据对象转换成应用可识别的格 式,最后传递给应用。
基于BU的应用系统运行支撑平台
组织系统信息门户 [单点登录、个性化定制]
应用层
干部管理 应用
党内管理 应用
企管人员 管理应用
专技人员 管理应用
综合应用
工作流
数据集成
报表管理
内容管理
数 据 访 问 层(Persistence Layer)
信息资源层
数据仓库
组织机构 及人员 信息库
办公 信息库
知识 信息库
Ops
PersonDAOProxy
数据集成拦截器
PersonDAO AddPerson DeletePerson UpdatePerson FindPerson
AddPerson DeletePerson UpdatePerson FindPerson
操作 PersonDAO.cs
过程集成拦截器
过程集成 接口 View
其他 建模 工具
辅助工具
流程监控 JBMon 过程分析 JBAna 过程模拟 JBSim
执行服务 工作流引擎 JBEng 工作流数据库 其他 工作流 引擎
Web Service
遗产系统
可视化表单 工具 JBFrm
过程集成机制-工作流管理系统
过程建模 过程分析 执行 监控

海外购房的详细流程是什么

海外购房的详细流程是什么

海外购房的详细流程是什么海外购房的流程1.预订房子,确定投资物业,看中房子后可支付定金,向中介开发商申请保留房屋,通常对于海外投资者可以使用邮寄的方式来进行合同签订,同时需要委托具有澳洲专业资格的律师作为代理律师;2.代理律师审查购房合同,确保买家利益,如对购房条款持有不同意见,双方可商讨协商,签字后,开发商也需在购房合同上签字,并向购房者提供一份双方签署后的合同随后合同生效。

3.海外购房者需填写一份申请表格并递交海外投资审核委员会审核,此项一般由购房方的代表律师协助完成。

4.在所购房屋正式交割之前,购房者律师代表买家和卖家律师就房屋交割相关事宜协商为房屋正式交割做准备;5.房屋施工,完工后,开发商会邀请购房者或其代表人验房。

6.购房者需要在房屋正式交割之前解决好房屋余款的支付。

无论是贷款还是现金支付,房屋余款需要支付到卖家指定账户;7.交割之日,买家卖家双方律师交换合同,完成较后手续,购房者即可入住新居。

海外购房的付款方式1、大部分朋友都是通过BOA收钱的,没有什么问题。

有个别朋友通过chase收钱,被银行停了账户,但也有可能是别的引起的,尚不能确定和海外汇款有关2、海外打来的钱算是foreign gift, 是不需要给美国交税的,但是IRS要求申报3520表格,不按时申报可能会处以罚款。

3、买房子时根据银行的不同,银行会对资金在账户里停留时间有不同要求,有的银行只看一个月内的账单,即如果钱是一个月之前打入的,就没有任何问题,而有的银行要求的三个月。

4、国内打钱会收一定手续费,每个银行收的手续费会有差异。

因为国内建行和美国BOA有合作关系,所以可以优先考虑这条途径,手续费可能会低些5、国内往境外打钱可能会受到银行的监控,这两年尤为严格。

但一般就是出具些材料,比如你的身份证明,工作证明等等,证明钱是合法来的。

移民到国外的注意事项1.做好市场调研,不同国家的房子间没有可比性。

2.不要被低价迷惑。

3.谨慎对待“租赁担保”。

bom维护流程erp实训报告

bom维护流程erp实训报告

bom维护流程erp实训报告English Answer:BOM Maintenance Process ERP Training Report.Introduction:A Bill of Materials (BOM) is a crucial document in manufacturing that defines the components, raw materials, and subassemblies required to produce a finished product. Effective BOM maintenance is essential for ensuring accurate production planning, inventory management, and cost control.Purpose of this Report:This report provides a detailed account of the BOM maintenance process within an Enterprise Resource Planning (ERP) system. It outlines the steps involved, best practices, and the importance of BOM maintenance forefficient manufacturing operations.Steps Involved in BOM Maintenance:1. BOM Creation: The initial BOM is created during product development and specifies the complete assembly structure.2. BOM Release: Once the BOM is complete, it must be released into the ERP system. This authorizes the use of the BOM for manufacturing purposes.3. BOM Change Management: Changes to the BOM are inevitable during the product lifecycle. A formal change management process ensures controlled updates to the BOM.4. Revision Control: Each change to the BOM results ina new revision. Revision control ensures that outdated BOMs are not used for production.5. BOM Verification: The BOM is verified regularly to ensure its accuracy and completeness. This includescomparing the BOM to the actual physical product.6. BOM Audit: Periodic audits are conducted to assess the overall effectiveness of the BOM maintenance process.Best Practices for BOM Maintenance:1. Centralized Control: Establish a central authority responsible for BOM management to avoid inconsistencies.2. Automated Processes: Leverage ERP system capabilities to automate BOM creation, change management, and revision control.3. Collaboration and Communication: Involve all stakeholders, including engineers, supply chain, and manufacturing, in BOM maintenance.4. Regular Reviews: Schedule periodic reviews to identify and address potential BOM issues.Importance of BOM Maintenance:1. Accurate Production Planning: A well-maintained BOM ensures that production schedules reflect the actual materials and components required.2. Efficient Inventory Management: Accurate BOMs enable optimized inventory levels by identifying the exact quantities and timing of materials needed.3. Cost Control: BOM maintenance helps track component costs and enables accurate cost estimation for production.4. Product Traceability: BOMs provide a detailed record of components used in a product, facilitating traceability and recall management.Conclusion:Effective BOM maintenance is crucial for maintaining the integrity of production processes and ensuring the efficiency of manufacturing operations. By following the outlined steps and best practices, organizations canimprove BOM accuracy, reduce production errors, optimize inventory, control costs, and enhance product traceability.Chinese Answer:BOM维护流程—ERP实训报告。

boa算法原理

boa算法原理

Boa算法原理解析概述Boa算法是一种基于MapReduce的大数据挖掘算法,旨在高效地处理和分析包含大量图数据的大型计算机网络。

该算法将计算机网络中的通信以图的形式进行建模,并使用关联规则挖掘技术来发现具有潜在威胁性的网络行为。

通过Boa算法,可以快速发现网络中的异常行为、恶意攻击和不安全的配置,从而提高网络安全性。

Boa算法原理Boa算法的核心思想是将计算机网络视为一个有向图,其中图的节点代表网络中的主机、服务器或路由器,图的边代表它们之间的通信关系。

通过对这个图进行分析,可以找到网络中的威胁和攻击行为。

Boa算法主要包含以下几个步骤:1. 数据预处理首先,需要对收集的原始数据进行预处理,以便将其转化为适合于Boa算法的数据格式。

预处理步骤包括数据清洗、数据格式转换和数据聚合。

数据清洗主要是去除不完整、重复或错误的数据;数据格式转换是将原始数据转化为图数据结构;数据聚合是将具有相同通信关系的数据合并到一起。

2. 图构建在图构建过程中,根据网络通信记录数据,可以将每个计算机节点作为图中的一个节点,并使用边连接之间存在通信关系的节点。

边的权重可以根据通信的频率、数据量或其他特征进行设置。

3. 关联规则挖掘关联规则挖掘是Boa算法的核心步骤。

这一步骤使用Apriori算法或FP-growth算法等经典的关联规则挖掘算法来发现网络中存在的威胁和攻击行为。

关联规则挖掘可以发现频繁项集和关联规则,从中提取有价值的信息。

4. 威胁识别通过关联规则挖掘,可以得到一系列与网络安全相关的关联规则。

根据这些规则,可以识别出潜在的威胁和攻击行为。

例如,如果某个关联规则表明两个节点之间的数据传输异常频繁,可能存在数据泄露或拒绝服务攻击。

5. 结果展示与分析最后,Boa算法可以将威胁识别结果以可视化的形式展示给用户,以便于分析和进一步的决策制定。

通过结果展示与分析,用户可以对网络安全进行监控和调整,提高网络安全性。

Boa算法优势Boa算法具有以下几个优势:1. 高效处理大规模网络数据Boa算法基于MapReduce模型,可以有效地处理大规模网络数据。

ebs bom流程

ebs bom流程

ebs bom流程英文回答:Introduction.The EBS BOM process is a critical part of the manufacturing process. It ensures that the correct materials are used in the correct quantities to produce the desired product. The EBS BOM process is also used to track inventory levels and to identify potential cost savings.Steps in the EBS BOM Process.The EBS BOM process typically involves the following steps:1. Create a BOM. The first step in the EBS BOM process is to create a BOM. A BOM is a list of all the materials that are required to produce a product. The BOM should include the following information:The name of the product.The quantity of each material required.The unit of measure for each material.The cost of each material.2. Approve the BOM. Once the BOM has been created, it must be approved by the appropriate personnel. This may include the engineering department, the manufacturing department, and the purchasing department.3. Release the BOM. Once the BOM has been approved, it can be released to the manufacturing department. The manufacturing department will use the BOM to order the necessary materials and to produce the product.4. Track inventory levels. The EBS BOM process can also be used to track inventory levels. This information can be used to identify potential cost savings and to preventshortages.5. Identify potential cost savings. The EBS BOM process can be used to identify potential cost savings. This can be done by comparing the cost of different materials and by identifying alternative suppliers.Benefits of the EBS BOM Process.The EBS BOM process has a number of benefits, including:Improved accuracy. The EBS BOM process helps to ensure that the correct materials are used in the correctquantities to produce the desired product.Reduced costs. The EBS BOM process can help to reduce costs by identifying potential cost savings.Improved inventory management. The EBS BOM process can help to improve inventory management by tracking inventory levels and identifying potential shortages.Enhanced quality control. The EBS BOM process can help to enhance quality control by ensuring that the correct materials are used in the correct quantities to produce the desired product.Conclusion.The EBS BOM process is a critical part of the manufacturing process. It ensures that the correct materials are used in the correct quantities to produce the desired product. The EBS BOM process can also be used to track inventory levels and to identify potential cost savings.中文回答:概述。

欧盟商标异议流程

欧盟商标异议流程

欧盟商标异议流程
欧盟商标异议流程主要包括以下步骤:
1. 商标申请:申请人向欧洲联盟知识产权局(EUIPO)递交商标注册申请。

2. 商标初步审查:EUIPO对商标申请进行初步审查,检查申
请是否满足商标注册条件。

3. 商标公告期限:如果商标申请通过初步审查,商标将被公告在EUIPO网站上,公告期限为三个月。

4. 异议提出:在公告期限内,第三方有权提出商标异议申请。

异议申请人应向EUIPO提交异议申请,包括异议理由和证据。

5. 异议审查:EUIPO对商标异议申请进行审查,包括核实异
议理由和相关证据的有效性。

6. 商标异议决定:EUIPO根据相关法规和案例法作出商标异
议决定,判定商标是否具有注册条件。

7. 商标注册:如果商标异议未被接受或决定不予受理,商标将被登记注册,并获得法律保护。

如果商标异议被接受,商标申请将被拒绝注册。

8. 上诉:商标申请人或异议申请人对商标异议决定不满意,可以向欧洲联盟知识产权局上诉委员会(BoA)提出上诉申请。

需要注意的是,商标异议流程可能因个案的具体情况而有所不同。

此外,欧盟商标异议流程并不适用于欧盟成员国内的国内商标异议,每个成员国可能有自己的商标异议程序。

因此,在具体操作中,申请人和异议申请人应确保遵守适用法规和程序。

听力筛查规范 - 副本

听力筛查规范 - 副本
• H档用于测量便携式听力计扬 声器声压级
• 房间面积10-15平方米 • 测试时室内人数不宜超过4人
(含被试者),保持安静状态
便携式听觉评估仪评估方法
听力检查仪阳性指标
筛查型耳声发射仪
• 0-6岁听力筛查 • 通过,则证实外周听
觉系统的正常功能 • 未通过,则表明需要
进行进一步的听力学 评估。 • 不能反映低、中频听 力的状况。
干预治疗 阈值50-70 dB nHL 3月复查1次,2次均在此范围,应在6月干预,9月给出
明确诊断 阈值< 50 dB nHL 3月复查1次,6月给出干预,1岁前诊断
40HzAERP
• 40 HzAERP主要用以评估低 频(0.5 kHz~1 kHz)听 力的情况,可以弥补ABR在 反映低频听力时的不足, 对于客观评价婴幼儿的低 频听力有一定的帮助;然 而,40 Hz AERP受睡眠深 度及镇静剂的影响,其波 形分化和反应阈有时会出 现差异
畸变产物耳声发射测试(DPOAE)
• 进行DPOAE时的环境噪 声≤40 dB A,可选择在 隔声室内测试。
• 测试结果中每个分析 频率畸变产物的值在 正常范围内,并大于 噪声值3 dB SPL,测试 的8个频率中至少有4 个频率通过即为通过。
畸变产物耳声发射DPOAE
第一个頻率(F1)刺激位置
家长或直接带养者怀疑儿童有听力问题?

听力残疾筛查(初筛)
• 转介指标 • 新生儿听力筛查未通过 • 儿童发育问题预警征象筛查阳性
附表2 0-6岁儿童残疾初筛登记表
编 儿童 性 出生 家长 号 姓名 别 日期 姓名
家庭 住址
联系 电话
疑似残 疾类型
登记 日期
转归

ebom工艺流程

ebom工艺流程

ebom工艺流程
《EBOM工艺流程》
在制造业中,EBOM(工程BOM,即工程物料清单)是产品
的设计团队所需的物料清单,用于指导产品的制造过程。

而EBOM工艺流程则是指导产品制造的具体步骤和方法。

下面
我们来介绍一下EBOM工艺流程的一般步骤。

首先,EBOM工艺流程的第一步是制定产品的设计要求和规格,包括产品的功能、材料、尺寸、外观等方面的要求。

这一步需要设计团队和制造团队的紧密合作,确保产品的设计符合制造的实际情况。

接下来,制定产品的工艺流程和制造工艺。

这包括确定产品的加工工艺、装配工艺、检验工艺等各个环节的具体步骤和方法。

同时,还需要确定所需的设备、工具和人力资源,并进行必要的技术培训。

然后,制定产品的物料清单和采购计划。

根据产品的设计要求和工艺流程,确定所需的原材料、零部件和辅助材料,然后制定采购计划,确保物料的供应和交付及时、质量可靠。

接着,进行产品的试制和样品确认。

根据工艺流程,制造出产品的样品,进行功能测试、外观检查和质量评估,确保产品符合设计要求和客户需求。

最后,进行产品的批量生产。

在确定了产品的设计要求、工艺
流程和物料清单后,进行产品的批量生产。

同时,还需要不断进行质量控制和过程改进,确保产品的质量和制造效率。

综上所述,EBOM工艺流程是产品制造的关键步骤,通过科学规范的工艺流程和严格的质量控制,确保产品的质量和交付周期。

只有不断优化和改进工艺流程,企业才能在竞争激烈的市场中立于不败之地。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

boa 流程分析默认分类2010-01-19 19:10:38 阅读291 评论0 字号:大中小订阅引言随着企业安全意识的增强以及现代化管理水平的提高,对设备的远程监控在工业控制系统中得到了越来越广泛的应用。

近年来,Web技术广泛普及,把Web 技术应用在这种监控系统中,可以让操作者通过浏览器维护和管理监测点,查看监测数据。

同时,监测中心的服务程序也可以很方便地通过Web把监测数据取回来,进行进一步的处理,十分方便。

μClinux是应用于微控制领域的一种嵌入式Linux操作系统,它源码开放,移植性好,支持多种硬件平台和几乎所有常见网络通信协议,支持文件系统丰富,是一个功能完整的嵌入式操作系统。

并且有大量优秀的开放源代码的应用软件和开发工具可用,因此,采用μClinux作为操作平台,使用Web技术进行远程在线监测系统的开发。

1 嵌入式Web服务器为了能够通过Web来维护和管理远程在线监控系统,必须选择一个恰当的Web服务器,不但要求所选择的Web服务器支持动态Web技术,也要求它能够在嵌入式系统中稳定地工作。

1.1 Web服务器原理和功能嵌入式Web服务器以TCP/IP协议栈为基础构建,需要实现HTTP,TCP和UDP等协议。

任何一个客户机,都可以通过HTTP协议与嵌入式Web Server建立连接。

嵌入式Web服务器在Web浏览器和设备之间提供了统一的GUI接口,使得客户端可以像在本地一样透明地监控管理设备状况。

嵌入式Web服务器的主要功能有:响应多个客户的实时HTTP请求,并为每个客户建立连接,这是嵌入式Web服务器的首要功能;对设备的实时监控管理,参数的在线查看与配置等;对设备访问的安全控制机制,包括SSL、用户口令等;实现设备的故障智能报警。

1.2 Boa的特点在μClinux中常用的Web服务器有:Boa,thttpd,httpd,其中httpd只支持静态页面,显然不适合高级应用,thttpd和Boa所提供的功能基本一样,但是thttpd在运行过程中所需要的资源要远大于Boa,因此使用Boa作为该嵌入式系统的Web服务器。

系统的软件开发模型选用B/S模型。

Boa是一个高性能的单任务型Web服务器,可以运行在几乎所有的类Unix 的平台上,Boa支持认证,支持CGI,功能比较全,占用资源也少,非常适合于用在资源有限的嵌入式系统中,目前Boa已经以源码的形式包含在μClinux的发行包中。

2 Boa源码分析在此通过以下对Boa的源代码进行简单的分析,来提出解决避免恶意攻击的安全解决方案。

2.1 Boa工作流程图1是Boa工作流程图。

Boa从新到达的套接字获得HTTP请求(由一个request结构来存储),并将其保存在队列当中。

首先,get_request()将从套接字获得的数据全部保存在request→header_line中,然后调用process_request()来处理在队列中的每一个请求。

根据request结构中status所表示的不同状态,将进行不同的处理。

如果这个请求符合HTTP协议,则会调用process_option_Iine()将一些头部信息填写到request结构中完成这些环境变量的设置,随后process_header_end()会对用户进行验证。

如果验证通过则判断request结构中的is_cgi,非0则是CGI程序,调用init_cgi()函数进行处理,为0则是静态页面,调用init_get()函数进行处理。

2.2 init_get函数工作流程图2为处理静态页面请求的init_get()函数的基本工作流程。

图2中process_get()函数完成的功能为将request结构中的data_men字符串返回套接字并在用户浏览器上显示相应的内容。

2.3 init_cgi函数工作流程对CGI程序的处理函数init_cgi()首先调用一系列函数完成对CGI环境变量的设置,create_common_env(),complete_env()完成了大多数CGI环境变量的注册工作。

采用PIPE(管道)方式,就是将CGI程序的输出重定向到管道,然后Boa从管道读取并转发给客户端浏览器。

整个流程结束后,返回到主函数的无限循环中等待处理下一个套接字连接的到达。

init_cgi()具体工作流程如图3所示。

管道读取函数read_from_pipe()完成的主要功能是从套接字req→data_fd读取数据到req→header_end中,并进行处理;然后修改req→status=PIPE_WRITE 来调用write_from_pipe()将req→header_line的内容返回套接字fd,并在用户浏览器上显示相应的内容。

3 Boa源码改进经过上述对Boa源码的分析可以看出,Boa服务器将根据浏览器地址栏中输入的文件路径调用相应的CGI程序或静态页面显示在浏览器中。

这种方式使入侵者很容易找到源文件,隐蔽性和安全性极差。

这里在对Boa源码进行修改后,在浏览器中输入对该系统指定的静态网页类型的请求后,Boa服务器会自动进行文件路径重定向,调用相应的CGI程序进行处理,而用户不会察觉到这一变化。

从而使用户无法得知源文件的路径,增加了程序的隐蔽性和安全性。

在源代码判断是否CGI程序之前添加判断:如果文件路径(req→pathname)的后缀代表本系统指定的静态页面,则将其修改为实际CGI程序所在路径,并更改is_cgi变量为“CGI”。

经过这样修改后,程序会调用CGI程序的处理函数init_cgi(),使原本的静态请求变成动态的CGI请求。

修改后的Boa流程如图4所示(虚线为添加部分)。

4 CGI程序设计技术4.1 CGI简介到目前为止,实现动态Web页面有4种技术可供选择:CGI,ASP,PHP和JSP。

因为目前μClinux还不支持ASP,PHP等动态Web页面技术,因此在该实现中选择了CGI。

CGI规定Web服务器调用其他可执行程序的接口协议标准,提供Web服务器一个执行外部程序的通道。

这种服务端技术使得浏览器和服务器之间具有交互性。

CGI程序属于一个外部程序,需要编译成可执行文件,以便在服务端运行。

Web服务器通过调用CGI程序实现与Web浏览器的交互,也就是CGI程序接收Web浏览器发送给Web服务器的信息,进行处理,将响应结果再回送给Web服务器及Web浏览器。

4.2 CGI程序工作原理CGI工作原理如下:客户端的用户通过浏览器完成一定输入工作后,向服务器发出。

HTTP请求(称为CGI请求),服务器守护进程,接收到该请求后,就创建一个子进程(称为CGI进程)。

该CGI子进程将CGI请求的有关数据设置成环境变量,在CGI程序与服务器间建立两台数据通道,然后启动URL指定的CGI程序。

子进程通过标准输出流将处理结果传递给服务器守护进程,守护进程再将处理结果作为应答消息回送到客户端。

一个CGI程序的任务分为输入任务和输出任务。

输入任务根据请求方法的不同,从环境变量QUE-RY_STRING或标准输入中读取用户输入数据。

输出任务生成HTTP响应头标内容,如消息正文的数据类型和数据长度等;生成HTTP响应消息正文内容,如动态生成的HTML文件内容。

4.3 CGI程序改进方法传统的CGI程序编写方法简单地用printf()函数来产生HTML源代码。

在输出的字符串中如果有双引号,在其前面必须有一个后斜字符,这是因为整个HTML 代码串已经在双引号内,所以HTML代码串中的双引号符必须用一个后斜字符来转义。

这样的CGI程序代码冗长,不利于阅读,且容易出错。

这里所采用的方法是预先将需要显示的网页保存成文件,采用仿“ASP”的技术,将需要动态显示的内容写入符号“|%”与“|”之间。

并设计配置文件,指定替换内容。

CGI程序逐行读取源文件,将符号“|%”与“|”之间的内容替换成配置文件指定的内容。

HTML源文件的格式设计如下:单选按钮:CGI程序找出“|%”与“|”之间的关键字key,如果key中不包含“@”则直接替换与之对应的值;如果包含“@”,将关键字分为三部分:replacestr=checked,key=system_mode,keyvalue=route。

寻找数据结构中与key相等的name[i],将对应的value[i]与keyval-ue比较,如果相等则替换为type的值。

具体流程如图5所示。

当在任意用户端浏览器中输入目标板的IP地址及对应的文件名后,就会显示如图6所示界面。

其中在地址栏中输入的路径已经按照本文之前的方法被Boa 服务器修改,实际路径为:http://192.168.0.1/cgi-bin/qs2.cgi。

因此用户无法找到源文件,减小了被恶意用户攻击的可能性。

图5中选中单选框和添加文本框内容这些操作都是经过CGI程序替换显示的配置文件中的内容。

修改这些内容后点击下一步程序会自动保存到配置文件中,下一次再进入页面后就会显示上一次保存的结果。

5 结语这里通过对Boa源代码的分析,提供了较为完善的文件隐藏机制,该研究为Web服务器在嵌入式设备远程监控应用中提出了一个更为安全的解决方案。

此外,通过对传统的CGI程序设计方法进行改进,可显著减少CGI程序代码量,使其便于修改升级。

这种方法完全可以应用在其他嵌入式系统中,因此具有广泛的应用意义。

系统也有一些尚需改进的地方,如:文件路径隐藏方式有些简单;CGI 程序配置文件没有进行加密;这些都有待今后进一步研究。

Boa Web Server 缺陷报告及其修正方法2010-03-30 13:33119人阅读评论(0)收藏举报综述Boa 作为一种轻巧实用的WEB 服务器广泛应用于嵌入式设备上,但Boa 对实现动态网页的CGI 的支持上仍存在一些缺陷,本文描述了Boa 对CGI 的Status/Location 的支持的缺陷及其修正方法.版本:所有版本(0.94.13)缺陷: BOA 解析CGI 应答头时不能完整处理Status 和Location缺陷描述:CGI/1.1 标准规定, CGI 脚本可以通过Status 设置HTTP 应答状态(如, Status: 500 Internal Error) 和Location 进行地址重定向(如, Location: ), 而不管它们在应答头中的位置. Boa 支持Stauts 和Location 两种应答头, 但它的实现仅能正确处理Stauts 和Location 在应答第一行的CGI 应答. 这将给CGI 程序的移植带来很多不便, 进而影响Boa 作为Web Server 的功能的发挥.影响功能:ASP/PHP/JSP/Perl/... 等的header, redirect, ... 等都会应用到Stauts/Location 进行设置应答状态和地址重定向. Boa 的该实现将影响CGI 脚本正常功能的使用.缺陷功能对比(对Status/Location的支持程序):Apache 1.3.x/2.x IIS 4.x/5.x/6.X Boa 0.9x thttpdmini-httpd完全支持完全支持* 部分支持完全支持完全支持缺陷分析1缺陷分析CGI 应用程序进行应答时, 可以HTTP 头进行有限的控制. 如,设置客户端不缓存页面可用下面的 C 脚本, HTTP/1.0: printf("Pragma: no-cache/n"); 或HTTP/1.1: printf("Cache-Control: no-cache; no-store/n");如果, 同时还需要告诉浏览器进行设置Cookie 和控制相应状态(200 OK) 或地址重定向, 那么就必须输出多行http 头控制语句, CGI 支持两个解析头"Status: " 和"Loction: ", 即协议规定, Web 服务器支持解析头时能使用"Status: " 进行应答状态控制, 使用"Location: " 进行地址重定向, 并为应答添加状态头"HTTP/1.0 302 Moved T emporarily/n" 或"HTTP/1.1 302 Found/n".而不管它们在CGI 应答头的什么位置.分析Boa Source Code: cgi_header.c Line 82-136 容易发现, Boa 只解析CGI 应答的第一行, 是否为"Status: ", "Location: ", 如下所示23224 int process_cgi_header(request * req)325 {426 char *buf;527 char *c;628729 if (req->cgi_status != CGI_DONE)830 req->cgi_status = CGI_BUFFER;9311032 buf = req->header_line;11331234 c = strstr(buf, "/n/r/n");1335 if (c == NULL) {1436 c = strstr(buf, "/n/n");1537 if (c == NULL) {1638 log_error_time();1739 fputs("cgi_header: unable to find LFLF/n", stderr);1840 #ifdef FASCIST_LOGGING1941 log_error_time();2042 fprintf(stderr, "/"%s/"/n", buf);2143 #endif2244 send_r_bad_gateway(req);2345 return 0;2446 }2547 }2648 if (req->simple) {2749 if (*(c + 1) == '/r')2850 req->header_line = c + 2;2951 else3052 req->header_line = c + 1;3153 return 1;3254 }3355 if (!strncasecmp(buf, "Status: ", 8)) {3456 req->header_line--;3557 memcpy(req->header_line, "HTTP/1.0 ", 9);3658 } else if (!strncasecmp(buf, "Location: ", 10)) { /* got a location header */3759 #ifdef FASCIST_LOGGING38603961 log_error_time();4062 fprintf(stderr, "%s:%d - found Location header /"%s/"/n", 4163 __FILE__, __LINE__, buf + 10);4264 #endif436544664567 if (buf[10] == '/') { /* virtual path */4668 log_error_time();4769 fprintf(stderr,4870 "server does not support internal redirection: " / 4971 "/"%s/"/n", buf + 10);5072 send_r_bad_request(req);51735274 /*5375 * We (I, Jon) have declined to support absolute-path parsing5476 * because I see it as a major security hole.5577 * Location: /etc/passwd or Location: /etc/shadow is not funny.5678 *5779 * Also, the below code is borked.5880 * request_uri could contain /cgi-bin/bob/extra_path 5981 */60826183 /*6284 strcpy(req->request_uri, buf + 10);6385 return internal_redirect(req);6486 */6587 } else { /* URL */6688 char *c2;6789 c2 = strchr(buf + 10, '/n');6890 /* c2 cannot ever equal NULL here because we already have found one */69917092 --c2;7193 while (*c2 == '/r')7294 --c2;7395 ++c2;7496 /* c2 now points to a '/r' or the '/n' */7597 *c2++ = '/0'; /* end header */76987799 /* first next header, or is at req->header_end */78100 while ((*c2 == '/n' || *c2 == '/r') && c2 < req->header_end) 79101 ++c2;80102 if (c2 == req->header_end)81103 send_r_moved_temp(req, buf + 10, "");82104 else83105 send_r_moved_temp(req, buf + 10, c2);84106 }85107 req->status = DONE;86108 return 1;87109 } else { /* not location and not status */ 88110 char *dest;89111 int howmuch;90112 send_r_request_ok(req); /* does not terminate */91113 /* got to do special things because92114 a) we have a single buffer divided into 2 pieces93115 b) we need to merge those pieces94116 Easiest way is to memmove the cgi data backward until 95117 it touches the buffered data, then reset the cgi data pointers96118 */97119 dest = req->buffer + req->buffer_end;98120 if (req->method == M_HEAD) {99121 if (*(c + 1) == '/r')100 122 req->header_end = c + 2;101 123 else102 124 req->header_end = c + 1;103 125 req->cgi_status = CGI_DONE;104 126 }105 127 howmuch = req->header_end - req->header_line;106 128107 129 if (dest + howmuch > req->buffer + BUFFER_SIZE) {108 130 /* big problem */109 131 log_error_time();110 130 fprintf(stderr, "Too much data to move! Aborting! %s %d/n",111 131 __FILE__, __LINE__);112 132 /* reset buffer pointers because we already called113 133 send_r_request_ok... */114 134 req->buffer_start = req->buffer_end = 0;115 135 send_r_error(req);116 136 return 0;117 137 }118 138 memmove(dest, req->header_line, howmuch);119 139 req->buffer_end += howmuch;120 140 req->header_line = req->buffer + req->buffer_end;121 141 req->header_end = req->header_line;122 142 req_flush(req);123 143 if (req->method == M_HEAD)124 144 return 0;125 145 }126 146 return 1;127 147 }128 148129 149修正方法CGI 应答头包括多行, 我们必须对其进行逐行分析, 并作出正确的应答.下面是修改好的源程序, 即将原来的82-136 (即相当下文#else, #endif内部分) 替换成如下代码:130 #if 1131while(1) {132int len;133char * pnext = NULL;134char * ptmp = NULL;135136/* not find HTTP header tailer */137if (NULL == (pnext=strchr(buf, '/n'))) /* has no '/n' */ 138break;139140/* the length of this line,141* include '/n'142*/143len = pnext - buf + 1;144if (!strncasecmp(buf, "Location: ", 10)) { /* got a location header */145/* not the first one146* exchange this line to the first line147*/148if (buf != req->header_line)149{150if (NULL == (ptmp=(char *)malloc(len)))151{152log_error_time();153perror("malloc");154send_r_error(req);155return 0;156}157158/* move Status: to line header */159memcpy(ptmp, buf, len);160memmove(req->header_line+len, req->header_line, buf-req->header_line);161memcpy(req->header_line, ptmp, len);162free(ptmp);163}164165/* force pointer header */166buf = req->header_line;167168 #ifdef FASCIST_LOGGING169170log_error_time();171fprintf(stderr, "%s:%d - found Location header /"%s/"/n",172__FILE__, __LINE__, buf + 10);173 #endif174175176if (buf[10] == '/') { /* virtual path */177log_error_time();178fprintf(stderr,179"server does not support internal redirection: " / 180"/"%s/"/n", buf + 10);181send_r_bad_request(req);182183/*184* We (I, Jon) have declined to support absolute-path parsing185* because I see it as a major security hole.186* Location: /etc/passwd or Location: /etc/shadow is not funny.187*188* Also, the below code is borked.189* request_uri could contain /cgi-bin/bob/extra_path190*/191192/*193strcpy(req->request_uri, buf + 10);194return internal_redirect(req);195*/196} else { /* URL */197char *c2;198c2 = strchr(buf + 10, '/n');199/* c2 cannot ever equal NULL here because we already have found one */200201--c2;202while (*c2 == '/r')203--c2;204++c2;205/* c2 now points to a '/r' or the '/n' */206*c2++ = '/0'; /* end header */207208/* first next header, or is at req->header_end */209while ((*c2 == '/n' || *c2 == '/r') && c2 < req->header_end) 210++c2;211if (c2 == req->header_end)212send_r_moved_temp(req, buf + 10, "");213else214send_r_moved_temp(req, buf + 10, c2);215}216req->status = DONE;217return 1;218} else if (!strncasecmp(buf, "Status: ", 8)) {219/* not the first one220* exchange this line to the first line221*/222if (buf != req->header_line)223{224if (NULL == (ptmp=(char *)malloc(len))) 225{226log_error_time();227perror("malloc");228send_r_error(req);229return 0;230}231232/* move Status: to line header */233memcpy(ptmp, buf, len);234memmove(req->header_line+len, req->header_line, buf-req->header_line);235memcpy(req->header_line, ptmp, len);236free(ptmp);237}238239req->header_line--;240memcpy(req->header_line, "HTTP/1.0 ", 9);241return 1;242}243244/* pointer to next line */245buf = pnext + 1;246247/* reach the end of HTTP header */248if ('/0' == buf[0] || '/n' == buf[0] || '/r' == buf[0])249break;250}251252if (1) { /* always done */253 #else254if (!strncasecmp(buf, "Status: ", 8)) {255req->header_line--;256memcpy(req->header_line, "HTTP/1.0 ", 9);257} else if (!strncasecmp(buf, "Location: ", 10)) { /* got a location header */258 #ifdef FASCIST_LOGGING259log_error_time();260fprintf(stderr, "%s:%d - found Location header /"%s/"/n",261__FILE__, __LINE__, buf + 10);262 #endif263if (buf[10] == '/') { /* virtual path */264log_error_time();265fprintf(stderr,266"server does not support internal redirection: " / 267"/"%s/"/n", buf + 10);268send_r_bad_request(req);269/*270* We (I, Jon) have declined to support absolute-path parsing271* because I see it as a major security hole.272* Location: /etc/passwd or Location: /etc/shadow is not funny.273*274* Also, the below code is borked.275* request_uri could contain /cgi-bin/bob/extra_path276*/277/*278strcpy(req->request_uri, buf + 10);279return internal_redirect(req);280*/281} else { /* URL */282char *c2;283c2 = strchr(buf + 10, '/n');284/* c2 cannot ever equal NULL here because we already have found one */285--c2;286while (*c2 == '/r')287--c2;288++c2;289/* c2 now points to a '/r' or the '/n' */290*c2++ = '/0'; /* end header */291/* first next header, or is at req->header_end */292while ((*c2 == '/n' || *c2 == '/r') && c2 < req->header_end)293++c2;294if (c2 == req->header_end)295send_r_moved_temp(req, buf + 10, "");296else297send_r_moved_temp(req, buf + 10, c2);298}299req->status = DONE;300return 1;301} else { /* not location and not status */ 302 #endif。

相关文档
最新文档