Οι περισσότερες παραβιάσεις WordPress που βλέπουμε δεν οφείλονται σε κάποιο εξωτικό «hack», αλλά σε δύο πεζά πράγματα: κλεμμένα ή αδύναμα στοιχεία σύνδεσης και δυνατότητα εγγραφής αρχείων εκεί που δεν θα έπρεπε. Όταν ένας επιτιθέμενος μπει με σωστό κωδικό διαχειριστή, φτιάχνει συνήθως έναν «αόρατο» admin λογαριασμό, ανεβάζει ένα ψεύτικο πρόσθετο που λειτουργεί ως κερκόπορτα (backdoor) και κρύβει τα ίχνη του.

Παρακάτω θα βρείτε μέτρα που μπορείτε να εφαρμόσετε μόνοι σας, σε επίπεδο εφαρμογής — χωρίς πρόσβαση στον server. Αν φιλοξενείστε σε δικό μας πακέτο, αρκετά από αυτά τα έχουμε ήδη ενεργοποιημένα στην υποδομή· εδώ είναι ό,τι μπορείτε να προσθέσετε από τη δική σας πλευρά.

Σημείωση πριν ξεκινήσετε: Κρατήστε αντίγραφο ασφαλείας (backup) πριν αλλάξετε wp-config.php ή .htaccess. Ένα λάθος σε αυτά τα αρχεία μπορεί να ρίξει το site — επανέρχεται όμως εύκολα επαναφέροντας το προηγούμενο αρχείο.


1. Οι συνήθειες που σας προστατεύουν περισσότερο

Πριν αγγίξετε οποιοδήποτε αρχείο, αυτά τα απλά πράγματα έχουν τη μεγαλύτερη αξία:

Κρατήστε τα πάντα ενημερωμένα. Πυρήνας WordPress, πρόσθετα (plugins), θέματα (themes). Ενεργοποιήστε τις αυτόματες ενημερώσεις τουλάχιστον για τις εκδόσεις ασφαλείας. Τα περισσότερα hacks εκμεταλλεύονται γνωστά κενά σε ξεχασμένα, μη ενημερωμένα πρόσθετα.

Διαγράψτε ό,τι δεν χρησιμοποιείτε. Ανενεργό πρόσθετο ή θέμα παραμένει στον δίσκο και παραμένει ευάλωτο. Μην το απενεργοποιείτε απλώς — διαγράψτε το. Κρατήστε ένα μόνο εφεδρικό προεπιλεγμένο θέμα.

Ποτέ nulled / «σπασμένα» πρόσθετα. Τα πειρατικά premium plugins είναι από τους πιο συχνούς φορείς malware. Το «δωρεάν» κοστίζει το site σας.

Ισχυροί, μοναδικοί κωδικοί + διαχειριστής κωδικών. Διαφορετικός κωδικός για κάθε λογαριασμό. Χρησιμοποιήστε password manager.

Ενεργοποιήστε 2FA (έλεγχος ταυτότητας δύο παραγόντων) σε όλους τους λογαριασμούς διαχειριστή και συντάκτη. Αυτό μόνο του σταματά τη συντριπτική πλειονότητα των παραβιάσεων μέσω κλεμμένου κωδικού. Κάντε το υποχρεωτικό, όχι προαιρετικό.

Λιγότεροι διαχειριστές = μικρότερος κίνδυνος. Δώστε σε κάθε χρήστη τον ελάχιστο ρόλο που χρειάζεται. Ο συντάκτης άρθρων δεν χρειάζεται ρόλο Διαχειριστή — αρκεί ο ρόλος «Συντάκτης» ή «Αρθρογράφος».

Ελέγχετε τους χρήστες τακτικά. Μπείτε στο Χρήστες και βεβαιωθείτε ότι αναγνωρίζετε κάθε λογαριασμό. Άγνωστος διαχειριστής = κόκκινος συναγερμός.


2. Κλείστε την «πόρτα» της σύνδεσης

Η σελίδα σύνδεσης είναι ο νούμερο ένα στόχος.

  • Περιορίστε τις προσπάθειες σύνδεσης με ένα αξιόπιστο πρόσθετο (limit login attempts). Μετά από Χ αποτυχημένες προσπάθειες, η IP κλειδώνεται προσωρινά. Σταματά τις επιθέσεις brute-force.
  • Αποφύγετε το όνομα χρήστη admin. Είναι το πρώτο που δοκιμάζουν. Αν το έχετε, φτιάξτε νέο διαχειριστή με άλλο όνομα και διαγράψτε το παλιό.
  • Απενεργοποιήστε τις ανοιχτές εγγραφές αν δεν τις χρειάζεστε: Ρυθμίσεις → Γενικά → «Δικαίωμα εγγραφής μέλους» να είναι ξετσεκαρισμένο, και ο προεπιλεγμένος ρόλος «Συνδρομητής».
  • Σκεφτείτε ένα πρόσθετο που ειδοποιεί όταν δημιουργείται νέος διαχειριστής ή όταν συμβαίνει σύνδεση από νέα τοποθεσία. Στις περισσότερες παραβιάσεις, αυτή η ειδοποίηση είναι η πρώτη ένδειξη.

