Best Practice für die Versionierung von wp-config.php?

35

Gibt es eine bewährte Methode, um Ihre wp-config.phpDatei in Ihr Versionskontroll-Repository aufzunehmen?

Ich denke darüber nach, eine neue Site mit dieser Art von Konfiguration zu erstellen (ähnlich wie bei Alex King und Mark Jaquith ):

/index.php
/local-config.php
/wp-config.php
/wp/ (core)
/wp-content/ (plugins, themes, etc.)

Wie kann ich dies tun, ohne meine Passwörter git auszusetzen, falls dieses Repository jemals öffentlich wird?

Besonders in Marks Beitrag sieht es so aus, als ob die local-config.php lokale Datenbankdetails und Passwörter speichern kann, aber die produktiven bleiben in der wp-config.php. Ist das zu viel Mühe und sollte ich einfach wp-config.php unversioniert lassen?

jjeaton
quelle
Ich denke, die Art und Weise, wie Mark Jaquith es tut, ist nicht viel Mühe und funktioniert gut und ist etwas besser als die Antwort unten.
Wyck
IMO, alles sollte unter Versionskontrolle gestellt werden und das System sollte in der Lage sein, mit verschiedenen Umgebungen umzugehen, ohne dass irgendwelche Hackerangriffe erforderlich sind. Ich habe gerade gepostet, wie ich es mache, das alle Ihre Anliegen abdeckt :) Lassen Sie mich wissen, wenn Sie Fragen zu meinem Setup haben.
Ashfame

Antworten:

45

So mache ich das und ich bin auf nichts Besseres gestoßen. Ich behalte eine andere Version der wp-config.php-Datei unter Versionskontrolle und behalte dann eine Datei in einem Verzeichnis darüber, in der alle Datenbankanmeldeinformationen und Salt / Keys gespeichert sind. Auch auf diese Weise kann ich zwischen der Art des Setups unterscheiden, das ich ausführe, und die Dinge darauf basierend anders machen.

