0

さて、私はネット全体を探していましたが、問題の解決策が見つからないようです。これが過去に尋ねられた場合は、お詫び申し上げます。

これには非常に簡単な答えがあると確信しています。しばらく前に、クライアント用のWebサイトを構築しました。このWebサイトには、ユーザーが管理者であるかどうかを基本的にチェックする「level」と呼ばれる$_SESSION変数を使用して一部のページがロックされる管理システムがあります。さらに、一部のページは通常のログインセッション変数でロックされ、ログインしているユーザーだけがこれらのページにアクセスできるようになっています。

問題は、私の2つのページで、phpスクリプトが完全に単独で実行されているように見えることです。最初のページは、DB内のすべてのユーザーにすべてのアクティベーションメールを再送信するページです。このページにアクセスするには、ログインして管理者になる必要があります。2番目のページには、PayPal経由でのみアクセスできます。PayPalスクリプトには、PayPal投稿変数があるかどうかをチェックするフォールバックサポートがあります。

これらのスクリプトが単独で実行されている理由を知っている人はいますか?ランダムな電子メールが顧客や管理者に継続的に送信されると、面倒になります。私はおそらくどこかで何か間違ったことをしました。スクリプトをアクティブ化するのはGoogleクローラーだけかもしれないと思いましたが、スクリプトにアクセスするためにクローラーにログインする必要はありませんか?

4

3 に答える 3

0

サーバーのアクセスログをチェックして、それらのページをいつ、何が呼び出しているかを確認します(呼び出されている場合)。

あるべきではないページ(スパイダー、人など)にアクセスしている場合は、セキュリティ上の問題があります。

スクリプトが「自分自身を呼び出している」とは非常に疑わしい

于 2012-08-07T05:43:08.613 に答える
0

それらが呼び出されている理由を見つけるには、セッション変数が設定されているかどうかを確認し、設定されていないことがわかった後、次のように追加します。

file_put_contents('./log/log.txt', print_r($_SERVER));

ディレクトリ「log」とwritabelファイル「log.txt」を自分で作成すると、そこにソースが表示されます。

他の便利な関数はdebug_backtrace()です。これを使用するには少し注意が必要ですが、次のようになります。

if ($handle = @fopen('./log/log.txt', 'a')) {
    for ($i=1; $i<count($aBack); $i++) {
        if (isset($aBack[$i]['file'])) {
            fwrite($handle, $aBack[$i]['file'] . '/' . $aBack[$i]['line'] . "\n\r";
        } else {
            fwrite($handle, 'Anonymous function' . "\n\r";
        }
    }
    fclose($handle);
}

使用された宣誓のログを提供する必要があります。(コードは逐語的に入力されました-タイプミスで申し訳ありませんが、そこから解決できるはずです)

ほとんどのクライアント情報(IP、リファラーなど)は偽造可能ですが、呼び出し元URIは偽造可能ではないことに注意してください。それはあなたにそれらを呼んでいるものについてのたくさんの情報を与えるでしょう。

于 2012-08-07T05:56:51.983 に答える
0

それは多くのことかもしれません。

1つのアプローチは、検索エンジンがスクリプトを実行していることです。

数年前、私は彼らの自家製CMSで作成されたすべてのページの削除を引き起こしている可能性があるものを調査するために雇われました。

アクセスログを調べると、2つの検索エンジンが管理フロントエンドのコンテンツにインデックスを付けようとしていることがわかりました。すべての削除ページのリンクを含みます。

これが発生する可能性がある理由は、2つの組み合わせでした。

1つ目は、2つの検索エンジンの管理者ブラウザプラグインでした。ドキュメントは、クライアントがアクセスしたページがプラグインから検索エンジンに送信されたことを証明しました。

次に、検索エンジンがセッションで保護されたページのインデックスを作成しようとしたとき、CMSの元の開発者は、ページの残りのコードがまだ実行されていることを意味する部分のexit;後に置くのを忘れていました。header('Location: ...');

ソリューション

exit;コードに追加して問題を修正しました:

If( ! isset($_SESSION['level']) )
{
  header('Location: login.php');
  exit; // stops further execution of code
}

これがお役に立てば幸いです。

于 2012-08-07T06:35:00.497 に答える