1.房产中介管理系统相关软件
2.ASP中,黑名黑名为了上传,单A单系在form表单中用了enctype=multipart/form-data。源码如何将保存在数据库的统源显示出来
3.盘点那些渗透测试中的奇*技巧
4.帮忙解释这个ASP程序的含义
房产中介管理系统相关软件
房产中介管理软件推荐 免费软件:地鼠 (单机版): 适用于单一门店,不支持多店联网。黑名黑名
房介宝 (C\S架构): 免费版仅限单机使用,单A单系java 源码之家适合小型中介。源码
网络版软件:易房大师 (B/S架构): 功能全面,统源联网多店,黑名黑名有房源采集和集成网站功能。单A单系具有中介黑名单过滤功能,源码稳定性佳,统源客户群体广泛,黑名黑名发展迅速。单A单系
梵讯房屋管理系统 (CS架构): 支持多门店联网,源码虽为收费软件,但因其全国用户量大,值得关注。
收费软件:中崛科技 (房管家): B/S架构,专业版元/店,标准版元/店,ZQGBack源码普及版元/店,包括手机版和专业行业版如厂房版、车管家ERP等。
易遨中国: BS架构,标准版元/店,专业版元/店,提供免费升级维护服务,拥有多个独立品牌。
房友 (CS架构): 普及版到专业版价格不等,联网包额外收费,部分客户已转向BS架构版本。
房介宝 (CS架构): 提供不同版本,价格从元/店起,联网包元。
房介通 (CS架构): 少数城市仍在使用,普及版元/店。
曳光蓝弓 (CS架构): 元/店。
房博士 (BS架构): 公司已不存在,详情不明。
本地与网络存储选项:地虎 (BS架构): 数据可在本地或网络选择,gige源码月费元/店,买断价元,部分城市有用户。
手机应用:梵讯手机应用 (支持Android和iOS): 与梵讯房屋管理系统配套,便于移动管理。
房管家: 支持多种移动平台, 包括Iphone、Ipad和Android。
源码类软件:如美加喜 (php), 恒发 (asp), 蓝狐 (asp),这些软件可能提供定制化解决方案。
ASP中,为了上传,在form表单中用了enctype=multipart/form-data。如何将保存在数据库的显示出来
form表单中用了enctype=multipart/form-data
那么保存的数据会变成乱码或者不显示.
解决办法
1:普通数据表单提交,在上传的地方,用iframe套入上传页面,然后把上传路径传给session值,提交后记录到数据库.
2:在上传的时候,打开一个新窗口页面进行上传,上传之后将路径值回转给本页面的表单文本,然后录入数据库.
第一种方法我不举例了,那种是最傻瓜式的,也是有一点坏处,第二种我举例
index.html
<form name="form1" action="xxxx.asp" method="post">
姓名:<input name="names" type="text"><br/>
照片:<input name="Memo" type="text" size="" value="可以手动填入路径">
<input type="button" name="Submit" value="上传" onClick="window.open('upfile.asp?formname=form1&editname=Memo&uppath=/upfile&filelx=jpg','','status=no,scrollbars=no,top=,left=,width=,height=')">
'在这里填好表单更换的值,注意Memo这个就是文本名,区分大小写
</form>
upfile.asp
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb">
<style type="text/css">
<!--
td{ font-size:px}
a{ color:#;text-decoration: none}
a:hover{ text-decoration: underline}
.tx{ height:px;width:px;border-color:black black #;border-top-width:0px;border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; font-size: px; background-color: #eeeeee; color: #FF}
.button{ font-size:px;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width: 0px; height: px; width: px; background-color: #eeeeee; cursor: hand}
.tx1{ height:px;width:px;font-size:px;border:1px solid;border-color:black black #;color: #FF}
-->
</style>
<script language="javascript">
<!--
function mysub()
{
var strFileName=form1.file1.value;
if (strFileName=="")
{
alert("请选择要上传的文件");
return false;
}
esave.style.visibility="visible";
}
-->
</script>
</head>
<body bgcolor="#FFFFFF" text="#">
<form name="form1" method="post" action="uploadnew.asp" enctype="multipart/form-data" onSubmit="return mysub()">
<div id="esave" style="position:absolute; top:px; left:px; z-index:; visibility:hidden">
<TABLE WIDTH= BORDER=0 CELLSPACING=0 CELLPADDING=0>
<TR><td width=%></td>
<TD bgcolor=#A7B width="%">
<TABLE WIDTH=% height= BORDER=0 CELLSPACING=1 CELLPADDING=0>
<TR>
<td bgcolor=#eeeeee align=center><font color=red>正在上传文件,请稍候...</font></td>
</tr>
</table>
</td><td width=%></td>
</tr>
</table>
</div>
<table width="" border="0" cellspacing="1" cellpadding="0" align="center" bgcolor="#6A7F9A">
<tr>
<td height="" align="left" valign="middle" width=""><input type="hidden" name="EditName" value="<%=EditName%>">
<input type="hidden" name="FormName" value="<%=formName%>">
<input type="hidden" name="act" value="uploadfile">
</td>
</tr>
<tr align="center" valign="middle">
<td align="left" id="upid" height="" width="" bgcolor="#FFFFFF"> 选择文件:
<input type="file" name="file1" style="width:'" class="tx1" value="">
</td>
</tr>
<tr align="center" valign="middle">
<td height="" width="">
<input type="submit" name="Submit" value="· 开始上传 ·" class="button">
</td>
</tr>
</table>
</form>
</body>
</html>
up.asp
<%
class clsUp '文件上传类
'------------------------
Dim Form,File
Dim AllowExt_ '允许上传类型(白名单)
Dim NoAllowExt_ '不允许上传类型(黑名单)
Private oUpFileStream '上传的数据流
Private isErr_ '错误的代码,0或true表示无错
Private ErrMessage_ '错误的字符串信息
Private isGetData_ '指示是否已执行过GETDATA过程
'------------------------------------------------------------------
'类的属性
Public Property Get Version
Version=""
End Property
Public Property Get isErr '错误的代码,0或true表示无错
isErr=isErr_
End Property
Public Property Get ErrMessage '错误的字符串信息
ErrMessage=ErrMessage_
End Property
Public Property Get AllowExt '允许上传类型(白名单)
AllowExt=AllowExt_
End Property
Public Property Let AllowExt(Value) '允许上传类型(白名单)
AllowExt_=LCase(Value)
End Property
Public Property Get NoAllowExt '不允许上传类型(黑名单)
NoAllowExt=NoAllowExt_
End Property
Public Property Let NoAllowExt(Value) '不允许上传类型(黑名单)
NoAllowExt_=LCase(Value)
End Property
'----------------------------------------------------------------
'类实现代码
'初始化类
Private Sub Class_Initialize
isErr_ = 0
NoAllowExt="" '黑名单,可以在这里预设不可上传的文件类型,以文件的后缀名来判断,不分大小写,每个每缀名用;号分开,如果黑名单为空,则判断白名单
NoAllowExt=LCase(NoAllowExt)
AllowExt="" '白名单,可以在这里预设可上传的文件类型,以文件的后缀名来判断,不分大小写,每个后缀名用;号分开
AllowExt=LCase(AllowExt)
isGetData_=false
End Sub
'类结束
Private Sub Class_Terminate
on error Resume Next
'清除变量及对像
Form.RemoveAll
Set Form = Nothing
File.RemoveAll
Set File = Nothing
oUpFileStream.Close
Set oUpFileStream = Nothing
End Sub
'分析上传的数据
Public Sub GetData (MaxSize)
'定义变量
on error Resume Next
if isGetData_=false then
Dim aaaaaa,sSpace,bCrLf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,ofileinfo
Dim sFormValue,sFileName
Dim iFindStart,iFindEnd
Dim iFormStart,iFormEnd,sFormName
'代码开始
If Request.TotalBytes < 1 Then '如果没有数据上传
isErr_ = 1
ErrMessage_="没有数据上传"
Exit Sub
End If
If MaxSize > 0 Then '如果限制大小
If Request.TotalBytes > MaxSize Then
isErr_ = 2 '如果上传的数据超出限制大小
ErrMessage_="上传的数据超出限制大小"
Exit Sub
End If
End If
Set Form = Server.CreateObject ("Scripting.Dictionary")
Form.CompareMode = 1
Set File = Server.CreateObject ("Scripting.Dictionary")
File.CompareMode = 1
Set tStream = Server.CreateObject ("ADODB.Stream")
Set oUpFileStream = Server.CreateObject ("ADODB.Stream")
oUpFileStream.Type = 1
oUpFileStream.Mode = 3
oUpFileStream.Open
oUpFileStream.Write Request.BinaryRead (Request.TotalBytes)
oUpFileStream.Position = 0
aaaaaa = oUpFileStream.Read
iFormEnd = oUpFileStream.Size
bCrLf = ChrB () & ChrB ()
'取得每个项目之间的分隔符
sSpace = MidB (aaaaaa,1, InStrB (1,aaaaaa,bCrLf)-1)
iStart = LenB(sSpace)
iFormStart = iStart+2
'分解项目
Do
iInfoEnd = InStrB (iFormStart,aaaaaa,bCrLf & bCrLf)+3
tStream.Type = 1
tStream.Mode = 3
tStream.Open
oUpFileStream.Position = iFormStart
oUpFileStream.CopyTo tStream,iInfoEnd-iFormStart
tStream.Position = 0
tStream.Type = 2
tStream.CharSet = "gb"
sInfo = tStream.ReadText
'取得表单项目名称
iFormStart = InStrB (iInfoEnd,aaaaaa,sSpace)-1
iFindStart = InStr (,sInfo,"name=""",1)+6
iFindEnd = InStr (iFindStart,sInfo,"""",1)
sFormName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
'如果是文件
If InStr (,sInfo,"filename=""",1) > 0 Then
Set ofileinfo = new clsFileInfo
'取得文件属性
iFindStart = InStr (iFindEnd,sInfo,"filename=""",1)+
iFindEnd = InStr (iFindStart,sInfo,""""&vbCrLf,1)
sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
ofileinfo.FileName = GetFileName(sFileName)
ofileinfo.FilePath = GetFilePath(sFileName)
ofileinfo.FileExt = GetFileExt(sFileName)
iFindStart = InStr (iFindEnd,sInfo,"Content-Type: ",1)+
iFindEnd = InStr (iFindStart,sInfo,vbCr)
ofileinfo.FileMIME = Mid(sinfo,iFindStart,iFindEnd-iFindStart)
ofileinfo.FileStart = iInfoEnd
ofileinfo.FileSize = iFormStart -iInfoEnd -2
ofileinfo.FormName = sFormName
file.add sFormName,ofileinfo
else
'如果是表单项目
tStream.Close
tStream.Type = 1
tStream.Mode = 3
tStream.Open
oUpFileStream.Position = iInfoEnd
oUpFileStream.CopyTo tStream,iFormStart-iInfoEnd-2
tStream.Position = 0
tStream.Type = 2
tStream.CharSet = "gb"
sFormValue = tStream.ReadText
If Form.Exists (sFormName) Then
Form (sFormName) = Form (sFormName) & ", " & sFormValue
else
Form.Add sFormName,sFormValue
End If
End If
tStream.Close
iFormStart = iFormStart+iStart+2
'如果到文件尾了就退出
Loop Until (iFormStart+2) >= iFormEnd
aaaaaa = ""
Set tStream = Nothing
isGetData_=true
end if
End Sub
'保存到文件,自动覆盖已存在的同名文件
Public Function SaveToFile(Item,Path)
SaveToFile=SaveToFileEx(Item,Path,True)
End Function
'保存到文件,自动设置文件名
Public Function AutoSave(Item,Path)
AutoSave=SaveToFileEx(Item,Path,false)
End Function
'保存到文件,OVER为真时,自动覆盖已存在的同名文件,否则自动把文件改名保存
Private Function SaveToFileEx(Item,Path,Over)
On Error Resume Next
Dim oFileStream
Dim tmpPath
Dim nohack '防黑缓冲
isErr=0
Set oFileStream = CreateObject ("ADODB.Stream")
oFileStream.Type = 1
oFileStream.Mode = 3
oFileStream.Open
oUpFileStream.Position = File(Item).FileStart
oUpFileStream.CopyTo oFileStream,File(Item).FileSize
nohack=split(path,".") '重要修改,防止黑客"\0"断名伪装!!!
tmpPath=nohack(0)&"."&nohack(ubound(nohack)) '重要修改,防止黑客"\0"断名伪装!!!
if Over then
if isAllowExt(GetFileExt(tmpPath)) then
oFileStream.SaveToFile tmpPath,2
Else
isErr_=3
ErrMessage_="该后缀名的文件不允许上传!"
End if
Else
Path=GetFilePath(Path)
if isAllowExt(File(Item).FileExt) then
do
Err.Clear()
nohack=split(Path&GetNewFileName()&"."&File(Item).FileExt,".") '重要修改,防止黑客"\0"断名伪装!!!
tmpPath=nohack(0)&"."&nohack(ubound(nohack)) '重要修改,防止黑客"\0"断名伪装!!!
oFileStream.SaveToFile tmpPath
loop Until Err.number<1
oFileStream.SaveToFile Path
Else
isErr_=3
ErrMessage_="该后缀名的文件不允许上传!"
End if
End if
oFileStream.Close
Set oFileStream = Nothing
if isErr_=3 then SaveToFileEx="" else SaveToFileEx=GetFileName(tmpPath)
End Function
'取得文件数据
Public Function FileData(Item)
isErr_=0
if isAllowExt(File(Item).FileExt) then
oUpFileStream.Position = File(Item).FileStart
FileData = oUpFileStream.Read (File(Item).FileSize)
Else
isErr_=3
ErrMessage_="该后缀名的文件不允许上传!"
FileData=""
End if
End Function
'取得文件路径
Public function GetFilePath(FullPath)
If FullPath <> "" Then
GetFilePath = Left(FullPath,InStrRev(FullPath, "\"))
Else
GetFilePath = ""
End If
End function
'取得文件名
Public Function GetFileName(FullPath)
If FullPath <> "" Then
GetFileName = mid(FullPath,InStrRev(FullPath, "\")+1)
Else
GetFileName = ""
End If
End function
'取得文件的后缀名
Public Function GetFileExt(FullPath)
If FullPath <> "" Then
GetFileExt = LCase(Mid(FullPath,InStrRev(FullPath, ".")+1))
Else
GetFileExt = ""
End If
End function
'取得一个不重复的序号
Public Function GetNewFileName()
dim ranNum
dim dtNow
dtNow=Now()
ranNum=int(*rnd)+
GetNewFileName=year(dtNow) & right("0" & month(dtNow),2) & right("0" & day(dtNow),2) & right("0" & hour(dtNow),2) & right("0" & minute(dtNow),2) & right("0" & second(dtNow),2) & ranNum
End Function
Public Function isAllowExt(Ext)
if NoAllowExt="" then
isAllowExt=cbool(InStr(1,";"&AllowExt&";",LCase(";"&Ext&";")))
else
isAllowExt=not CBool(InStr(1,";"&NoAllowExt&";",LCase(";"&Ext&";")))
end if
End Function
End Class
'----------------------------------------------------------------------------------------------------
'文件属性类
Class clsFileInfo
Dim FormName,FileName,FilePath,FileSize,FileMIME,FileStart,FileExt
End Class
%>
UpLoadNew.asp
<%
filepath="/Uploadfile/" '上传路径
filepathname = "/Uploadfile/"
set upload=new clsUp '建立上传对象
upload.NoAllowExt="asp;asa;cer;aspx;cs;vb;js;zip;rar;exe" '设置上传类型的黑名单
upload.GetData () '取得上传数据,限制最大上传3M
if upload.form("act")="uploadfile" then
for each formName in upload.File
set file=upload.File(formName)
fileExt=lcase(file.FileExt) '得到的文件扩展名不含有.
if file.filesize< then
response.write "<span style=""font-family: 宋体; font-size: 9pt"">请先选择你要上传的文件! [ <a href=# onclick=history.go(-1)>重新上传</a> ]</span>"
response.end
end if
if file.filesize>(*) then
response.write "<span style=""font-family: 宋体; font-size: 9pt"">最大只能上传 K 的文件! [ <a href=# onclick=history.go(-1)>重新上传</a> ]</span>"
response.end
end if
dtNow=Now()
randomize
ranNum=int(*rnd)+
filename1=year(dtNow) & right("0" & month(dtNow),sin源码2) & right("0" & day(dtNow),2) & right("0" & hour(dtNow),2) & right("0" & minute(dtNow),2) & right("0" & second(dtNow),2) & ranNum &"."&fileExt
filename=filepath&filename1
filelstname=filepathname&filename1
if file.FileSize>0 then ''如果 FileSize > 0 说明有文件数据
upload.SaveToFile formName,Server.mappath(FileName)
'这里可以存数据库
if upload.form("EditName")="content" then
strJS="<SCRIPT language=javascript>" & vbcrlf
strJS=strJS & "content=window.opener.document.myform.content.value;"
strJS=strJS &"content=content+'<a href=" & filelstname & " target=""_blank""><div align=""center""><img src=" &filelstname & " border=""0""></div></a><br><br>';" & vbcrlf
'strJS=strJS &"content=content+'<a href=" & "../"&filelstname & " target=""_blank""><img src=" & "../"&filelstname & " border=""0""></a><br><br>';" & vbcrlf
strJS=strJS & "window.opener.document.myform.content.value=content;" & vbcrlf
strJS=strJS & "</script>"
response.write strJS
else
response.write "<script>window.opener.document."&upload.form("FormName")&"."&upload.form("EditName")&".value='"&filelstname&"'</script>"
end if
%>
<script language="javascript">
window.alert("文件上传成功!请修改链接地址!");
window.close();
</script>
<%
end if
set file=nothing
next
set upload=nothing
end if
%>
盘点那些渗透测试中的奇*技巧
总结下渗透测试中的一些小技巧,仅做总结。
0x php文件包含姿势
这类姿势国外黑阔早有总结,比如包含上传的文件,当然文件可控。利用php封装协议php://input和data://,包含post数据造成php命令执行,当然allow_url_include选项需要打开。包含log文件也是可以,当我们提交恶意代码时也会被记录,于是包含记录了恶意代码的log文件是个好主意。包含/proc/self/environ文件:这需要PHP运行作为一个具有cgion/proc伪文件的系统且PHP脚本有权访问这些伪文件。包含会话文件需要攻击者能控制会话中的任何字符串值(注入代码,例如phpinfo(),会话文件必须存放在serializedsession文件且PHP脚本能够访问会话文件(通常是/tmp/ sess_SESSIONID文件)。包含其他由php应用创建的文件,只要你能想到的,都可以尝试创建然后包含他,比如数据库文件,缓存文件,真伪源码应用程序级别的日志。
0x .htaccess文件突破黑名单解析
因为是黑名单,自定义.htaccess上传,内容为test.jpg文件,没有扩展名,内容是一句话,这个时候就成功绕过。
0x php流封装绕过截断
主要利用了PHP的一个流封装特性,可以参考PHP官方文档中的Example #3。假设存在文件包含的代码,但%无法截断,只能包含 xxxx.html.php。首先新建hello.html.php,内容为phpinfo();然后压缩成zip,结构如下图。然后访问网址,成功包含压缩文件内的hello.html.php。把我们输入的变量和include后面的变量合起来就是zip://test.zip#hello.html.php,代表当前目录下的test.zip压缩包里面的hello.html.php,于是包含成功。
0x 通用防注入系统getshell
相信许多朋友渗透测试都遇到过这种情况,系统做了数据提交记录,通过阅读类似程序的源码得知数据记录在sqlin.asp。于是想到直接提交一句话木马,但没有成功。提交and 1= ,通过菜刀连接sqlin.php即可。
0x iis+php黑名单上传突破
在php+window+iis环境下,双引号(“>”)等价于点号(“.”),大于符号(“>”)等价于问号(“?”),小于符号(“<“)等价于星号(“*”)。虽然有这么多好玩的东西,但这特性只能用于文件上传时覆盖已知的文件,于是这特性便略显鸡肋。但通过一系列的测试发现,P牛已经给出完美利用的方法。首先利用特殊办法生成一个php文件,然后再利用该特性将文件覆盖。可问题来了,怎样生成php文件呢?如果可以直接生成php文件的话,干嘛还要利用那什么特性?别急,办法总是有的。我们知道在文件上传时,我们往往会考虑到文件名截断,如%等。对!有的人可能还会用冒号(“:”)去截断,如:bypass.php:jpg。但你知道吗?冒号截断产生的文件是空白的,里面并不会有任何的内容。虽然生成的php文件里面没有内容,但是php文件总生成了吧,所以我们可以结合上面所说的特性完美成功利用。按照上面提供的思路,实现本地测试地址:http://**.**.**.**/upfile.php 环境:Windows+IIS7.5。首先利用冒号生成我们将要覆盖的php文件,这里为:bypass.php,点击forward后,可以看见成功生成空白的bypass.php文件。利用上面的系统特性覆盖该文件,从上面已经知道“<”就等于“*”,而“*”代码任意字符,于是乎..我们可以这样修改上传的文件名,点击go..,即可成功覆盖bypass.php文件。
帮忙解释这个ASP程序的含义
1、<%@ language=JScript %>
声明使用的语言为JS
2、<!--#include file="adojavas.inc" -->
调用adojavas.inc文件
3、<%
conn = Server.CreateObject("ADODB.Connection");
conn.Open("driver={ Microsoft Access Driver (*.mdb)};dbq=" + Server.MapPath("szg.mdb"));
ASP与ACCESS连接,DRIVER那句是ACCESS的驱动,SZG.MDB是数据库名称
4、rs = Server.CreateObject("ADODB.Recordset");
sql = "黑名单";
rs.Open(sql, conn, adOpenStatic);
打开数据库
//参数解析
5、QueryString =Request("button_sc")(1);
调取button_sc的值不赋给变量QueryString
6、if (QueryString.substring(6,7) == "0")
{
ok = QueryString.substring(7,8);
}
else
{
ok = QueryString.substring(6,8);
}
以上是如果传过来的字符串的第6-7位是-的话则把第7-8位赋给OK变量,否则则把第6-8位赋给OK变量
7、ok=parseInt(ok);
对OK变量进行数值整数转换
8、RecNo =ok;
将OK值赋给RecNo
9、PageNo = (RecNo-1) / + 1;
对RecNo进行计算操作,减1除后加1
、PageNo=parseInt(PageNo);
再次对OK变量进行数值整数转换
、Response.Write("<h1><center>考分详细信息</center></h1>");
Response.Write("<body bgcolor=beige>");
1号字体居中显示并定义了下面字的颜色
、if (!(0==RecNo))
如果取得的RecNo的值不等于0,则进行{ }之间的操作
{
、rs.AbsolutePosition=RecNo;
取得第RecNo条记录的资料
、 szg="<h2>" + rs.Fields(1).Value + "同志的信息如下:</h2>学号是:" + rs.Fields(0).Value;
szg=szg + "<br>GRE考分为:" + rs.Fields(2).Value + "<br>TOEFL的考分为:" + rs.Fields(3).Value;
以上是两次赋值操作,将姓名、学号、考分、总分字段及相关文字赋给szg变量
、Response.Write(szg);
写出szg变量
}
、Response.Write("</body>");
HTML结束语
、%>
JS结束语
----------------------------
一、Request 对象
可以使用 Request 对象访问任何基于 HTTP 请求传递的所有信息,包括从 HTML 表格用 POST 方法或 GET 方法传递的参数、cookie 和用户认证。Request 对象使您能够访问客户端发送给服务器的二进制数据。
Request 的语法 :
Request[. 集合 | 属性 | 方法 ]( 变量 )
在这里作者将挑选一些常用的对象语法进行分析
1、Form
Form 集合通过使用 POST 方法的表格检索邮送到 HTTP 请求正文中的表格元素的值。
语法
Request.Form(element)[(index)|.Count]
参数
element 指定集合要检索的表格元素的名称。
index 可选参数,使用该参数可以访问某参数中多个值中的一个。它可以是 1 到 Request.Form(parameter).Count 之间的任意整数。
Count 集合中元素的个数
Form 集合按请求正文中参数的名称来索引。Request.Form(element) 的值是请求正文中所有 element 值的数组。通过调用 Request.Form(element).Count 来确定参数中值的个数。如果参数未关联多个值,则计数为 1。如果找不到参数,计数为 0。要引用有多个值的表格元素中的单个值,必须指定 index 值。index 参数可以是从 1 到 Request.Form(element).Count 中的任意数字。如果引用多个表格参数中的一个,而未指定 index 值,返回的数据将是以逗号分隔的字符串。