服务器脚本可以检测表单是使用提交按钮还是使用javascript:submit()发布的

Can server script detect if a form is posted with submit button or with javascript:Submit()

本文关键字:submit javascript 提交 脚本 检测 表单 按钮 服务器      更新时间:2023-09-26

这个问题让我整个星期都很忙,我在网上几乎找不到任何东西。。。

我想做的很简单。。。在我自己的网站上,创建一个服务器端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的值将是Opt123Opt456,具体取决于按下的按钮,而如果按下链接,则它将是等效的nullPHP

即使提交按钮是表单的一部分,浏览器也只在实际单击按钮时发送其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);    

这添加了一个与提交按钮同名的隐藏表单元素,因此服务器将无法区分。