web-dev-qa-db-ja.com

WordPress Ajaxデータセキュリティ

意図をチェックするためのナンスを知っていますが、データベースの読み取りを制限するためにそれらを使用できるのであれば意味がありません。つまり、AJAXを使用してデータベースからレコードを取得していますが、他の方法でそのデータを他の人に公開してはいけません(そのadmin-ajax.phpページへのPOSTリクエスト)。

例えば、私のAJAXハンドラでは、私はこれだけの仕事をしています(私はAJAX呼び出しのアクションと一緒に$myidを送っています):

$myid = 5575;
$query = "SELECT `id` FROM table WHERE `user_id` = $myid;";
$data = $wpdb->get_col( $query );
echo json_encode($data);
die();

私はAJAXを通してこれだけのデータを呼び出しています。そのページに直接POST呼び出しを試みることができる悪意のあるユーザーからどのようにそれを保護することができますか?

編集: @Bainternetありがとうございます、しかし私の質問は@Miloが言ったことについてのものであり、私はその要求に対してユニークな一回だけを作成できない限り、私は何もできません。 @ goldenapples。右?

私はFacebook JS SDKを使ってこれらすべてを処理しているので、やるべきことはAJAXだけを使って(ページを読み込まずに)、ユーザーをwp_signon()にサインインさせることなら何でもできます。他にも権限なしにそれを行うことができます。そのため、実際にサイトを使用しているユーザーと、サイトがデータを取得するための呼び出しを行う以外にデータを読み取ろうとしているユーザーには、一意性がありません。そして、ログインさせるために私ができることなら何でも、それは他の誰かによっても複製することができます。誰もが何かを考えることができますか?

更新: actionを付けて呼び出すだけで回避策を見つけ、PHP SDKを使用してFacebookから他のパラメータを取得したと思います。しかし、私はまだそのことについての提案や何か他のことを受け入れています。

6
Ashfame

より安全にするためにできることがいくつかあります。

最初にあなたが言ったようにAjaxがそれをそれ自身selfと呼ぶことはWordPressナンスで作られるべきです:

<script type="text/javascript" >
    jQuery(document).ready(function($) {
        var data = {
            action: 'ACTION_NAME',
            Whatever_data: 1234,
            _ajax_nonce: <?php echo wp_create_nonce( 'my_ajax_nonce' ); ?>
        };
        $.post(ajaxurl, data, function(response) {
            alert('Got this from the server: ' + response);
        });
    });
</script>

上記のコードでは、admin-ajax.phpの呼び出しを検証するために必要な2つの属性action_ajax_nonceを考慮しています。コードの最初の数行で、アクションがサーバーに送信されたかどうかを確認し、そうでない場合はdie() FIRST CHECK )そして、そのアクションをアクションフックで使用して、独自のajax関数を呼び出します。

//if you want only logged in users to access this function use this hook
add_action('wp_ajax_ACTION_NAME', 'my_AJAX_processing_function');

//if you want none logged in users to access this function use this hook
add_action('wp_ajax_nopriv_ACTION_NAME', 'my_AJAX_processing_function');

また、ログインしているユーザーとログインしていない訪問者の両方がこの機能にアクセスするようにしたい場合は、both hooks(SECOND CHECK)を使用してください。

それであなたのajax関数であなたが最初にすべきことはajaxリファラーをチェックすることです(THIRD CHECK):

function my_AJAX_processing_function(){
   check_ajax_referer('my_ajax_nonce');
   //do stuff here
}

次に、ユーザー入力を使用してデータベースでクエリを実行するときは、エスケープ処理と検証に$wpdb->prepareを使用する必要があります。

$query = "SELECT `id` FROM table WHERE `user_id` = $myid;";
$data = $wpdb->get_col( $query )

つかいます:

$data = $wpdb->query( $wpdb->prepare("SELECT `id` FROM table WHERE `user_id` = %d",$myid));
8
Bainternet

これがどれほど安全であるかは完全にはわかりませんが、WordPress Ajaxハンドラーはユーザーに対応しています(要求はまだ要求されているため、Cookieがチェックされ、ユーザーがログインしている場合はそれが考慮されます)。それであなたはいつものcurrent_user_can()をチェックインさせることができます。

2
Rarst

おそらくこのリクエストをしたときにログインしていた?あなたはいくつかのデータをハッシュしてあなたのページ上でユニークなユーザーごとの一回だけを作成し、それをあなたのajaxリクエストで渡し、そしてログインしたユーザーに対してそれをチェックすることができます。または多分私はあなたがここで何をしているのか誤解しています。

0
Milo