Dezactivare sau Redirecționare WP-login.php

24 aug. 2012, 05:05:31
Vizualizări: 93.9K
Voturi: 14

Există vreo metodă prin care să împiedic vizitatorii, indiferent dacă sunt autentificați sau nu, să ajungă la mysite.com/wp-login.php?

Am un formular de login separat care este tot ce avem nevoie. Știu că pot să redesenez formularul generat de wp-login, dar aș prefera să nu fiu nevoit să mă ocup deloc de el. Am încercat diverse filtre și hook-uri și nu reușesc să obțin o redirecționare. De asemenea, am încercat să folosesc o redirecționare prin .htaccess și am observat că funcționează, dar atunci formularul meu personalizat de login/logout nu mai funcționează.

Idei?

6
Comentarii

faci asta din motive de securitate? de ce nu implementezi autentificarea doar pentru wp-login.php?

Gaia Gaia
20 mai 2013 21:13:58

Nu înțeleg ce vrei să spui. Te rog să detaliezi puțin. Mulțumesc anticipat.

jchwebdev jchwebdev
21 mai 2013 21:38:00

DE CE ai nevoie de un formular de login separat? din motive de securitate?

Gaia Gaia
22 mai 2013 04:05:44

Observăm că prea mulți oameni în zilele noastre sunt conștienți de existența 'wp-login'. Am prefera ca acest lucru să nu fie atât de evident.

Poți să-mi explici ce înseamnă 'de ce să nu implementezi auth'? Mersi anticipat.

jchwebdev jchwebdev
22 mai 2013 23:09:35

vezi răspunsul oferit.

Gaia Gaia
23 mai 2013 00:47:14

dacă ai găsit o soluție, marchează răspunsul corect ca acceptat.

Gaia Gaia
23 mai 2013 22:31:08
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 9
11
27

După ce am găsit această întrebare și am testat câteva dintre răspunsuri, mai jos este o versiune "curățată" a ceea ce folosesc într-un mediu de producție.

Această versiune nu arată nicio notificare / eroare și permite și resetarea parolei să funcționeze:

// Conectează acțiunea corespunzătoare din WordPress
add_action('init', 'prevent_wp_login');

function prevent_wp_login() {
    // WP urmărește pagina curentă - globalizează variabila pentru a o accesa
    global $pagenow;
    // Verifică dacă $_GET['action'] este setat și, dacă da, încarcă-l în variabila $action
    $action = (isset($_GET['action'])) ? $_GET['action'] : '';
    // Verifică dacă suntem pe pagina de login și asigură-te că acțiunea nu este 'logout'
    if( $pagenow == 'wp-login.php' && ( ! $action || ( $action && ! in_array($action, array('logout', 'lostpassword', 'rp', 'resetpass'))))) {
        // Încarcă URL-ul paginii de start
        $page = get_bloginfo('url');
        // Redirecționează către pagina de start
        wp_redirect($page);
        // Oprește execuția pentru a preveni încărcarea paginii din orice motiv
        exit();
    }
}
4 iul. 2014 00:45:24
Comentarii

Se pare că acest lucru împiedică WP-Login (bine), dar exit() final pare să împiedice apariția efectivă a login(), ceea ce nu este ceea ce dorim. Dorim ca oamenii să se poată autentifica, dar să nu vadă niciodată ecranul WP-Login. Dacă introduc o parolă incorectă, ar trebui să fie redirecționați către pagina noastră personalizată de autentificare.

jchwebdev jchwebdev
15 iul. 2014 21:52:35

Am editat-o și acum funcționează: trebuie să verifici dacă $action este completat înainte de a face in_array()

simonthesorcerer simonthesorcerer
22 iul. 2014 00:45:07

Aceasta nu a funcționat pentru mine. Am putut să mă autentific în continuare.

Mike Mike
3 oct. 2015 06:43:13

@Mike - Ești sigur că hook-ul tău funcționează? Ce se întâmplă dacă pui echo "HERE"; în interiorul funcției? Se afișează?

random_user_name random_user_name
3 oct. 2015 17:41:07