3. Ρυθμίσεις στο wp-config.php

Το wp-config.php βρίσκεται στη ρίζα της εγκατάστασής σας. Προσθέστε τις παρακάτω γραμμές πριν από τη γραμμή /* That's all, stop editing! */.

Κλείδωμα επεξεργασίας/εγκατάστασης αρχείων (το πιο σημαντικό)

// Απενεργοποιεί τον built-in επεξεργαστή κώδικα θεμάτων/προσθέτων
// και την εγκατάσταση/ενημέρωση plugins & themes από το dashboard.
// Έτσι, ακόμη κι αν κάποιος μπει ως διαχειριστής, ΔΕΝ μπορεί να
// ανεβάσει κακόβουλο πρόσθετο ή να πειράξει αρχεία θέματος.
define('DISALLOW_FILE_MODS', true);

Με αυτή τη ρύθμιση, τις ενημερώσεις τις κάνετε προσωρινά απενεργοποιώντας την (ή μας ζητάτε να τις τρέξουμε). Αν θέλετε να κρατήσετε τις ενημερώσεις από το dashboard αλλά να κλείσετε μόνο τον επεξεργαστή κώδικα, βάλτε αντ' αυτού:

define('DISALLOW_FILE_EDIT', true);

Αποτροπή «τηλεφωνήματος προς τα έξω»

// Εμποδίζει το site να κάνει εξερχόμενες συνδέσεις σε άγνωστους
// διακομιστές. Ένα backdoor που θέλει να «κατεβάσει» δεύτερο στάδιο
// ή να επικοινωνήσει με τον επιτιθέμενο μπλοκάρεται.
define('WP_HTTP_BLOCK_EXTERNAL', true);
define('WP_ACCESSIBLE_HOSTS', 'api.wordpress.org,*.wordpress.org,*.gravatar.com');

Προσθέστε στη λίστα τυχόν υπηρεσίες που όντως χρησιμοποιεί το site σας (π.χ. gateway πληρωμών, εξυπηρετητή email).

Αποτροπή κακόβουλου κώδικα σε περιεχόμενο

// Κανένας χρήστης (ούτε διαχειριστής) δεν μπορεί να εισάγει
// ανεξέλεγκτο HTML/JavaScript μέσα στο περιεχόμενο.
define('DISALLOW_UNFILTERED_HTML', true);

Να μη διαρρέουν πληροφορίες

// Κλειστά τα μηνύματα σφαλμάτων στους επισκέπτες — να μη φαίνονται
// διαδρομές αρχείων και τεχνικές λεπτομέρειες που βοηθούν επιτιθέμενους.
define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);

Ασφαλής σύνδεση & ανανέωση «κλειδιών»

// Επιβάλλει HTTPS στο διαχειριστικό.
define('FORCE_SSL_ADMIN', true);

Επίσης, αν υποψιάζεστε ότι κάποιος είχε πρόσβαση, ανανεώστε τα Security Keys/Salts: αντικαταστήστε τις 8 σχετικές γραμμές (AUTH_KEY κ.λπ.) με νέες από το επίσημο εργαλείο της WordPress (api.wordpress.org/secret-key/1.1/salt/). Αυτό αποσυνδέει αυτόματα όλους τους ενεργούς χρήστες — αναγκάζοντας και έναν πιθανό εισβολέα να ξανασυνδεθεί.

Καθαρό σύστημα (προαιρετικά)

define('WP_POST_REVISIONS', 10);   // λιγότερες αναθεωρήσεις στη βάση
define('EMPTY_TRASH_DAYS', 7);     // αυτόματο άδειασμα κάδου

4. Κανόνες στο .htaccess

Ισχύει μόνο σε φιλοξενία Apache ή LiteSpeed (όπως τα δικά μας πακέτα). Σε Nginx δεν εφαρμόζεται — ρωτήστε μας. Προσθέστε τα πάνω από το # BEGIN WordPress.

Απαγόρευση εκτέλεσης PHP στον φάκελο μεταφορτώσεων

Ο φάκελος uploads προορίζεται για εικόνες/αρχεία — ποτέ για κώδικα. Είναι το αγαπημένο σημείο για να «κρύψει» κανείς κερκόπορτα. Δημιουργήστε ένα αρχείο .htaccess μέσα στο wp-content/uploads/ με περιεχόμενο:

<FilesMatch "\.(?:php|phtml|php3|php4|php5|php7|php8|phps|pht|phar)$">
    Require all denied
</FilesMatch>

Προστασία ευαίσθητων αρχείων

