diff --git a/lib/apiauthaction.php b/lib/apiauthaction.php index 0e81082c35..a3deccd3da 100644 --- a/lib/apiauthaction.php +++ b/lib/apiauthaction.php @@ -85,8 +85,10 @@ class ApiAuthAction extends ApiAction // NOTE: $this->scoped and $this->auth_user has to get set in // prepare(), not handle(), as subclasses use them in prepares. - // Allow regular login session - if (common_logged_in()) { + // Allow regular login session, but we have to double-check the + // HTTP_REFERER value to avoid cross domain POSTing since the API + // doesn't use the "token" form field. + if (common_logged_in() && common_local_referer()) { $this->scoped = Profile::current(); $this->auth_user = $this->scoped->getUser(); if (!$this->auth_user->hasRight(Right::API)) { diff --git a/lib/util.php b/lib/util.php index bef56502a0..c87b0f1bf6 100644 --- a/lib/util.php +++ b/lib/util.php @@ -264,6 +264,11 @@ function common_logged_in() return (!is_null(common_current_user())); } +function common_local_referer() +{ + return parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) === common_config('site', 'server'); +} + function common_have_session() { return (0 != strcmp(session_id(), ''));