0

我所在大学的网站有一个搜索表格,可以访问课程列表。您选择一堆标准(教师、学期等),然后按“获取课程部分”,它会显示所有符合给定标准的课程。我想得到所有的课程,所以我想弄清楚如何用我自己的参数直接调用那个按钮。我对 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.P_GetCrse”提交一个“POST”请求。不知何故,它还向该 URL 传递了一些参数(是 javascript?PHP?不知道)。

如果我尝试将调用的 url 放置在地址栏中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>
4

4 回答 4

1

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

就像是

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

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

错误说

许多程序匹配名称,但没有匹配签名(参数名称)

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

于 2012-08-09T15:41:14.390 回答
0

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

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

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

于 2012-08-09T15:32:15.313 回答
0

为了伪造对服务器的调用,您需要使用 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 

将 dummy 替换为正确的值,并将 ... 替换为其余值。这是假设该网站不检查 cookie。如果是这种情况,您必须将浏览器中的 cookie 添加到 CURL 调用中。检查 CURL 文档以了解如何做到这一点。

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

于 2012-08-09T15:40:07.570 回答
0

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

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

我点击它,发现标题“表单数据”下的请求中传递的所有参数。我以 url?p1:v1&p2:v2... 格式重写了它们,并在我的浏览器中打开了完整的 URL。成功!不需要 CURL。

于 2012-08-09T17:47:16.543 回答