Tipps, WordPress

WordPress gehackt – was tun, eine Schnellhilfe

… die keinen Anspruch auf Vollständigkeit erhebt und mal eben dem einen oder anderen Leser dienen soll und getrieben aus gegebene Anlass. Das Hacken von Blogs ist keine Eigenart von WordPress Blogs – dies kann jedem CMS passieren. Ebenso kannst du dir nicht sicher sein, dass du nicht betroffen bist, nur weil du irgendein Plugin aktiv hast und weil du die aktuellste Version von WordPress fährst.

Wobei es hier keine Diskussion werden soll, ob WordPress mehr als andere Applikation betroffen ist oder anfälliger ist. Die Unterschiede sind weitreichend – Schwachstellen gehören zur Software und die meisten Standard-Tools sind nur für das Gewissen oder den Geldbeutel.
Weiterlesen

Standard
Tipps, WordPress

Vorbei mit my-hacks.php?

Noch diesen Monat soll die neue Version 2.8 von WordPress erscheinen; in der Blogosphäre wird schon lange kein so großer Wind mehr darum gemacht, wie es noch in den Jahren um Version 2.0 war. Aber der Linkmangel etc. wird ja auch in anderen Themen bemängelt.

Die neue Version bringt viele neue Sachen, fixt eine große Anzahl von Problemen und WordPress gestaltet sich aus meiner Sicht noch offener als in den Versionen zu vor. Eine der Punkte, die Benutzer beachten sollten, ist die Tatsache, dass man die Option für die Unterstützung der my-hacks.php entfernt. 2003 wurde diese Datei noch als Feature angekündigt, geht sie nun wieder still und leise. WordPress hat ein ausgefeiltes Schnittstellen-System; man kann an diversen Punkten ansetzen und neue Funktionalitäten einbringen, so dass man sich dazu entschieden hat, die Lösung nicht mehr zu unterstützen. Alternativen und Möglichkeiten des weiteren Nutzen will hier kurz aufzeigen.
Weiterlesen

Standard
Tipps, WordPress

Schütze deine wp-config.php

WP
Ronald Huereca erklärt in einem Artikel auf Devlounge, wie man dafür sorgt, dass die wp-config.php der WordPress-Installation nicht für Hacker einfach erreichbar ist um so die Möglichkeit eines Hackerangriffs auf das eigene Blog zu erschweren.

Die wp-config.php ist der Schlüssel zur Datenbank und damit stehen einem Eindringen in die Datenbank nur wenige Handgriffe bevor und schon liegt die DB offen, Damit kann ein „Bösewicht“ die Daten verändern oder gar alle Daten löschen. Also liegt es nahe, diese Datei vor fremden Zugriff zu schützen. Wie und und mit welchen Mitteln man dies machen kann, das erklärt der Artikel auf zwei unterschiedliche Wegen.

Ich habe die jeweiligen Code-Schnippsel im Anschluss nochmal hinterlegt, da ich die Idee für sinnvoll und machbar, auch für den „Laien“, erachte, so dass man auch mit deutschen Sprachkenntnissen der Idee folgen und umsetzen kann. Weiterlesen

Standard
Tipps, WordPress

WordPress Sicherheitslücke nach Update auf 2.0.6

Nach dem vor kurzem das Update auf 2.0.6 veröffentlicht wurde, gibt es erneut Probleme, wobei es diesmal an einem PHP-Problem liegt. Weitere Hinweise und mögliche Berichtigungen mit register_globals sind unter anderem bei Jowra, Michael und Robert zu finden.

Nur als kurzer Hinweis, im englischen Original ist das Feedburner bzw. Feed-Problem auch in der Version 2.0.6 behoben. Kurz nach der ersten Veröffentlichung wurde es nochmals geändert und neu hoch geladen, die Version wurde nicht hoch gezählt. Im deutschen Update 2.0.5 –> 2.0.6 ist dieser Fehler noch drin, so dass man dort folgende Veränderung vornehmen muss.

Achtung: Keine Garantie auf Funktion! Sicherung anfertigen.

Bearbeite die Datei functions.php im Verzeichnis wp-includes und suche folgenden Code (Zeile 2.231):


if ( substr(php_sapi_name(), 0, 3) == 'cgi' )
@header("HTTP/1.1 $header $text");
else
@header("Status: $header $text");

ändern in (die drei Zeilen löschen):


@header("HTTP/1.1 $header $text");

Um nun das aktuelle Problem PHP zu beseitigen sollte folgender Workaround helfen.

