2011-10-19 14 views
0

私がしたいことは、自分が望むフォームに自分のログイン情報(データベースにある)を自動的に追加するスクリプトを作成することです。DOMdocument、編集要素

これを行うには、Webサイトから(cURLを使用して)HTMLソースを取得し、次にDOMdocumentを使用して、入力のユーザー名とパスワードのフォーム名をユーザー名とパスワードの値で編集してから、これを出力しますログイン

すべては問題ないでしょうか?ええ、理論的にはそうですが、そうではありません。

これは右のそれを行うコードです:

$dom = new DOMdocument(); 
$dom->formatOutput = true; 
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', $encoding)); 

$inputs = $dom->getElementsByTagName('input'); 
foreach ($inputs as $input) 
{ 
    if ($input->getAttribute('name') == $id_nameValue) 
    { 
    $new_input = $dom->createElement('input'); 

    $new_input->setAttribute('name', $id_nameValue); 
    $new_input->setAttribute('value', $id_value); 

    $input->parentNode->replaceChild($new_input, $input); 
    } 

    if ($input->getAttribute('name') == $password_nameValue) 
    { 
    $new_input = $dom->createElement('input'); 

    $new_input->setAttribute('name', $password_nameValue); 
    $new_input->setAttribute('value', $password_value); 
    $new_input->setAttribute('type', 'password'); 

    $input->parentNode->replaceChild($new_input, $input); 
    } 
} 

echo $dom->savehtml(); 

私がいる問題は、Javascriptをロードしたり、CSS、または正しくリダイレ​​クトではないではないとです...

は、例えば取ることができますreddit:https://ssl.reddit.com/login 彼らは、CSSの代わりhttps://ssl.reddit.com/login/static/reddit.cYdhnJIJSZ0.cssを持つの

<link rel="stylesheet" href="/static/reddit.cYdhnJIJSZ0.css" type="text/css" /> 

のためにこれを持っているので、私は正しい、それをロードカントLYは、これがMY_URL.com/post/loginに私をリダイレクトします

MY_URL.com/static/reddit.cYdhnJIJSZ0.css to find it... 

同じように私のURLが

<script type="text/javascript" src="/static/jquery.js"> 

様または

<form id="login_login" method="post" action="/post/login" class="user-form login-form"> 

で、JavaScriptに適用される使用しているため、

私の質問はどうすればこの仕事をすることができますか? ウェブサイトのURLを含めるようにリンクを編集するにはどうすればよいですか?これは私がDOMDOCUMENTを使用しています初めてなので 、私は

は、だから私の最終的な結果は次のようになり...私は、フォーム、またはスクリプトsrcを編集するに行くか方法がわからない

<link rel="stylesheet" href="https://ssl.reddit.com/login/static/reddit.cYdhnJIJSZ0.css" type="text/css" /> 
<script type="text/javascript" src="https://ssl.reddit.com/login/static/jquery.js"> 
<form id="login_login" method="post" action="https://ssl.reddit.com/login/post/login" class="user-form login-form"> 
+0

私は妄想しているのですか、これは疑わしいものですか?いずれにしても、あなた自身の上に置くために、javascript、CSS、または他のWebサイトの画像をホットリンクするべきではありません。間違いなく、フィッシング詐欺のように見えるものを設定するべきではありません。 – erisco

+0

uh、lol?これはどのようにフィッシング詐欺ですか?私は個人的な使用のために、私のコンピュータではなく、私のウェブサイトのユーザー名とパスワードを保存したいときにログインしたいので、私はパスワードを取得するためにキーロガーやその他のトリックを取得しません...私の個人的な使用のためにCSSやJavaScriptをリンクしているような私のような、そのウェブサイトの...あなたは私がそれが欲しいと言ったものを読んだことがありますか? – alex2005

+0

あなた自身でそれを見たい場合は、ここで試してみてくださいhttp://www.auto-complete.info/ ---- username:user、password:password ----新しいページは、そのように格納されている、db(今のところ)... – alex2005

答えて

1

これを行う最も簡単な方法は、href属性を設定したbaseタグを最後の有効なURL(可能なリダイレクトの場合は最終的にcURLによって取得されたURL)のベースURLに設定することです。この最後の効果的なURLは、使用してcURLを使用して取得することができます。

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

私はのDOMDocument in this answerをベースタグを設定する方法を説明してきました。また、すでにbaseタグが存在する状況も考慮されます。確かに、私の例では、まだbaseタグにhrefという属性が存在するかどうかを調べていません。 DOMElement::hasAttribute()を利用してこのチェックを追加するのは簡単です。alex2005さんのコメントに応えて

編集

あなたはそれを少し変更して、これを行うことができます:しかし

$baseElement = $doc->createElement('base'); 
$baseElement->setAttribute('href', $url); 
$headElement = $doc->getElementsByTagName('head')->item(0); 

// it will automatically append, if $headElement has no firstChild (i.e. is null) 
$headElement->insertBefore($baseElement, $headElement->firstChild); 

編集2
少し警告を。私は何か見落としました。私はブラウザがbaseタグ内のファイル名を扱うかどうかはわかりません

http://example.com/some/path/to/a/file.html

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

は...効果的のようなURLを返すことができます。私は彼らがディレクトリパスを抽出すると思います。しかし、これについてはわからない。

しかし、その可能性のある警告とは別に、ほとんどの場合、おそらく、最後のリダイレクトされたURLのドメイン名をベースタグで使用したいだけです。

少なくとも、これはのような相対URIの解決のために、このような

/css/some.css 
/js/some.js 
/some/file.html 

として絶対URIの解決のために真である:

css/some.css 
js/some.js 
some/file.html 

を...あなたはおそらくのディレクトリ部分を抽出したいと思います同様URL:

http://example.com/some/path/to/a/

それで少し考えてみたら、考えられるすべてのシナリオを説明するのはそれほど簡単ではないでしょう。これに注意してください。

+0

これは実際に役立ちます、ありがとう。私がこれに持っている問題は、ベースタグの前にあるもので、ベースURLがないので、その前に含まれていたcssとjavaスクリプトの助けになりません。とにかくそれを一番上に作るのですか? – alex2005

+0

@ alex2005:これに少し驚きました。本気ですか?私はブラウザが何か他のことをする前に可能な 'base'タグを最初に解析すると思うでしょう...しかし、OK、私はこれをどのように説明するのかについて私の答えにヒントを与えました。 HTH。 –

+0

@ alex2005:少し簡略化しました。最初はかなり冗長でした。 –

関連する問題