我的大学网站有一个搜索表单来访问课程列表。您选择一系列标准(教师,学期等),然后按“获取课程部分”,它会显示符合给定条件的所有课程。我想获得所有课程,所以我想弄清楚如何使用我自己的参数直接调用该按钮。我对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?没有线索)。
如果我尝试在地址栏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>
答案 0 :(得分:1)
提交form
时,表单中的所有字段都会提交给服务器。在您的表单中,您有一堆隐藏字段,所有这些隐藏字段都作为参数传递给POST请求中的服务器。
像
这样的东西/pban1/bwskfcls.P_GetCrse?term_in=201209&sel_subj=dummy...
服务器(看起来像)使用参数调用存储过程(可能是在剥离了dummy
作为值的参数之后。)
错误说
许多程序匹配名称,但没有匹配签名(参数 名称)
所以看起来已经为某些参数集定义了程序,但并非所有参数都定义了。因此,可能存在使用faculty
和term
作为输入进行搜索的存储过程,但仅适用于faculty
。
答案 1 :(得分:0)
示例中的表单将<input type="hidden" ../>
字段中给出的所有参数传递给脚本。在您的示例代码中,没有涉及JavaScript(但CheckSubmit()
),但我认为,JavaScript用于设置这些输入字段的值。
您最好的机会是提交所有这些内容,只修改符合搜索条件的内容。
要手动发出请求,您可以使用linux / unix控制台中的curl等工具。
答案 2 :(得分: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库的服务器代码中执行此操作。
答案 3 :(得分:0)
我明白了。感谢您的回答,他们提供了一些帮助,但我还需要进行一些挖掘,以找出所需的确切签名。
我所做的是在Chrome中打开开发人员工具(Ctrl + Shift + I),然后切换到网络标签。在那里,我能够监控所有网络活动。然后我按下了“获取课程部分”按钮。瞧,我看到POST请求弹出!
我点击它,发现所有参数都在标题“表单数据”下的请求中传递。我在url?p1:v1&amp; p2:v2 ...格式中重写了它们,并在浏览器中打开了完成的URL。成功!没有必要的CURL。