博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟HTTP请求的返回&shell写cgi
阅读量:7209 次
发布时间:2019-06-29

本文共 2678 字,大约阅读时间需要 8 分钟。

测试中偶尔会有这样的需求:

1.需要访问外网的cgi或链接地址,但访问不通
2.需要构造cgi特定的返回,但正常情况下难以构造
为了获得想要的结果,此时可以模拟http请求的返回满足测试需要

 


方法一:直接获取结果文件

在apache配置的对应路径下新建一个文件,如

DocumentRoot /data/server/xxxx/htdocs

然后用IP/文件名来访问,或者放在alias指定的文件夹下面

新建一个文件名字,比如result,键入以下内容:

result=0&res_info=OK

 

在浏览器里直接输入,访问该文件,可以看到返回结果

 

 

这个只是相当于把文件内容给取出来了,如果真正模拟cgi的返回的话我一般用shell写个桩cgi

 


方法二:写一个桩cgi

什么是cgi,见apache指南:cgi

简言之,要自己写一个cgi需要如下条件:

1.apache配置支持cgi

一般机器上有部署过cgi,在该目录下编写一个自己写的cgi是不会有什么不支持的问题,如果是在其他目录新部署自己的cgi,也许会遇到apache的支持问题

如,直接在刚才的目录下面新建一个shell脚本,如test.sh

#!/bin/shprint "result=0&res_info=OK"

 

 再在浏览器里运行,运行的结果就是把这个脚本文件下载下来,而不是执行输出

必须配置Apache以允许CGI的执行,其方法有多种:

  (1)ScriptAlias

  ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中文件都是CGI程序并试图运行。

  ScriptAlias指令形如: 

ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/

  如果Apache被安装到默认的位置,默认的配置文件httpd.conf中则会有上述配置。ScriptAlias指令定义了映射到一个特定目录的URL前缀,与Alias指令非常相似,两者一般都用于指定位于DocumentRoot目录以外的目录,其区别是ScriptAlias又多了一层含义,即其URL前缀中任何文件都被视为CGI程序。所以,上述例子会指示Apache,/cgi-bin/应该指向/usr/local/apache/cgi-bin/目录,且视之为CGI程序。

 

  (2)用Options显式地允许CGI的执行

可以在主服务器配置文件中,使用Options指令显式地允许特定目录中CGI的执行:

Options +ExecCGI

上述指令使Apache允许CGI文件的执行。另外,还必须告诉服务器哪些文件是CGI文件。下面的AddHandler指令告诉服务器所有带有cgi或pl后缀的文件是CGI程序:

AddHandler cgi-script cgi pl

 

  (3).htaccess文件

  在主服务器配置中如此配置:

AllowOverride Options

  在.htaccess文件中,需要如此配置:  

Options +ExecCGI

  以使Apache允许此目录中CGI程序的执行。 

 

 

2.按照cgi的格式输出内容

在CGI程序的所有输出前面必须有一个MIME类型的头,即HTTP头

有三个类型的头部: Content-type, Location, 和Status. Content-type 最普遍的。

有关content-type解释可以见有关HTML的说明, 一个你可以发出的特定编码象这样:Content-type: text/html在这个例子中,输出数据的类型是text/html; 换句话说, 他是个HTML文件. 其他详尽的说明参照apache文档

基本使用方法是

 

echo "xxxxxxx"echo ""

其他详尽的说明参照apache文档

 

 

 

看完了1和2后可以做一个简单的demo:

apache配置为:

ScriptAlias /cgi-bin/ /data/server/xxxxxx/htdocs/cgi-bin/

 在目录下新建文件test.sh(写成test.cgi可能会逼格高一点,实际是一样的)

#!/bin/shecho "Content-type:text/html;charset=UTF8\n"echo ""echo "result=0&res_info=OK"

执行后应该能够返回

result=0&res_info=OK

 

再让我们干点cgi应该干的事情,解析输入,进行处理,再输出

这里要能够获取请求串中的参数就需要从环境变量env中取出REQUEST_METHOD和QUERY_STRING

REQUEST_METHOD为提交方式 get或post

QUERY_STRING为请求参数串,可能需要自己分割处理下

比如我需要调一个cgi查询手机号的验证码,传入的是手机号,处理逻辑是sql查询,返回的是查询结果

 

#!/bin/shecho "Content-type:text/html;charset=UTF8\n"echo ""method="$REQUEST_METHOD"mobile=`echo  $QUERY_STRING | cut -d "=" -f2`y=${mobile:0-3:1}xx=${mobile:0-2:2}verifycode=""verifycode=`mysql -uroot -p111111 -e "select Fverify_code from verify_code_$xx.t_code_$y where Fmobile_no='$mobile' order by Fcreate_time  desc limit 1"|grep -v Fverify_code` if [ !-n $verifycode ]; thenecho "fail"elseecho $verifycodefi

 curl "http://172.27.207.203:23080/wx_pay/v1.0/wx_get_sms.cgi?mobile=13xxxxxxxxxx” 或直接在浏览器中访问,返回的就是验证码,若不带参数或者mobile错误,则返回的是"fail"

 

 

转载于:https://www.cnblogs.com/opama/p/4241493.html

你可能感兴趣的文章
Python 初体验
查看>>
使用jenkins进行持续集成
查看>>
js算法入门(3)--递归
查看>>
免费的局域网文档协作办公方式—onlyoffice文档协作
查看>>
微信支付HTTPS服务器证书验证(PHP)
查看>>
前端笔试题面试题记录(上)
查看>>
webpack4升级指北
查看>>
springboot整合shiro使用shiro-spring-boot-web-starter
查看>>
Express4.x api 翻译(draft)
查看>>
我为什么晚上写代码?
查看>>
React+Redux开发实录(一)搭建工程脚手架
查看>>
我来阅读lodash源码——Math(一)
查看>>
Laravel 5.5 使用 Passport 实现 Auth 认证
查看>>
用python写通用restful api service(一)
查看>>
javascript this指针详解
查看>>
Hystrix:HystrixCollapser请求合并
查看>>
three.js 入门详解(一)
查看>>
Android基础之Java接口
查看>>
Angular开发实践(一):环境准备及框架搭建
查看>>
Vue2 源码漫游(二)
查看>>