In Datei wp-settings.php Zeile 16:


if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) )
	unset($GLOBALS[$k]);

ändern in:


if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) ) {
	$GLOBALS[$k] = NULL;
	unset($GLOBALS[$k]);
}
Standard
Tipps, WordPress

Sicherheitslücke in WordPress < 2.0.6

Mal wieder wurde eine Sicherheitslücke im System von WordPress entdeckt, der SecurityForus berichtet. Das Problem wird als Hoch (7.0) eingestuft und sollte behoben werden. Dazu gibt es einen Patch, der folgender maßen aussieht oder downloade die aktuelle Datei auf der Patch-Seite und überschreibe die aktuelle Datei.

** In der Version 2.0.6 beta 1 ist der Fehler nicht behoben!

Workflow:

Die Datei templates.php im Ordner wp-admin bearbeiten. Suche nach (ab Zeile 111):


<?php
echo '<ol>';
foreach ($recents as $recent) :
	echo "<li><a href='templates.php?file=" . wp_specialchars($recent, true) . "'>" . get_file_description(basename($recent)) . "</a></li>";
endforeach;
?>

und ersetze mit:


<?php
echo '<ol>';
foreach ($recents as $recent) :
	echo "<li><a href='templates.php?file=" . attribute_escape($recent) . "'>" . wp_specialchars(get_file_description(basename($recent))) . "</a></li>";
endforeach;
?>
Standard
Tipps, Webküche, WordPress

WP – simpler Spamschutz bei Kommentaren

SPAM
Mit Hilfe einer Checkbox frage ich in meinem Kommentarformular die „willigen Schreiber“ ob sie menschlicher Natur sind. Ich filtere somit die vielen Spammails, die ansonsten bisher ereilt haben. Ich denke, dass es für die Leser nicht sonderlich mehr Aufwand ist, diese kleine Checkbox zu setzen. Außerdem sollte damit das Formular barrierefrei bleiben, hoffe ich, da ich mich in dieser Materie nicht so gut auskenne.

Mich würde interessieren, wie sinnvoll so eine Möglichkeit ist. Vielleicht liest das hier einer der Spam-Profis und kann mir etwas dazu sagen?

Für diejenigen unter euch, die es auf die gleiche Art bewerkstelligen möchten erläutere ich kurz die notwendigen Änderungen.

Achtung:

Für diese Anwendung ist ein Eingriff in die Core-Dateien notwendig und somit ist ein Update weiterhin möglich, man muss nur dann diese Änderung wieder einbauen, insofern diese Dateien vom Update betroffen sind.

Implementierung:

Zu erst bauen wir das zusätzliche Feld in das Kommentarformular. Dazu muss das Template eures Themes bearbeitet werden, in dem Fall meist die comments.php im Theme Ordner ( bei default: /wp-content/themes/default_de/comments.php ).
Zusätzlich integrieren wir noch eine kleine Abfrage, damit wir als eingeloggte User den Haken nicht setzen müssen, sondern der ist schon für uns gesetzt, insofern wir eingeloggt sind.


<p>
<input class="subscribe" type="checkbox" name="spam" id="spam" value="spam" &lt;?php if($comment_author != $user_identity) { echo "checked='checked'";  } ?&gt; />
<label class="subscribe" for="spam">SPAMSCHUTZ, ich bin menschlich? (*)</label>
</p>

Setzt die obigen Zeilen an die Stelle im Formular, also innerhalb von


<form action="... >
...
</form>

, wo die Checkbox erscheinen soll.

Nun müssen wir die wp-comments-post.php in Rootverzeichnis von WP bearbeiten.
Hier hinterlegen wir die Abfrage, ob die Checkbox auch gesetzt ist.


...
$comment_author       = trim($_POST['author']);
$comment_author_email = trim($_POST['email']);
$comment_author_url   = trim($_POST['url']);
// SPAMSCHUTZ, ich bin menschlich?
$comment_author_spam   = trim($_POST['spam']);
$comment_content      = trim($_POST['comment']);

...

if ( '' == $comment_content )
	die( __('Error: please type a comment.') );

// SPAMSCHUTZ, ich bin menschlich?
if ( '' == $comment_author_spam )
	die( __('Fehler: Wenn du menschlich bist, dann setze die Checkbox (Spamschutz).') );

...

setcookie('comment_author_url_' . COOKIEHASH, stripslashes($comment_author_url), time() + 30000000, COOKIEPATH);
// Wenn der Haken vergessen wurde, so soll der Text nach dem Zurueck-Klicken gespeichert bleiben
setcookie('comment_author_spam_' . COOKIEHASH, stripslashes($comment_author_spam), time() + 30000000, COOKIEPATH);