@cale_b Da, hook-ul funcționează corect. Problema este că $_GET['action'] este gol pentru mine. Formularul este trimis către /wp-login.php (fără variabile GET în URL) și uitându-mă în sursă, nu există nici măcar un input numit action, așa că chiar și $_REQUEST['action'] este gol.

Mike Mike
4 oct. 2015 01:24:50

@cale_b Se pare că codul de mai sus este procesat după ce autentificarea a avut loc deja. Dacă fac un exit; (înainte de wp_redirect) și reîmprospătez pagina, nu primesc o avertizare că retrimit variabilele post către server, ceea ce înseamnă că serverul a efectuat deja o redirecționare. Și dacă reîmprospătez pagina după aceea, sunt deja autentificat.

Mike Mike
4 oct. 2015 02:14:50

@Mike - două lucruri: 1) acest lucru nu are intenția de a împiedica autentificarea, ci are scopul de a împiedica accesul la wp-login.php (pagina implicită de autentificare WordPress), și 2) am editat răspunsul și am modificat ușor logica, ceea ce ar trebui să rezolve problema descrisă mai sus.

random_user_name random_user_name
4 oct. 2015 17:55:31

Testat și funcționează!

Dale Clifford Dale Clifford
24 mar. 2018 10:55:44

Sunt nou în PHP și WordPress. Întrebarea mea este, în codul tău, unde introduc link-ul către pagina mea personalizată de autentificare/profil?

Aousaf Rashid Aousaf Rashid
17 ian. 2019 18:40:50

Aceasta pur și simplu împiedică oricine să se autentifice pentru mine, atunci când folosesc wp_login_form pe o pagină personalizată. Nu va permite niciodată autentificarea, indiferent dacă credentialele sunt valide sau nu.

Nathan Nathan
21 mai 2019 20:18:09

Doar un MARE mulțumesc. M-am tot jucat cu asta întreaga zi.

Juergen Schulze Juergen Schulze
3 iun. 2020 17:10:48
Arată celelalte 6 comentarii
6
11

Încearcă acest cod în fișierul functions.php al temei tale

add_action('init','custom_login');

function custom_login(){
 global $pagenow;
 if( 'wp-login.php' == $pagenow && !is_user_logged_in()) {
  wp_redirect('http://yoursite.com/');
  exit();
 }
}
24 aug. 2012 06:06:45
Comentarii

funcționează pentru mine, dar am probleme cu delogarea și nu pot înțelege de ce

Androliyah Androliyah
24 aug. 2012 06:26:09

Pentru că wp-login.php gestionează și procesul de delogare.

Brian Fegter Brian Fegter
24 aug. 2012 07:02:30

Da, acest lucru blochează formularul meu personalizat de autentificare. Dar dacă ar exista o modalitate de a verifica în mod fiabil variabila de cerere sau poate refererul? Altfel spus: acesta ar putea fi un punct de plecare. Mai e cineva? TIA ---JC

jchwebdev jchwebdev
24 aug. 2012 10:15:28

Ah da, wp-login se ocupă și de delogare. Haha. E logic. Poate că acest cod cu un plugin va fi suficient. Să vedem ce altceva putem folosi pentru că urăsc să folosesc wp-login.

Androliyah Androliyah
24 aug. 2012 22:12:30

Tot ce cred că este necesar ar fi să monitorizez variabilele de cerere când wp-login este încărcat. Doar că acum nu am un calculator care să facă asta.

jchwebdev jchwebdev
25 aug. 2012 03:34:09

Folosesc un plugin Buddypress care redirecționează de la wp-login către o pagină personalizată de logare. Ai putea să te uiți la cod să vezi cum se face. Se numește Branded Login for Buddypress, dezvoltat de Brajesh Singh pe (buddydev.com)

Androliyah Androliyah
25 aug. 2012 16:43:40
Arată celelalte 1 comentarii
1

Adaugă o variabilă GET pentru acțiunea de logout și va funcționa corect.

add_action('init','custom_login');

function custom_login(){
 global $pagenow;
 if( 'wp-login.php' == $pagenow && $_GET['action']!="logout") {
  wp_redirect('http://SITULTAU.com/');
  exit();
 }
}
20 apr. 2014 23:20:46
Comentarii

