2

プログラムとゲームを投稿しているサイトhttp://www.gfcf14greendream.com/があります。作成したプログラムをダウンロードするためのコードを書くのは問題ありませんが ([プログラム] ボタンをクリックしてから [SMS Sender] をクリックします)、カウンターを生成する方法についてかなり混乱しています。何よりもまず、自分でフォーマットしたいので、Web サイトのファイルを使用したくありません。私がこれを行うと考えた方法は、txt ファイル smssender.txt を使用することでした。

0

次に、txt ファイルの上書きを処理するサイトの JavaScript は次のとおりです。

$("#downbutton").click(function () {
    downcounter++;
    if (downcounter == 1) $("#counter").text("SMS Sender has been downloaded " + downcounter + " time...");
    else $("#counter").text("SMS Sender has been downloaded " + downcounter + " times...");
    $.post("http://www.gfcf14greendream.com/PHP/smssender.php", {
        counter: downcounter
    }, function (data) {});
});

これは、PHP ファイル smssender.php を呼び出す必要があります。このファイルには 5 行しかありません。

<?php
    $counter = $_POST['counter'];
    file_put_contents("/counters/smssender.txt", $counter);
?>

ページ内のダウンロード回数を示すテキストを変更するコードがうまく機能するため、php ページが呼び出されているかどうかを知りたいのですが、ページが更新されるとすぐにダウンロード数が 0 に戻り、 0 は次のコードから取得されるためです。

var downcounter = 0;
$.get("http://www.gfcf14greendream.com/counters/smssender.txt", function (data) {
    downcounter = data;
    if (downcounter == 1) $("#counter").text("SMS Sender has been downloaded " + downcounter + " time...");
    else $("#counter").text("SMS Sender has been downloaded " + downcounter + " times...");
});

これは、smssender.txt から 0 を正常に取得したため、上書きが行われなかったことを明確に示しています (以前に 1 と 2 を試してみましたが、うまくいきました)。では、なぜコードが間違っているのでしょうか。どんな種類の助けも本当に感謝しています。お時間をありがとうございました。明けましておめでとうございます。

アップデート:

javascript 関数のコードを次のように変更してみました。

var txtfile = "http://www.gfcf14greendream.com/counters/smssender.txt";

            $.ajax({
                type:'POST',
                url: 'PHP/increment.php',
                data: txtfile,
                success: function() {
                    alert("Download incremented");
                    $.get("http://www.gfcf14greendream.com/counters/smssender.txt", function(data){
                        downcounter = data;
                        if (downcounter == 1)   $("#counter").text("SMS Sender has been downloaded " + downcounter + " time...");   
                        else $("#counter").text("SMS Sender has been downloaded " + downcounter + " times..."); 
                    });
                }               
            });

PHP ファイル、increment.php を追加しました。これには、ここで提供されたコードの一部が含まれています。

<? php
    $file = $_POST['txtfile'];
    $counter = intval(file_get_contents($file));
    $counter++;
    file_put_contents($file, $counter);
?>

しかし、それでも運が悪い。このコードはまったく機能しますか、それとも参照を誤用していますか? ありがとうございました

4

1 に答える 1

5

これはカウンターを構築する簡単な方法ですが、いくつかの問題があります。1

に値を提供するクライアントの JavaScript に依存する代わりにcounter、サーバー側で完全に処理する必要があります。たとえば、2 人のユーザーがページを同時に開いている場合、両方とも同じ値で開始されますが、それぞれ 1 ずつ適切に増加するのではなく、1 ずつ増加するだけです

また、この方法では、クライアントから送信されてファイルに保存されたカウンター値をサニタイズする必要がなくなり、投稿を処理する必要がまったくなくなります。代わりに、スクリプトを呼び出すだけでカウンターをインクリメントできます。

カウンター PHP スクリプト

// Does nothing but read and increment the file:
// Read the value
$current_counter = intval(file_get_contents('/path/outside/web/root/counters/smssender.txt'));
// Increment it
$current_counter++;
file_put_contents('/path/outside/web/root/counters/smssender.txt', $current_counter);
// Output it to the client
echo $current_counter;

JavaScript の役割は、パラメータなしで PHP スクリプトを呼び出すことだけです。

$.get("http://www.gfcf14greendream.com/PHP/smssender.php", function(data) {
  // Do something on success
  console.log(data);
});

ファイルの直接要求から保護するために、smssender.txtそのファイルをWeb サーバーのドキュメント ルートの外に保存することをお勧めします。のファイルへの正しいパスを指定しますfile_get_contents()/file_put_contents()

現在のカウンター値を取得してクライアントに送信するには、値を読み取ってエコーするだけです。

echo intval(file_get_contents('/path/outside/web/root/counters/smssender.txt'));

smssender.php最後に、スクリプトを何度も呼び出すだけで誰かがカウンターを実行するのを防ぐものは何もないことに注意してください。ログインしている場合は、カウンターにアクセスするときにユーザーがサインインしていることを確認する必要があります。ログインしていない場合は、実際にダウンロードが行われたときに Cookie の値を設定することを検討する必要があります。これにより、カウンターがインクリメントされたときに、ユーザーが現在のセッションで何かを実際にダウンロードしたと断言できます。

if (isset($_COOKIE['some-download-value'])) {
  // Update the counter.
}

補遺:

Web ホストが Web サーバー ドキュメント ルートの外にファイルを配置することを許可していない場合は、.htaccess で次のようなルールを使用して、.txt ファイルへの直接の HTTP 要求をブロックできます。

# Block direct access to any .txt file
<Files ~ "\.txt$">
  order allow,deny
  deny from all
</Files>

counters/または、ディレクトリ内の .htaccess ファイルに次を配置することもできます。

# counters/.htaccess
# block all HTTP requests to counter files
Order deny,allow
Deny from all

1すべてのファイル ストレージ、読み取り、書き込み、およびセキュリティの問題を回避するより簡単な方法は、カウンター値をデータベース テーブルに格納し、UPDATEアクセスごとにそれを格納することです。

于 2013-01-01T01:14:32.063 に答える