Die Datei wieder hoch laden und der kleine Spamschutz ist fertig.

Im Fall einer WordPress-Installation 2.0.4 sieht der Code der wp-comments-post.php folgendermaßen aus.


<?php
require( dirname(__FILE__) . '/wp-config.php' );

nocache_headers();

$comment_post_ID = (int) $_POST['comment_post_ID'];

$status = $wpdb->get_row("SELECT post_status, comment_status FROM $wpdb->posts WHERE ID = '$comment_post_ID'");

if ( empty($status->comment_status) ) {
	do_action('comment_id_not_found', $comment_post_ID);
	exit;
} elseif ( 'closed' ==  $status->comment_status ) {
	do_action('comment_closed', $comment_post_ID);
	die( __('Sorry, comments are closed for this item.') );
} elseif ( 'draft' == $status-post_status ) {
	do_action('comment_on_draft', $comment_post_ID);
	exit;
}

$comment_author       = trim($_POST['author']);
$comment_author_email = trim($_POST['email']);
$comment_author_url   = trim($_POST['url']);
// SPAMSCHUTZ, ich bin menschlich?
$comment_author_spam  = trim($_POST['spam']);
$comment_content      = trim($_POST['comment']);

// If the user is logged in
$user = wp_get_current_user();
if ( $user->ID ) :
	$comment_author       = $wpdb->escape($user->display_name);
	$comment_author_email = $wpdb->escape($user->user_email);
	$comment_author_url   = $wpdb->escape($user->user_url);
else :
	if ( get_option('comment_registration') )
		die( __('Sorry, you must be logged in to post a comment.') );
endif;

$comment_type = '';

if ( get_settings('require_name_email') && !$user->ID ) {
	if ( 6 > strlen($comment_author_email) || '' == $comment_author )
		die( __('Error: please fill the required fields (name, email).') );
	elseif ( !is_email($comment_author_email))
		die( __('Error: please enter a valid email address.') );
}

if ( '' == $comment_content )
	die( __('Error: please type a comment.') );

// SPAMSCHUTZ, ich bin menschlich?
if ( '' == $comment_author_spam )
	die( __('Fehler: Wenn du menschlich bist, dann setze die Checkbox (Spamschutz).') );

$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'user_ID');

$comment_id = wp_new_comment( $commentdata );

if ( !$user->ID ) :
	$comment = get_comment($comment_id);
	setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
	setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
	setcookie('comment_author_url_' . COOKIEHASH, clean_url($comment->comment_author_url), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
	setcookie('comment_author_spam_' . COOKIEHASH, clean_url($comment->comment_author_spam), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
endif;

$location = ( empty( $_POST['redirect_to'] ) ) ? get_permalink( $comment_post_ID ) : $_POST['redirect_to']; 

wp_redirect( $location );

?>
Standard
Tipps, WordPress

WP – Die letzten 15 Beiträge

Für einige WP-Anwender ist es umständlich oder unübersichtlich nur die letzten 15 Beiträge in Admin-Oberfläche zu sehen. Wer des öfteren auf ältere Artikel zu greifen muss, den stört diese geringe Anzahl.
Um diese Anzahl zu ändern, genügt ein kleiner Eingriff in die edit.php in wp-admin.

Achtung:

Dadurch werden die Standard-Dateien (Core) von WP verändert, in diesem Fall die edit.php. Durch diesen Eingriff kann nicht so einfach ein Update von WP durchgeführt werden. Fertigt in jedem Fall vorher eine Kopie eures Blogs und der Datenbank an.

Die notwendige Größe wird in Zeile 59 (WP 2.0.1) geändert. Ändert die 15 auf euren Wunschwert.


<?php $what_to_show = 'posts'; $posts_per_page = 15; $posts_per_archive_page = -1;

Die Überschrift stimmt dann natürlich nicht mehr mit der Anzahl überein. Um diese anzupassen muss noch in Zeile 72 (WP 2.0.1) der Text „Last 15 Posts“ geändert werden. In diesem Fall muss der komplette String geändert werden, da die Übersetzungsdatei (.mo) nur auf den Original-String zugreifen kann.


if ( is_single() )
	printf(__('Comments on %s'), $post->post_title);
elseif ( ! is_paged() || get_query_var('paged') == 1 )
	_e('Last 15 Posts');
else
	_e('Previous Posts')
Standard