Până acum, aceasta este cea mai apropiată soluție de ceea ce dorim. Dacă eliminăm exit() și schimbăm wp_redirect către pagina noastră personalizată de autentificare, se pare că funcționează.

jchwebdev jchwebdev
15 iul. 2014 22:11:32
0

Folosesc plugin-ul WordPress Rename wp-login.php de ceva vreme.

Acesta îți permite să schimbi calea wp-login.php în oricare altă cale. Aveam probleme cu roboții care atacau pagina de login, iar acum nu mai am niciun acces nedorit.

4 iul. 2014 00:53:16
2

WP-login gestionează autentificarea, deconectarea, înregistrarea, resetarea și recuperarea parolei. Presupunând că doriți să modificați pagina de autentificare din partea frontală, puteți folosi în siguranță următorul cod:

function custom_login_page() {
 $new_login_page_url = home_url( '/login/' ); // noua pagină de autentificare
 global $pagenow;
 if( $pagenow == "wp-login.php" && $_SERVER['REQUEST_METHOD'] == 'GET') {
    wp_redirect($new_login_page_url);
    exit;
 }
}

if(!is_user_logged_in()){
 add_action('init','custom_login_page');
}

Acest fragment de cod va:

  1. Redirecționa toți vizitatorii site-ului către noua pagină de autentificare.
  2. Deconectarea va funcționa fără nicio problemă.
  3. Pe noua pagină de autentificare personalizată, va trebui să creați formulare personalizate pentru autentificare, înregistrare și resetare parolă. Totuși, formularele personalizate pot trimite date în siguranță către wp-login.php, deoarece cererile POST nu sunt redirecționate.
29 oct. 2014 14:17:18
Comentarii

home_url() deja adaugă o bară oblică inițială, deci nu este nevoie de aceasta. De asemenea, $pagenow este (a) o variabilă globală care este prezentă doar în administrare (și poate pe pagina de autentificare) și (b) ar trebui înlocuită cu verificări ale proprietății get_current_screen().

kaiser kaiser
29 oct. 2014 14:41:31

Aceasta funcționează cel mai bine. Mulțumesc

ItsJhonny ItsJhonny
8 mar. 2022 13:37:05
2
// https://codex.wordpress.org/Plugin_API/Filter_Reference/login_url#Examples
add_filter('login_url', 'custom_login_url', 10, 3);

function custom_login_url($login_url, $redirect, $force_reauth) {
    return home_url('/login/?redirect_to=' . $redirect);
}

Acest lucru va redirecționa către /login în locul formularului urât wp-login.

11 ian. 2017 17:12:13
Comentarii

hmmm idee interesantă, dar te rog să explici cum/de ce funcționează

Mark Kaplun Mark Kaplun
11 ian. 2017 17:25:28

Aceasta nu va funcționa. Acest filtru interceptează cererile pentru URL-ul de autentificare prin login_url(), dar nu împiedică pe cineva să introducă manual wp-login.php.

Matt Matt
4 iul. 2019 21:41:21
4

Dacă intenția ta este să protejezi wp-login.php astfel încât străinii să nu poată nici măcar să-l vadă, cea mai simplă și eficientă metodă este să ceri autorizare (autentificare de bază) pentru a accesa wp-login.php.

În Apache, autentificarea este implementată prin combinația dintre htaccess și un fișier de parole. Prima dată, într-o sesiune de browser, când cineva încearcă să acceseze wp-login.php, i se va cere să introducă un nume de utilizator și o parolă (înainte de autentificarea WordPress).

Pentru a simplifica lucrurile, acest nume de utilizator și parolă pot fi aceleași pentru fiecare persoană căreia dorești să-i permiți accesul la wp-login.php, deoarece ei vor trebui totuși să introducă datele de autentificare WordPress după ce au trecut cu succes de prima casetă de dialog de autentificare.

23 mai 2013 00:46:59
Comentarii

Interesant. Presupun că 'prompt' se referă la fereastra modală a browserului pentru introducerea credențialelor. Cred că asta ar putea crea confuzie. În mod ideal, aș dori ca acel URL să nu facă nimic... sau poate doar să redirecționeze către pagina principală. Dar mulțumesc pentru informație. Învăț ceva nou în fiecare zi!

