Может ли серверный скрипт определить, опубликована ли форма с помощью кнопки отправки или с помощью javascript: Submit () - PullRequest
0 голосов
/ 14 марта 2012

Эта проблема заставляет меня быть занятой всю неделю, и я почти ничего не нахожу в сети ...

То, что я хочу сделать, это просто ... на моем собственном веб-сайте создать PHP-скрипт на стороне сервераэто делает вход на другой веб-сайт с действительными учетными данными и загружает файл, который я хочу обработать.

Я использую curl_init (), curl_setopt () и curl_exec (), чтобы добиться этого.Это не работает.

Поэтому я сократил эту веб-страницу, чтобы выяснить, в чем дело.Как вы можете видеть в html-коде, событие action формы - это 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 () она тоже работает.

Итак, все сводится к следующему: почему кнопка отправки работает, а отправка javascript не работает?Есть ли способ, чтобы сервер другого сайта проверял, как была размещена форма?Спасибо за ваши мысли!

Ответы [ 5 ]

0 голосов
/ 14 марта 2012

Даже несмотря на то, что кнопка отправки является частью формы, браузер отправляет свою пару name=value как часть данных публикации, только если кнопка была нажата. Когда вы вызываете метод .submit() из Javascript, ваш браузер отправляет данные 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);    

Это добавляет скрытый элемент формы с тем же именем, что и кнопка отправки, поэтому сервер не сможет определить разницу.

0 голосов
/ 14 марта 2012

Когда вы нажимаете кнопку, ее имя включается в запрос 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" />

Обратите внимание, что ему не нужно значение, потому что кнопка, которую она заменяет, не имеет значения, устанавливающего ее текст. Просто этого должно быть достаточно.

0 голосов
/ 14 марта 2012

Можно проверить, что кнопка была отправлена ​​с отправкой.Может быть, они проверяют это.

0 голосов
/ 14 марта 2012

Да, очень легко узнать, когда кнопка отправляет форму, и это именно то, что может делать сайт.

Кнопка - это элемент управления формой, поэтому при отправке формы, состояние кнопки также отправляется.Это означает, что когда вы проверяете объект формы на сервере, который получает post, вы увидите, что он содержит ключ с тем же именем, что и button, и его значение установлено в атрибуте value вашегоbutton.

Предположим, у вас есть 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 эквивалент.

0 голосов
/ 14 марта 2012

Почему бы не иметь другое скрытое поле с именем js_submitted со значением false, а в вашей функции Submit_Form() установить его на true перед запуском метода submit()? Затем в PHP (например) вы можете найти $_GET/$_POST['js_submitted'], чтобы определить, какой метод отправки использовался.

...