2012-03-14 11 views
0

私がしたい...フォームがで掲載されている場合、サーバーのスクリプトは、ボタンを提出したり、JavaScriptを使用して検出できます。提出()

をこの問題は、すべての週に忙しい私を保っていると私はネット上で何に少しを見つけますdoは簡単です...自分のウェブサイトで、有効な資格情報を持つ別のWebサイトへのログインを行い、処理したいファイルをダウンロードするサーバー側の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行のコメントを外すときは:()も同様に動作します。

だから、ダウンこれに来る: なぜボタンが仕事を提出するとJavaScriptが動作しない提出するのですか? 他のウェブサイトのサーバーがフォームの投稿方法を確認する方法はありますか? あなたの考えをありがとう!別の隠しフィールドを持っていないのはなぜ

答えて

0

ボタンをクリックすると、それは名前のsubmitボタンだから、その名がPOST要求に含まれています。リンクを使用すると、ボタンの名前はPOSTデータに渡されません。

あなたはボタンが持つべき名前で隠しフィールドを持っていることによって、リンクを使用するときは、おそらくボタンを偽装できます。

<input type="hidden" name="Login$UserName" value="myname" /> 
<input type="hidden" name="Login$Password" value="mypassword" /> 
<input type="hidden" name="Login$LoginButton" /> 

注それは値を必要としないので、それはdoesnの置き換えボタンそのテキストを設定する値がありません。それだけで十分です。

+0

はい、これも機能します! ソリューションはとてもシンプルでしたが、多くの時間が失われました! あなたのお返事ありがとうございました –

0

falseの値でjs_submittedと呼ばれ、あなたのSubmit_Form()機能では、submit()方法を焼成前trueに設定してください?次に、PHPなどでは、$_GET/$_POST['js_submitted']を検索して、どのサブミットメソッドが使用されたかを判断できます。

+0

TY答えが これは機能しません。 html: javascript:document.form1.js_submitted = true; –

+0

最初に、あなたのhtmlで 'js_submitted'を' value = "false" 'に設定し、JSで' document.form1.js_submitted.value = 'true'; 'で値を変更してください。 – Aaron

+0

答えのTY 私はそれを読むときあなたのポストは完全ではなかった:) 今私はhtmlコードを変えた。 私は明日自分のサーバーに投稿し、変数の結果をチェックしようとしています...ベッド時間今:) –

0

ボタンが送信されたことを確認することができます。たぶん彼らはこれをチェックしているのかもしれない。

+0

まさに私の考えも...しかし、彼らはそれをどうやってできましたか? –

+0

これらのチェックは、サーバー上でさまざまな方法で実行できます。一番簡単なのは、3つのフォーム要素が送信されたことを確認するだけです。 – westo

0

はい、ボタンがフォームを送信すると、そのサイトが実行していることがわかります。

ボタンはフォームコントロールであるため、フォームが送信されると、ボタンの状態も送信されます。つまり、postを受け取るサーバー上のフォームオブジェクトをチェックすると、buttonと同じ名前のキーが含まれており、その値がボタンのvalue属性に設定されていることがわかります。

<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の値はどちらかになります

は、あなたがform持って考えてみましょうOpt123または Opt456の場合は、押したボタンによって異なりますが、リンクを押すと、 nullまたはになります相当品。

0

送信ボタンがフォームの一部であっても、ブラウザは、ボタンが実際にクリックされた場合、投稿データの一部としてそのname=valueペアのみを送信します。 Javascriptから.submit()メソッドを呼び出すと、ブラウザはデータLogin$Username=myname&Login$Password=mypasswordをサーバーに送信します。しかし、実際にボタンをクリックすると、Login$Username=myname&Login$Password=mypassword&Login$LoginButton=が送信されます。ご覧のように、サーバーが2つのサーバーを区別することは非常に簡単です。

したがって、フォームをトリックして、その要素を常に非表示にすることができます。 submitボタンと同じ名前の非表示のフォーム要素を追加し

var sbtn_hid = document.createElement('input'); 
sbtn_hid.type = 'hidden'; 
sbtn_hid.name = 'Login$LoginButton'; 
sbtn_hid.value = ''; 
document.form1.appendChild(sbtn_hid);  

を、そのサーバーは違いを見分けることができません:Submit_Formでは、あなたがdocument.form1.submit();を言う直前に、これを追加します。

+0

はい! TYはそんなに! それはトリックでした... 私の次の課題は、サーバー側でそれを実装することですが、それは別の話です。 –

関連する問題