如何获取方法签名

How to get method signature

本文关键字:方法 获取 何获取      更新时间:2023-09-26

我的大学网站有一个搜索表单来访问课程列表。您选择一堆标准(教师,学期等),然后按"获取课程部分",它会显示与给定标准匹配的所有课程。我想获取所有课程,所以我想弄清楚如何使用自己的参数直接调用该按钮。我对HTML和javascript的了解很少,但我认为我正在取得一些进展。这是相关的(我认为)来源:

<form action="/pban1/bwskfcls.P_GetCrse" method="POST" onsubmit="return checkSubmit()">
<br>
<input type="hidden" name="term_in" value="201209">
<input type="hidden" name="sel_subj" value="dummy">
<input type="hidden" name="sel_day" value="dummy">
<input type="hidden" name="sel_schd" value="dummy">
<input type="hidden" name="sel_insm" value="dummy">
<input type="hidden" name="sel_camp" value="dummy">
<input type="hidden" name="sel_levl" value="dummy">
<input type="hidden" name="sel_sess" value="dummy">
<input type="hidden" name="sel_instr" value="dummy">
<input type="hidden" name="sel_ptrm" value="dummy">
<input type="hidden" name="sel_attr" value="dummy">
<table class="dataentrytable" summary="Table is used to present the course search criteria" .. </table>
<br>
<input type="submit" value="Get Course Sections">
<input type="reset" value="Reset">
</form>

理解它的方式(我很容易出错),当你按下按钮时,它会调用函数 checkSubmit()(它有简单的代码),然后向"/pban1/bwskfcls"提交"POST"请求。P_GetCrse"。不知何故,它还会将一些参数传递给该 URL(它是 javascript 吗?.PHP?没有线索)。

如果我尝试将调用的网址放在地址栏中,https://banweb.mcgill.ca/pban1/bwskfcls.P_GetCrse它会打开一个页面,并显示以下错误:

mod_plsql: /pban1/bwskfcls.P_GetCrse HTTP-404 bwskfcls.P_GetCrse: MANY PROCEDURES MATCH NAME, BUT NONE MATCHES SIGNATURE (parameter names)

所以我明白我没有传递正确的参数。我必须传递哪些参数,我该怎么做?

如果需要任何其他来源,我很乐意发布它。任何输入或澄清都值得赞赏,我只是通过反复试验和大量谷歌搜索未知术语才能达到这一点。

编辑:这是 checksubmit() 的代码

<script language="JavaScript" type="text/javascript">
<!-- Hide JavaScript from older browsers 
var submitcount=0;
function checkSubmit() {
if (submitcount == 0)
   {
   submitcount++;
   return true;
   }
else
   {
alert("Your changes have already been submitted.");
   return false;
   }
}
//  End script hiding -->
</script>

提交form时,表单中的所有字段都将提交到服务器。在您的表单中,您有一堆隐藏字段,所有这些隐藏字段都作为参数在 POST 请求中传递给服务器。

类似的东西

/pban1/bwskfcls.P_GetCrse?term_in=201209&sel_subj=dummy...

服务器它们(看起来像)调用带有参数的存储过程(大概是在剥离了以dummy为值的参数之后)。

错误说

许多过程与名称匹配,但没有一个与签名匹配(参数 名称)

因此,看起来已经为某些参数集定义了过程,但不是所有参数。因此,可能有一个存储过程可以使用facultyterm作为输入进行搜索,但没有一个仅用于faculty

示例中的

表单将<input type="hidden" ../>字段中给出的所有参数传递给脚本。在您的示例代码中,不涉及JavaScript(但CheckSubmit()),但我假设JavaScript用于设置这些输入字段的值。

您最好的机会是提交所有这些,然后修改符合您的搜索条件的那些。

要手动发出请求,您可以使用 linux/unix 控制台中的 curl 等工具。

为了伪造对服务器的调用,您需要使用 POST 调用打开页面。您无法从浏览器中执行此操作。您可以使用服务器端代码或 CURL 请求,例如

CURL -X POST -d 'term_in=201209&sel_subj=dummy&sel_day=dummy&sel_schd=dummy......' https://banweb.mcgill.ca/pban1/bwskfcls.P_GetCrse 

将虚拟人替换为正确的值并替换...与其余值。这是假设网站没有检查cookie。如果是这种情况,您必须将浏览器中的 cookie 添加到 CURL 调用中。查看 CURL 文档了解如何执行此操作。

您也可以在具有 curl 库的服务器代码中执行此操作。

我想通了。感谢您的回答,它们有一些帮助,但我不得不做更多的挖掘才能找出所需的确切签名。

我所做的是在Chrome中打开开发人员工具(Ctrl + Shift + I),然后切换到网络选项卡。在那里,我能够监视所有网络活动。然后我按下了"获取课程部分"按钮。你瞧,我看到弹出了 POST 请求!

我单击它,发现在标题"表单数据"下请求中传递的所有参数。我在url?p1:v1&p2:v2...格式,并在我的浏览器中打开了完成的 URL。成功!无需卷曲。