jchwebdev jchwebdev
27 mai 2013 05:57:14

Ceea ce credeți că faceți este "securitate prin obscuritate". Dar în realitate, faceți doar obscuritate, iar asta este groaznic. Nu folosiți această abordare. Autentificarea este securitate. Ascunderea punctului de intrare este obscuritate. http://security.stackexchange.com/questions/32064/at-what-point-does-something-count-as-security-through-obscurity

Gaia Gaia
27 mai 2013 14:50:01

Cu alte cuvinte, chiar DACĂ schimbați locația wp-login, tot trebuie să folosiți autentificarea: "Ar trebui să mă bazez pe schimbarea portului serverului de la 22 la 2222 pentru a menține conexiunea sigură? Absolut nu. Este rău să schimb portul serverului SSH la 2222 în timp ce folosesc și o parolă? Nu, dacă ceva, aceasta este cea mai bună soluție. Schimbarea ("Obscurarea") portului va reduce pur și simplu numărul de scanere automate de exploatare care caută pe porturile obișnuite. Obținem un avantaj de securitate prin obscuritate, ceea ce este bun, dar nu ne bazăm pe obscuritate. Dacă o găsesc, tot trebuie să spargă parola."

Gaia Gaia
27 mai 2013 15:41:56

Mulțumesc pentru asta. Am învățat multe. Nu exact ce căutam, dar totuși... foarte util. Cele mai bune ---JC

jchwebdev jchwebdev
31 mai 2013 06:51:22
0

Înlocuiți $pageid cu pagina la care doriți să redirecționați utilizatorii

/* Redirecționează pagina de logare */
function redirect_login_page(){
  // Stochează pentru verificare dacă această pagină este egală cu wp-login.php
   $page_viewed = basename( $_SERVER['REQUEST_URI'] );

  // link permanent către pagina personalizată de logare
  $login_page  = get_permalink($pageid);

  if( $page_viewed == "wp-login.php" ) {
    wp_redirect( $login_page );
    exit();
  }
}

add_action( 'init','redirect_login_page' );
6 ian. 2017 10:36:49
3
<?php
/* Template Name: Template Înregistrare */
if(is_user_logged_in()) { $user_id = get_current_user_id();$current_user = wp_get_current_user();$profile_url = get_author_posts_url($user_id);$edit_profile_url = get_edit_profile_url($user_id); ?>
<div class="regted">
    Ești autentificat cu numele de utilizator <a href="<?php echo $profile_url ?>"><?php echo $current_user->display_name; ?></a> Dorești să <a href="<?php echo esc_url(wp_logout_url($current_url)); ?>">Ieși</a> ?
</div>
<?php } else { ?>
<div class="register">
    <?php $err = ''; $success = ''; global $wpdb, $PasswordHash, $current_user, $user_ID; if(isset($_POST['task']) && $_POST['task'] == 'register' ) { $pwd1 = $wpdb->escape(trim($_POST['pwd1']));
        $pwd2 = $wpdb->escape(trim($_POST['pwd2']));
        $email = $wpdb->escape(trim($_POST['email']));
        $username = $wpdb->escape(trim($_POST['username']));

        if( $email == "" || $pwd1 == "" || $pwd2 == "" || $username == "") {
            $err = 'Te rugăm să completezi parola în acest câmp';
        } else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $err = 'Adresa de email este invalidă';
        } else if(email_exists($email) ) {
            $err = 'Adresa de email există deja';
        } else if($pwd1 <> $pwd2 ){
            $err = 'Parola nu corespunde cu confirmarea parolei';
        } else {
            $user_id = wp_insert_user( array ('user_pass' => apply_filters('pre_user_user_pass', $pwd1), 'user_login' => apply_filters('pre_user_user_login', $username), 'user_email' => apply_filters('pre_user_user_email', $email), 'role' => 'subscriber' ) );
            if( is_wp_error($user_id) ) {
                $err = 'Eroare la crearea utilizatorului.';
            } else {
                do_action('user_register', $user_id);
                $success = 'Înregistrare efectuată cu succes';
            }
        }
    }
    ?>
  <link  rel="stylesheet" type="text/css"  href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!--afișare mesaj eroare/succes-->
