2010-11-30 7 views
2

jQueryの$ .ajax()メソッドでhtmlを送信しようとしていますが、htmlファイルを新しい.htmlファイルにダンプしようとしています。jQuery ajaxを介して送信されるコンテンツが途切れている

私はテストケースを設定している:

<html> 

<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script > 
$(document).ready(function(){ 
     var contents = $('html').html(); 
     var filename = "test/000.html"; 
     $.ajax({ 
     type: "POST", 
     url: "/file.php", 
     data: "content="+contents+"&fn="+filename, 
     dataType: "html", 
     success: function(msg, ts, xh){ 
      console.log(msg); 
      console.log(ts); 
      console.log(xh); 
      alert("success"); 
     }, 
     processData: false, 
     error: function(X, textStatus, error){ 
      alert("Error saving... please try again now.") 
     } 
    }); 
}); 
</script> 


</head> 

<body> 

<div id="rteContainer" class="dev"> 
    <div id="textEditor"> 
    <form> 
    <textarea name="balh" id="balh" rows="25" cols="103"></textarea> 
    <input type="button" id="updateContent" value="Update Changes"> 
    <input type="button" id="closeEditor" value="Close Without Saving"> 
    </form> 
    </div> 
</div> 

</body> 
</html> 

file.phpファイルは次のとおりです。

<?php 
header("Content-type:text/html;charset:UTF-8"); 
$content = "<html>".stripslashes(urldecode($_POST["content"]))."</html>"; 
$dump_file = $_POST["fn"]; 
$fp = fopen($dump_file, 'w'); 
fclose($fp); 
echo $content; 
?> 

はなぜカットオフになっているのですか?私はそれが問題をエンコードして来ていると思っていますが、私はこれを理解することはできません。

+0

あなたの反応の例と、どこが途絶えているのでしょうか? –

答えて

9

html文字列contentsは、POSTより前にURLでエンコードする必要があります。 Javascriptはこの目的のためにescape()関数を提供します。

escape()から$('html').html()などのように、contentsに割り当て:

var contents = escape($('html').html()); 
+0

あなたのこの答えは、数秒で私の問題を解決しました!私は半日の間頭を掻いていた。ありがとう:) – VishwaKumar

0

JavaScriptのアンパサンドが問題を引き起こしていると思われます。それを '&'と置き換えて修正してください。

3

あなたのスクリプトはそれで大規模なセキュリティホールで恥ずかしで死にかけています。

ファイル名が最初にファイル名を検証することなく、フォームパラメータである場所にファイルを書き込むことは絶対にしないでください。初心者のハッカーでも、このスクリプトを使用して、Webサーバーがアクセスできるシステム上のファイルを上書きすることができます。あなたのAjax呼び出しで

、アンパサンドを自分で変数を連結していない、dataパラメータにキーと値のペアの{ }スタイルの配列を渡す:

data: { content: contents, 
     fn: filename } 

ああ、あなたが実際に書いたことがないています内容をダンプファイルに書き込むので、 'fn'が指すファイルは切り捨てられます。

役に立ったと思ったら...

+0

ありがとう。私はそれを書いたときにセキュリティを考えていませんでした。なぜなら、パスワードが完了するとパスワードで保護されるからです。ダンプファイルに実際に書き込むことは決して何を意味するのか分かりません。あなたは、既存のコンテンツが新しいコンテンツによって上書きされると言っていますか? – Atomix

+0

ダンプファイルを 'fopen'してすぐに閉じることを意味します。 '$ content'(' fwrite'を参照)をファイルに保存しません。しかし、セキュリティの問題を最初に修正してください。そうしないと、誰かが自分のスクリプトを使用して自分自身を上書きします。 – Alnitak

+0

また、FWIW、上記のように 'contents'を正しく渡すなら、私はあなたがエスケープする必要はありませんが、Ajax呼び出しから' processData'フラグを削除する必要があります。 – Alnitak

関連する問題