Hier ist das wp-config.php, unter dem ich mich befinde git( https://gist.github.com/1923821 ):

<?php

/**
* Define type of server
*
* Depending on the type other stuff can be configured
* Note: Define them all, don't skip one if other is already defined
*/

define( 'DB_CREDENTIALS_PATH', dirname( ABSPATH ) ); // cache it for multiple use
define( 'WP_LOCAL_SERVER', file_exists( DB_CREDENTIALS_PATH . '/local-config.php' ) );
define( 'WP_DEV_SERVER', file_exists( DB_CREDENTIALS_PATH . '/dev-config.php' ) );
define( 'WP_STAGING_SERVER', file_exists( DB_CREDENTIALS_PATH . '/staging-config.php' ) );

/**
* Load DB credentials
*/

if ( WP_LOCAL_SERVER )
    require DB_CREDENTIALS_PATH . '/local-config.php';
elseif ( WP_DEV_SERVER )
    require DB_CREDENTIALS_PATH . '/dev-config.php';
elseif ( WP_STAGING_SERVER )
    require DB_CREDENTIALS_PATH . '/staging-config.php';
else
    require DB_CREDENTIALS_PATH . '/production-config.php';

/**
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*/

if ( ! defined( 'AUTH_KEY' ) )
    define('AUTH_KEY', '9*W=5&lt;Rw-)c].9}g?^[:!j]h+Efr&lt;y$&lt;YmV0XOo|lOIujEE}+[R}iAQZ :Sy3wN}');
if ( ! defined( 'SECURE_AUTH_KEY' ) )
    define('SECURE_AUTH_KEY', 'APge3~H;g+b0FyNF&amp;e`$=g?qj9@FQwqFe^Q4(@p#kDa=NR? $Z9|@v*a(tOj*B+.');
if ( ! defined( 'LOGGED_IN_KEY' ) )
    define('LOGGED_IN_KEY', '5l0+:WTpj8#[V|;&lt;Iw;%rkB(A}r++HwT|s[LW!.wt.=5J!b%Z{F1/[LxQ*d7J&gt;Cm');
if ( ! defined( 'NONCE_KEY' ) )
    define('NONCE_KEY', 'zO2cmQX`Kc~_XltJR&amp;T !Uc72=5Cc6`SxQ3;$f]#J)p&lt;/wwX&amp;7RTB2)K1Qn2Y*c0');
if ( ! defined( 'AUTH_SALT' ) )
    define('AUTH_SALT', 'je]#Yh=RN DCrP9/N=IX^,TWqvNsCZJ4f7@3,|@L]at .-,yc^-^+?0ZfcHjD,WV');
if ( ! defined( 'SECURE_AUTH_SALT' ) )
    define('SECURE_AUTH_SALT', '^`6z+F!|+$BmIp&gt;y}Kr7]0]Xb@&gt;2sGc&gt;Mk6,$5FycK;u.KU[Tw$345K9qoF}WV,-');
if ( ! defined( 'LOGGED_IN_SALT' ) )
    define('LOGGED_IN_SALT', 'a|+yZsR-k&lt;cSf@PQ~v82a_+{+hRCnL&amp;|aF|Z~yU&amp;V0IZ}Mrz@ND])YD22iUM[%Oc');
if ( ! defined( 'NONCE_SALT' ) )
    define('NONCE_SALT', '|1.e9Tx{fPv8D#IXO6[&lt;WY*,)+7+URp0~|:]uqiCOzu93b8,h4;iak+eIN7klkrW');

/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each a unique
* prefix. Only numbers, letters, and underscores please!
*/

$table_prefix = 'ft_';

/**
* WordPress Localized Language, defaults to English.
*
* Change this to localize WordPress. A corresponding MO file for the chosen
* language must be installed to wp-content/languages. For example, install
* de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
* language support.
*/

define( 'WPLANG', '' );

/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*/

if ( WP_LOCAL_SERVER || WP_DEV_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', true );

    define( 'SCRIPT_DEBUG', true );
    define( 'SAVEQUERIES', true );

} else if ( WP_STAGING_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', false );

} else {

    define( 'WP_DEBUG', false );
}


/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

Und hier ist die lokale Konfigurationsdatei, die sich in einem Verzeichnis oberhalb des WordPress-Stammverzeichnisses befindet. Dadurch ist sie auch außerhalb des im Web zugänglichen Verzeichnisses verfügbar. Falls Apache also aufhört, PHP-Dateien zu analysieren und sie wegzuwerfen, sind unsere Datenbank-Anmeldeinformationen immer noch sicher ( https: / /gist.github.com/1923848 ):

<?php

/**
 * WordPress config file to use one directory above WordPress root, when awesome version of wp-config.php is in use.
 *
 * Awesome wp-config.php file - https://gist.github.com/1923821
 */

/* WordPress Local Environment DB credentials */

define('DB_NAME', 'project_21');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

/* Keys & Salts */

define('AUTH_KEY',         '5H%)s-nQ,+fn0gwg/p1UjBTmCQ?l[8-!>Q{MW&?X3DM,OF;TaI<SOOTrl0+-@) *');
define('SECURE_AUTH_KEY',  '+%rr@,XIt-V+[.B9++uH1L,L+r)uq}5(:~=&4~Lk|.LV|y;R}fEo?G}+Sntf_JN}');
define('LOGGED_IN_KEY',    'Szv!gQm9#(L&TUD OnM`>sXGge:m1j`L2 5sO;hRNVhlN>IUED1/`%<[ly-GxVJ ');
define('NONCE_KEY',        'o-Jo;>G#-%~,[ki@REqXV%4^I.HDnc.3]P;e8];4pJt% $xe5K<aOb|a2*QKV4c-');
define('AUTH_SALT',        '8-tQb3d|W8,;Y_#mfuFB.1&b%U2fnlLD|F&yH).tLRX=ANEdNap{78o|9tqv6JPt');
define('SECURE_AUTH_SALT', 'RSa%^qd~T|@+!-;qgh,qK-GJ}zPpgxz#+@v6-I;BMwqT`TzGTtg_^n*ILxGOdbq4');
define('LOGGED_IN_SALT',   ']+XV)YK.Q-EU1vR [BT!Y$!d(J_[AO37OP[Fg[/esFx;6cI-L[^O|cvtw9F[;_*Q');
define('NONCE_SALT',       'iP{nTQBzy&f^hSbwBgyan.v9<+ErvAMi2ymLhz`Tl-fF?HXa(j<W`wA*8U3R#-|w');

Auf diese Weise local-config.phpverhält sich mein System , wenn die oben genannte Datei benannt ist , wie eine lokale Installation. Wenn es benannt ist staging-config.php, verhält es sich wie eine Staging-Installation und wenn es benannt ist production-config.php. Es hilft mir, unterschiedliche Werte für bestimmte Konstanten zu haben, z. B. Debuggen, unterschiedliche Werte unter verschiedenen Umgebungen und immer noch alles unter SCM (Git). Die Möglichkeiten sind endlos und es ist kein Hacker für verschiedene Umgebungen erforderlich.

Dies stellt sicher, dass Sie niemals vertrauliche Informationen öffentlich zugänglich machen und ich starte damit jedes Projekt, an dem ich arbeite. Ich habe standardmäßig stärkere Schlüssel und sobald ich sie der zweiten Konfigurationsdatei hinzufüge, ein Verzeichnis darüber. diese werden anstelle der hier definierten verwendet. Glückseligkeit!

Ashfame
quelle
Ich mag diesen Ansatz, ich werde wahrscheinlich am Ende so etwas tun.
JJeaton
Wie verweisen Sie auf die lokale Konfigurationsdatei im übergeordneten Verzeichnis in der Hauptkonfigurationsdatei? Über einen symbolischen Link oder über ../(dh ../filename) irgendwo? - Ich habe keine ../in der Hauptdatei gefunden wp-config.php.
KajMagnus
1
@ KajMagnus Die Konstante DB_CREDENTIALS_PATHmacht das.
Ashfame
9

Wie kann ich dies tun, ohne meine Passwörter git auszusetzen, falls dieses Repository jemals öffentlich wird?

Wenn sich Ihre wp-config.phpDatei in der Versionskontrolle befindet, werden alle darin enthaltenen Kennwörter ebenfalls in der Versionskontrolle aufgeführt. Die einzige Möglichkeit, dies zu vermeiden, besteht darin , die Datei nicht der Versionskontrolle zu unterziehen.

Ist das zu viel Mühe und sollte ich einfach wp-config.php unversioniert lassen?

Mein Bauchgefühl wäre es, wp-config.phpvöllig unversionslos zu bleiben . Aber es gibt einige Möglichkeiten, dies zu umgehen.

Extrahieren Sie den Teil wp-config.php, der Ihre Passwörter und Hashes enthält, in eine separate Datei und include()in die reguläre wp-config.phpDatei. Dann Platz wp-config.phpunter Versionskontrolle, aber halten Sie Ihre include()Datei getrennt.

wp-config.php:

<?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, WordPress Language, and ABSPATH. You can find more information
 * by visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
 * wp-config.php} Codex page. You can get the MySQL settings from your web host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don't have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