<div id="message">
        <?php
            if(! empty($err) ) :
                echo ''.$err.'';
            endif;
        ?>
        <?php
            if(! empty($success) ) :
                $login_page  = home_url( '/login' );
                echo ''.$success. '<a href='.$login_page.'> Autentificare</a>'.'';
            endif;
        ?>
    </div>

           <div class="container">    
        <div id="loginbox" style="margin-top:100px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
          <div style="padding-bottom: 50px;" class="col-md-6 col-md-offset-4 col-sm-8 col-sm-offset-2"/><img src="#url.logo" alt="Logo site" title="Logo site"></div>
    <form class="form-horizontal" method="post" role="form">
<div class="form-group">
    <label class="control-label  col-sm-3" for="username">Nume utilizator:</label>
    <div class="col-sm-9">
    <input type="text" class="form-control" name="username" id="username" placeholder="Nume utilizator">
    </div>
</div>
<div class="form-group">
    <label class="control-label col-sm-3" for="email">Email:</label>
    <div class="col-sm-9">
        <input type="email" class="form-control" name="email" id="email" placeholder="Email">
    </div>
</div>
<div class="form-group">
    <label class="control-label col-sm-3" for="pwd1">Parolă</label>
    <div class="col-sm-9">
        <input type="password" class="form-control" name="pwd1" id="pwd1" placeholder="Introdu parola">
    </div>
</div>
<div class="form-group">
    <label class="control-label col-sm-3" for="pwd2">Reintrodu parola:</label>
    <div class="col-sm-9">
        <input type="password" class="form-control" name="pwd2" id="pwd2" placeholder="Reintrodu parola">
    </div>
</div>
<?php wp_nonce_field( 'post_nonce', 'post_nonce_field' ); ?>
<div class="form-group">
    <div class="col-sm-offset-3 col-sm-9"  style="text-align:center;">
    <button type="submit" class="btn btn-primary">Înregistrare</button>
    <input type="hidden" name="task" value="register" /><br/>
    </div>
</div>
</form>
</div>
</div>
</div>
<?php 
get_footer();
 ?>
<div class="message">
    <?php
        $login  = (isset($_GET['login']) ) ? $_GET['login'] : 0;
        if ( $login === "failed" ) {
                echo '<strong>Eroare</strong> Nume de utilizator sau parolă incorectă!';
        } elseif ( $login === "empty" ) {
                echo '<strong>Eroare:</strong>Câmpul nume utilizator sau parolă este gol.';
        } elseif ( $login === "false" ) {
                echo '<strong>EROARE:</strong> Ieșire';
        }
    ?>
</div>
<?php } ?>

Exemplu de pagină personalizată de autentificare. Salvează login.php și adaugă codul

add_action('init','wpse_login');

function wpse_login(){
 global $pagenow;
 if( 'wp-login.php' == $pagenow && !is_user_logged_in()) {
  wp_redirect('http://yoursite.com/login.php');
  exit();
 }
}

în functions.php

18 aug. 2017 05:25:31
Comentarii

Poți te rog să editezi întrebarea ta și să explici de ce acest răspuns este mai bun decât răspunsurile anterioare sau exact ce faci în codul tău. Răspunsurile doar cu cod sunt de obicei dezaprobate fără o oarecare explicație.

Howdy_McGee Howdy_McGee
18 aug. 2017 07:07:19

acest cod schimbă wp-login.php în login.php cu codul meu personalizat bazat pe bootstrap. Poate preveni boturile automate sau ghicirea URL-ului implicit. Poți schimba <i>login</i> în orice frază dorești, astfel nimeni nu va știi direct URL-ul de login în afară de tine.

Rei Rei
20 aug. 2017 11:30:39

add_action('check_admin_referer', 'logout_without_confirm', 10, 2); function logout_without_confirm($action, $result) { /* * Permite delogarea fără confirmare / if ($action == "log-out" && !isset($_GET['_wpnonce'])) { $redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'https://yourdomain.com'; $location = str_replace('&', '&', wp_logout_url($redirect_to)); header("Location: $location"); die; } }

Hercules S. Hercules S.
22 iul. 2023 07:33:41