Στο .htaccess της ρίζας:

# Μπλοκάρει πρόσβαση σε αρχεία ρυθμίσεων και «ξεχασμένα» αρχεία
<FilesMatch "^(wp-config\.php|\.htaccess|\.htpasswd|\.env|\.git.*|debug\.log|readme\.html|license\.txt)$">
    Require all denied
</FilesMatch>

# Μπλοκάρει αρχεία backup/πηγαίου κώδικα που μπορεί να μείνουν κατά λάθος
<FilesMatch "\.(?:bak|old|orig|save|swp|sql|tar|tar\.gz|tgz|zip|ini|conf|sh)$">
    Require all denied
</FilesMatch>

Απενεργοποίηση περιήγησης φακέλων

Options -Indexes

Μπλοκάρισμα του xmlrpc.php

Το xmlrpc.php αξιοποιείται συχνά για brute-force και επιθέσεις. Αν δεν χρησιμοποιείτε την εφαρμογή WordPress για κινητά ή απομακρυσμένη δημοσίευση, κλείστε το:

<Files "xmlrpc.php">
    Require all denied
</Files>

Αποτροπή «καταμέτρησης» χρηστών

Οι επιτιθέμενοι δοκιμάζουν ?author=1, ?author=2… για να βρουν ονόματα χρηστών:

RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)author=\d+ [NC]
RewriteRule ^ - [F,L]

(Προχωρημένο, προαιρετικό) Περιορισμός πρόσβασης στη σύνδεση ανά IP

Αν έχετε σταθερή IP (π.χ. γραφείο), μπορείτε να επιτρέψετε σύνδεση μόνο από αυτήν:

<Files "wp-login.php">
    <RequireAny>
        Require ip 1.2.3.4
    </RequireAny>
</Files>

⚠️ Προσοχή: αν η IP σας αλλάζει (οικιακή σύνδεση, κινητό, ταξίδια), θα κλειδωθείτε έξω. Αν δεν είστε σίγουροι, μην το χρησιμοποιήσετε — προτιμήστε το «περιορισμό προσπαθειών σύνδεσης» + 2FA της ενότητας 2.


5. Σάρωση, παρακολούθηση & αντίγραφα ασφαλείας

  • Ένα αξιόπιστο πρόσθετο ασφαλείας (π.χ. Wordfence, Solid Security) για: σάρωση malware, ειδοποιήσεις, 2FA και αρχείο δραστηριότητας. Δεν αντικαθιστά την προστασία του server, αλλά σας δίνει ορατότητα σε ό,τι συμβαίνει μέσα στο WordPress — π.χ. «δημιουργήθηκε νέος διαχειριστής».
  • Αρχείο δραστηριότητας (activity log). Στις παραβιάσεις, αυτό δείχνει ακριβώς πότε και ποιος δημιούργησε τον ύποπτο λογαριασμό ή άλλαξε αρχεία.
  • Τακτικά backups εκτός του site, και — το πιο σημαντικό — δοκιμάστε να τα επαναφέρετε. Ένα backup που δεν έχετε δοκιμάσει δεν είναι backup.

Λίστα ελέγχου (γρήγορη αναφορά)

  • [ ] Ενημερωμένος πυρήνας, πρόσθετα, θέματα — με αυτόματες ενημερώσεις ασφαλείας
  • [ ] Διαγραμμένα όσα πρόσθετα/θέματα δεν χρησιμοποιούνται
  • [ ] Κανένα nulled/πειρατικό πρόσθετο
  • [ ] Ισχυροί & μοναδικοί κωδικοί, με password manager
  • [ ] 2FA υποχρεωτικό σε όλους τους διαχειριστές/συντάκτες
  • [ ] Ελάχιστοι λογαριασμοί διαχειριστή — σωστοί ρόλοι ανά χρήστη
  • [ ] Όχι όνομα χρήστη admin· κλειστές οι ανοιχτές εγγραφές
  • [ ] Περιορισμός προσπαθειών σύνδεσης
  • [ ] DISALLOW_FILE_MODS στο wp-config.php
  • [ ] WP_HTTP_BLOCK_EXTERNAL, DISALLOW_UNFILTERED_HTML, WP_DEBUG=false, FORCE_SSL_ADMIN
  • [ ] .htaccess: όχι PHP στο uploads, προστασία ευαίσθητων αρχείων, -Indexes, μπλοκ xmlrpc, anti-enumeration
  • [ ] Πρόσθετο ασφαλείας + αρχείο δραστηριότητας
  • [ ] Δοκιμασμένα backups εκτός site

Αν χρειάζεστε βοήθεια για να εφαρμόσετε οποιοδήποτε από τα παραπάνω, ή θέλετε να ελέγξουμε αν το site σας έχει ήδη παραβιαστεί, επικοινωνήστε μαζί μας — είμαστε εδώ.