服务器脚本可以检测表单是使用提交按钮还是使用javascript:submit()发布的
Can server script detect if a form is posted with submit button or with javascript:Submit()
这个问题让我整个星期都很忙,我在网上几乎找不到任何东西。。。
我想做的很简单。。。在我自己的网站上,创建一个服务器端PHP脚本,使用有效凭据登录到另一个网站,并下载我想要处理的文件。
我使用curl_init()、curl_setopt()和curl_exec()来实现这一点。它不起作用。
所以我把那个网页拆了下来,想弄清楚出了什么问题。正如您在html代码中看到的,表单的操作事件是在提交正确凭据时检索文件的url。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<form name="form1" method="post" action="http://otherwebsite/login.aspx?ReturnUrl=/export_file.aspx?id=xxxxxxx" >
<script type="text/javascript" language="JavaScript">
function Submit_Form()
{
document.form1.Login$UserName.value="myname";
document.form1.Login$Password.value="mypassword";
//document.form1.Login$LoginButton.click();
document.form1.submit();
}
</script>
<input type="hidden" name="Login$UserName" value="myname" />
<input type="hidden" name="Login$Password" value="mypassword" />
<input name="Login$LoginButton" type="submit" />
<br /><a href="javascript:Submit_Form();">Login</a>
</form>
</body>
</html>
这就是它变得奇怪的地方。如果我按下按钮,它就会工作,我就会收到下载文件。如果我点击超链接,我会得到一个页面,上面写着正确登录。当我取消注释javascript行:click()时,它也能工作。
因此,它归结为:为什么按钮submit有效,而javascript submit无效?有没有办法让其他网站的服务器检查表格是如何发布的?谢谢你的想法!
单击按钮时,它的名称会包含在POST请求中,因为它是一个命名的submit
按钮。当您使用链接时,按钮的名称不会在POST数据中传递。
当你使用链接时,你可能会通过一个隐藏的字段来欺骗按钮,该字段的名称应该是:
<input type="hidden" name="Login$UserName" value="myname" />
<input type="hidden" name="Login$Password" value="mypassword" />
<input type="hidden" name="Login$LoginButton" />
请注意,它不需要值,因为它所替换的按钮没有设置其文本的值。仅仅包括它就足够了。
为什么不使用另一个名为js_submitted
、值为false
的隐藏字段,并在Submit_Form()
函数中,在激发submit()
方法之前将其设置为true
?然后,在PHP中(例如),您可以查找$_GET/$_POST['js_submitted']
来确定使用了哪种提交方法。
可以检查按钮是否随提交一起发布。也许他们正在检查这个。
是的,很容易发现按钮何时提交表单,而这正是网站可能要做的。
按钮是一个表单控件,因此,当提交表单时,按钮状态也会被提交。这意味着,当您在接收post
的服务器上检查表单对象时,您会看到它包含一个与button
同名的键,并且它的值设置为按钮的value
属性。
假设您有一个form
:
<form id="form1" action="abc.asp" method="post">
<input type="submit" name="btn" value="Opt123" />
<input type="submit" name="btn" value="Opt456" />
<a href="javascript:Submit_Form();">Send</a>
</form>
我不是PHP
的人,所以代码可能不是最好的:
$item = $_POST['btn'];
在这种情况下,$item
的值将是Opt123或Opt456,具体取决于按下的按钮,而如果按下链接,则它将是等效的null
或PHP
。
即使提交按钮是表单的一部分,浏览器也只在实际单击按钮时发送其name=value
对作为发布数据的一部分。当您从Javascript调用.submit()
方法时,浏览器会将数据Login$Username=myname&Login$Password=mypassword
发送到服务器。但当您实际点击按钮时,它会发送Login$Username=myname&Login$Password=mypassword&Login$LoginButton=
。正如您所看到的,服务器很容易区分这两者。
因此,您可以通过隐藏该元素来欺骗表单,使其始终发送该元素。在Submit_Form
中,就在您说document.form1.submit();
之前,添加以下内容:
var sbtn_hid = document.createElement('input');
sbtn_hid.type = 'hidden';
sbtn_hid.name = 'Login$LoginButton';
sbtn_hid.value = '';
document.form1.appendChild(sbtn_hid);
这添加了一个与提交按钮同名的隐藏表单元素,因此服务器将无法区分。
- Javascript form.submit()方法是如何工作的
- javascript表单字段submit:Object dos'在IE8中不支持此属性或方法
- 如何使用SpringWebFlow在JavaScript中处理form.submit()
- 如何获得<html:submit>按钮是在javascript中单击的
- jQuery .submit() 不适用于 javascript 生成的 html 表单
- 使用JavaScript onclick-submit执行PHP
- 当我使用javascript向跨域POST时,我会得到一致的行为吗;document.forms[0].submit()
- 如何在使用JavaScript submit()函数时运行HTML5表单验证
- jQuery $('#form').submit() versus javascript documen
- javascript form.submit() 丢失由 GA _linkByPost 创建的查询字符串
- 如何在 JavaScript 中访问 data.submit() 的 json 响应对象
- Javascript 中 form.submit 和 window.open() 之间的区别
- POSTDATA 未使用 javascript submit() 函数传递
- 使用 Javascript 提交表单,输入名为 submit
- JavaScript:表单刷新页面,更改此.form.submit问题
- 用javascript创建的HTML表单不会响应.submit
- Chrome - 如何通过javascript提交具有输入名称=submit的表单
- JavaScript 表单提交带有一个名为 submit 的字段
- .submit in javascript vs .submit in jquery
- 当用户点击'submit'- javascript或php