Benutzer können keine Bilder im Frontend hochladen, wenn sie keinen Zugriff auf das wp-Backend haben


7

Ich lasse Benutzer Beiträge erstellen und Bilder über das Frontend hochladen / an diesen Beitrag anhängen . Das funktioniert gut. Wenn ich jedoch den Zugriff auf das Wordpress-Backend (/ wp-admin /) über ein Code-Snippet wie dieses einschränke

function wpse_11244_restrict_admin() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __('You are not allowed to access this part of the site') );
    }
}
add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

oder (BEARBEITEN) mit einem Umleitungscode

function redirect_non_admin_users() {
    if ( ! current_user_can( 'manage_options' ) && '/wp-admin/admin-ajax.php' != $_SERVER['PHP_SELF'] ) {
        wp_redirect( home_url() );
        exit;
    }
}
add_action( 'admin_init', 'redirect_non_admin_users' );

Der Medien-Upload funktioniert nicht mehr (Meldung "Fehler"). Dieses Problem wurde an anderer Stelle diskutiert :

Ich fand heraus, dass die Rolle, die keinen Zugriff [auf das Backend] hatte, auch ihre Fähigkeit zum Hochladen von Dateien im Frontend beeinträchtigte.

Gibt es eine Möglichkeit, Benutzer daran zu hindern, auf das Backend zuzugreifen, ohne ihre Fähigkeit zum Hochladen von Bildern auf das Frontend zu beeinträchtigen?

Vielen Dank!


1
Es ist möglicherweise eine bessere Option, Personen umzuleiten, die versuchen, auf etwas zuzugreifen, /wp-admin/damit Sie nicht mit Berechtigungen herumspielen.
Howdy_McGee

Gleiches Problem: "Beim Hochladen ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut." (Siehe meine Bearbeitung für das Redirect-Code-Snippet)
SPi

1
Wie genau implementieren Sie den Upload?
Rarst

Antworten:


1

Zunächst ist es wichtig zu überlegen, warum Sie den Zugriff auf einschränken wp-admin. Wenn Sie dies hauptsächlich aus ästhetischen Gründen tun, ist die unten angegebene Lösung in Ordnung. Wenn Sie dies jedoch tun, weil Sie nicht möchten, dass Ihre Benutzer bestimmte über das Back-End bereitgestellte Funktionen ausführen können, sollten Sie stattdessen die integrierte Rollen- und Funktions-API von WordPress verwenden. Geben Sie Ihren Benutzern eine Rolle mit nur den Funktionen, die sie haben sollen. Andernfalls können sie durch das Gewähren des Zugriffs auf die Ajax-Aktionen wahrscheinlich Dinge tun, die Sie verhindern wollten.

Das bringt uns zur Ursache Ihres Problems. Ajax ist am Hochladen des Bildes beteiligt, und der Ajax-Handler ( wp-admin/admin-ajax.php) ist technisch gesehen ein Back-End, selbst wenn er vom Front-End aufgerufen wird. Ihr Code, an den Sie angeschlossen 'admin_init'sind, wird also ausgelöst. Sie müssen lediglich prüfen, ob es sich bei der Anforderung um eine Ajax-Anforderung in dieser Funktion handelt, und nur beenden / umleiten, wenn dies nicht der Fall ist. Seit WP 4.7 können Sie die wp_doing_ajax()Funktion jetzt dafür verwenden .

function redirect_non_admin_users() {
    if ( wp_doing_ajax() ) {
        return; // Don't block Ajax requests.
    }

    if ( ! current_user_can( 'manage_options' ) && '/wp-admin/admin-ajax.php' != $_SERVER['PHP_SELF'] ) {
        wp_redirect( home_url() );
        exit;
    }
}
add_action( 'admin_init', 'redirect_non_admin_users' );

Wenn Sie Ihren Benutzern nur den Zugriff auf das Hochladen von Anhängen ermöglichen möchten, können Sie die Bedingung möglicherweise folgendermaßen ändern:

    if ( wp_doing_ajax() && isset( $_POST['action'] ) && 'upload-attachment' === $_POST['action'] ) {
        return; // Don't block attachment upload requests.
    }

Beachten Sie jedoch, dass viele Plugins auch ihre eigenen Ajax-Aktionen bereitstellen, die in diesem Fall blockiert würden. Sie sind also besser dran, wenn Sie die oben angegebene Rollen- und Fähigkeits-API verwenden.


es ist einfach falsch. Die Blockierungsfunktion sollte auf Funktionen basieren, die nicht von einer Anfrage stammen. Im Grunde wiederholt dies nur den Fehler des OP, nur umgekehrt (zu entspannt)
Mark Kaplun

@ MarkKaplun Natürlich. In diesem Fall beschränken wir jedoch nicht nur eine bestimmte Funktion. Wenn Sie eine wp-adminvollständige Einschränkung vornehmen möchten, aber dennoch Ajax-Anforderungen berücksichtigen müssen, bin ich mir nicht sicher, wie Sie dies sonst tun würden. Natürlich sollte jeder Ajax-Rückruf seine eigenen Fähigkeitsüberprüfungen haben, aber das ist meines Erachtens ein separates Problem. Dies überschreibt keine Fähigkeitsüberprüfungen, die die Ajax-Rückrufe selbst durchführen. Die Ajax-Rückrufe sind davon überhaupt nicht betroffen, nur die Möglichkeit, auf das Back-End zuzugreifen. Dies ist das einzige, was das OP einschränken wollte. Nicht die Ajax-Aktionen. :-)
JD

Ich glaube, ich bin davon ausgegangen, dass das Ausblenden des Backends hauptsächlich ästhetischer Natur ist, da das OP es Benutzern weiterhin ermöglicht, diese Art von Aktionen auszuführen. Wenn dies nicht der Fall ist, müssen sie natürlich genauer überlegen, welche Funktionen sie den Benutzern bieten.
JD

@MarkKaplun Ich habe gerade die Antwort aktualisiert, um zu verdeutlichen, dass stattdessen die Rollen- und Funktions-API verwendet werden sollte, wenn Sie versuchen, den Zugriff auf bestimmte Funktionen und nicht nur auf die Back-End-Oberfläche zu beschränken.
JD

Ich denke, das Problem besteht darin, Ajax in erster Linie einzuschränken. so viele Plugins werden damit brechen, dass es nicht lustig ist. Wenn Sie prüfen, ob Sie AJAX ausführen, ist dies für mich ein falsches Sicherheitsgefühl, das Sie möglicherweise zu einem leichteren Opfer von Eskalationsangriffen auf Berechtigungen macht. Eigentlich hätte ich die Frage abgelehnt, aber mit 5 positiven Stimmen ist es sinnlos
Mark Kaplun

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.