include( 'conf.php' );    

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'wp_';

/**
 * WordPress Localized Language, defaults to English.
 *
 * Change this to localize WordPress. A corresponding MO file for the chosen
 * language must be installed to wp-content/languages. For example, install
 * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
 * language support.
 */
define('WPLANG', '');

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 */
define('WP_DEBUG', false);

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

Sie können jetzt sehen, dass Passwörter und Hashes überhaupt nicht enthalten sind wp-config.php.

conf.php:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');


/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

Aber ehrlich gesagt, fügen Sie hier nur eine redundante Abstraktionsebene hinzu. Der gesamte Grund wp-config.phpist in erster Linie getrennt, weil es umgebungsspezifisch ist. Sie sollten es überhaupt nicht von einem lokalen Server in die Produktion kopieren ... es sollte also überhaupt nicht unter Versionskontrolle stehen.

EAMann
quelle
Es scheint etwas mehr Arbeit zu sein, aber ich sehe die Vorteile darin, sicherzustellen, dass alle Einstellungen von wp-config zwischen den Umgebungen synchron sind.
JJeaton
Das Teilen wp-config.phphat einen zusätzlichen Vorteil: Sie können conf.phpin ein Nicht-WP-Skript einbinden, ohne WordPress vollständig zu laden.
Tamlyn
4

Marks Beispiel geht davon aus, dass Sie mit einem privaten Repo arbeiten:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
  include( dirname( __FILE__ ) . '/local-config.php' );
  define( 'WP_LOCAL_DEV', true ); 
} else {
  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
}

Anstatt die Anmeldeinformationen zu definieren, können Sie auch eine production-config.php-Datei erstellen und in die bedingte Prüfung einbeziehen:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
      include( dirname( __FILE__ ) . '/local-config.php' );
      define( 'WP_LOCAL_DEV', true ); 
    } else {
     include( dirname( __FILE__ ) . '/production-config.php' )
    }

Dann in deiner unversionierten production-config.php:

  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
Chris_O
quelle
Selbst wenn es sich um ein privates Repo handelt, möchte ich nicht, dass die Passwörter darin gespeichert werden, und ich möchte die Flexibilität, das Repo öffentlich zu machen, wenn ich dies wünschte. Die production-config.php ist wahrscheinlich ein guter Weg.
JJeaton
2

Sie könnten die wp-config.phpDatei ohne Ihre geheimen Zeichenfolgen in das Repository übertragen und dann ausführen:

git update-index --assume-unchanged wp-config.php

Dies wird git sagen, dass anzunehmen ist, dass die Datei nun unverändert ist.

getWeberForStackExchange
quelle
4
Gut zu wissen, war sich des assume-unchangedWechsels nicht bewusst , aber hier sind meine zwei Punkte: (1) Wenn Sie die Datei direkt hinzufügen, wird sie dem Index hinzugefügt. Es besteht also die Gefahr, dass Sie es versehentlich irgendwann hinzufügen. (2) Wenn Sie ein Commit mit diesem Flag zusammenführen, schlägt die Zusammenführung ordnungsgemäß fehl, sodass Sie sie manuell handhaben können. Dies ist also keine elegante Lösung. Es kann nur verwendet werden, um Änderungen während einer Entwicklungssitzung vorübergehend zu ignorieren. Lesen Sie hier mehr - gitready.com/intermediate/2009/02/18/…
Ashfame