Kategorien

Suchen


Aktuelle Artikel

Archiv

Anleitungen

« Vorherige Beiträge

PHP: Zufallszeichenkette erzeugen (random string)

Montag, 08.03.2010

Um eine Zeichenkette (string) mit zufälligen Zeichen zu erzeugen, können Sie folgende PHP Funktion nutzen:

1
2
3
4
5
6
7
8
9
10
// Zufallsgenerator schütteln
mt_srand((double) microtime() * 1000000); 
 
// Basiszeichenpool
$set = "ABCDEFGHIKLMNPQRSTUVWXYZ123456789";
$pin = "";
 
// 10 stelligen PIN aus den o.a. Zeichen erzeugen
for ($n=1;$n<=10;$n++)
	$pin .= $set[mt_rand(0,(strlen($set)-1))];

Natürlich geht das o.a. PHP Script auch für längere Zeichenketten. Ersetzen Sie einfach die “10″ (Zeile 9) durch die gewünschte Anzahl an Zeichen.

In der Variablen “set” (Zeile 5) können Sie die Zeichen festlegen, aus denen der Zufallsgenerator Ihre Zeichenkette erstellen soll.

.htaccess: Zugriff auf ein Unterverzeichnis erlauben

Sonntag, 07.03.2010

Es gibt Fälle, da möchte man ein Verzeichnis per .htaccess schützen – trotzdem aber den Zugriff auf ein Unterverzeichnis des geschützten Verzeichnisses wieder erlauben.

Praxis-Beispiel:

Um Ihre WordPress Installation zusätzlich zu sichern, sperren Sie das /wp-admin Verzeichnis durch eine .htaccess / .htpasswd Kombination. Dadurch werden aber andere Logins (z.Bsp. von normalen Benutzern auf der Webseite) auch blockiert, da bei die Loginmaske Dateien aus dem /wp-admin/css und /wp-admin/images Verzeichnis abruft.

Lösung:

Erstellen (der belassen) Sie den Schutz wie in unserem Artikel “WordPress: Schutz des Administrationsbereiches (wp-admin)/” beschrieben für den /wp-admin/ Ordner.

Erstellen Sie zusätzlich in den beiden Unterordnern “css” und “images” eine weitere .htaccess Datei mit diesem Inhalt:

Order Deny,Allow
Allow from all
Satisfy any

Nun werden Sie beim Zugriff auf “www.domain.de/wp-admin” nach Ihren Zugangsdaten gefragt. Möchte sich ein Benutzer jedoch normal über die Loginmaske anmelden, sieht es das bekannte Formular und wird nicht eingeschränkt.

WordPress: Besucher protokollieren und auswerten

Sonntag, 07.03.2010

Für das WordPress Plugin “IP Logger” gibt es eine neue Version: 3.0

Neu in dieser Version ist die Möglichkeit, die Logs (= die protokollierten Besucherdaten) online auf den eigenen Computer herunterzuladen und dort weiter auszuwerten. Auch wird dadurch die meist vergleichsweise teure Onlinespeicherplatz geschont und die Logs auf dem lokalen PC gesammelt.

Das (ebenfalls kostenlose) Zusatztool hierfür heißt:
IP Logger Analyzer (IPLA)

Neben dem normalen protokollieren Ihrer Webseitenbesucher haben Sie die Möglichkeit, Ihre Webseite vor unerwünschten Besuchern zu schützen. Die enthaltene Option “Unerwünschte Besucher blockieren” können Sie einfach in den Einstellungen des Plugins aktivieren und dann definieren, welchen Besucher Sie nicht Ihre Webseite zeigen wollen:

Diese Technik hilft auch, die meisten sog. Bots (= Automatische Suchprogramme, die meist Ihre komplette Webseite versuchen zu katalogisieren) auszusperren. Auch gegen “Spider” Software (= Herunterladen Ihrer kompletten Webseite auf einen PC, Offline verfügbar machen) hilft die Option zuverlässig.

Mehr Informationen auf der Webseite des Autors.

mySQL: Update if exists else insert record (SQL statement)

Sonntag, 07.03.2010

Wenn Sie einen Datensatz in eine Datenbanktabelle einfügen möchten (wenn er noch nicht existiert) oder diesen updaten möchten (wenn er existiert), hilft dieser SQL Befehl:

1
INSERT INTO TABLE (FIELDS) VALUES (VALUES) ON DUPLICATE KEY UPDATE FIELD = value

Dieses Statement prüft, ob der Primary Key (PK) für den einzufügenden Datensatz bereits besteht, nutzt dann ein Update Befehl und ansonsten Ihren angegeben Insert Befehl.

Beispiel

Wir haben eine Tabelle “Test” mit den Feldern “A”, “B” (je vom Typ varchar) und “C” (integer). Die Felder “A” und “B” sind unser PK.

Ein normales SQL Insert Statement in die leere Tabelle:

1
2
INSERT INTO Test (A,B,C) VALUES ('Testtext A1','Texttext B1', 110);
INSERT INTO Test (A,B,C) VALUES ('Testtext A2','Texttext B2', 250);

Danach stehen folgende Daten in der Tabelle “Test”:

A B C
Testtext A1 Texttext B1 110
Testtext A2 Texttext B2 250

Nun möchten wir einen weiteren Datensatz einfügen. Werden unter dem PK Daten gefunden, sollen diese überschrieben (aktualisiert) werden – ansonsten wird der Datensatz normal eingefügt:

INSERT INTO Test (A,B,C) VALUES ('Testtext A2','Texttext B2', 285) 
    ON DUPLICATE KEY UPDATE C = 285;
INSERT INTO Test (A,B,C) VALUES ('Testtext A3','Texttext B3', 310) 
    ON DUPLICATE KEY UPDATE C = 310;

Jetzt sieht der Inhalt der Tabelle “Test” wie folgt aus:

A B C
Testtext A1 Texttext B1 110
Testtext A2 Texttext B2 285
Testtext A3 Texttext B3 310

Die roten Texte sind im Gegensatz zur ersten Ansicht verändert.

insert into Test (A,B,C) values (‘Testtext A2′,’Texttext B2′, 285) ON DUPLICATE KEY UPDATE C = 28

mySQL: In PHP vor SQL Injection schützen

Samstag, 06.03.2010

Wie wir in unserem Artikel “mySQL: Schutz vor Angriffen in Datenbankabfragen (SQL Injection)” bereits erklärt haben, ist es vergleichsweise einfach möglich, durch ungesicherte bzw. ungeprüfte Parameter schadhaften oder zerstörenden Code in Ihre SQL Statements einzufügen.

Wie Sie sich z.Bsp. in PHP einfach und schnell gegen solche Angriffe schützen können, zeigt folgender Codeausschnitt:

1
2
foreach ($_REQUEST as $key =&gt; $val)
  $_REQUEST["$key"] = mysql_real_escape_string($val);

Es werden alle übergebenen Parameter (GET und POST) durch die mySQL Funktion “mysql_real_escape_string” überarbeitet. Dadurch werden die für eine Injektion benötigten Zeichen unschädlich gemacht und der Datenbankserver wird im Normalfall mit der “kaputten” SQL Anweisung nichts anfangen können.

Für weitere Informationen zum Thema SQL Injektion besuchen Sie bitte unseren o.a. Artikel.

C#: “System.Data.XmlReadMode” enthält keine Definition für “WriteSchema” (CS0117)

Sonntag, 21.02.2010

Wenn Sie beim Programmieren in C# (CSharp) eine der beiden folgenden Fehlermeldungen erhalten, passen Befehl und Option nicht zueinander.

“System.Data.XmlReadMode” enthält keine Definition für “WriteSchema”. (CS0117) – C:\test\xml_error.cs:186,37

“System.Data.XmlWriteMode” enthält keine Definition für “ReadSchema”. (CS0117) – C:\test\xml_error.cs:186,37

Korrigieren Sie Ihren Befehl entsprechend, denn nur beim XmlReadMode können Sie die Option “ReadSchema” verwenden und nur bei XmlWriteMode die Option “WriteSchema”. In Ihrem Fall werden Sie Befehl und Option miteinander gemixt haben:

Falsch

1
2
DataSet ds = new DataSet();
ds.ReadXml("test.xml", XmlReadMode.WriteSchema);

oder

1
2
DataSet ds = new DataSet();
ds.WriteXml("test.xml", XmlWriteMode.ReadSchema);

Richtig

1
2
DataSet ds = new DataSet();
ds.ReadXml("test.xml", XmlReadMode.ReadSchema);

oder entsprechend

1
2
DataSet ds = new DataSet();
ds.WriteXml("test.xml", XmlWriteMode.WriteSchema);

C#: SQLite Datenbank einbinden und nutzen (auch für SharpDevelop)

Freitag, 19.02.2010

SQLite ist eine dateibasierte Datenbank, welche Sie mit SQL Befehlen (wie mySQL, MS SQL, usw.) verwalten können.

Installation

Vorbereitungen für Ihr C# Projekt

Sie können die nun installierten ADO.NET SQLite Komponenten nutzen. zur Vereinfachung sollten Sie die benötigten Libraries (DLLs) in Ihren Projektordner kopieren:

In SharpDevelop die DLL als Referenz hinzufügen

SQLite Unterstützung im Projekt einbinden

1
using System.Data.SQLite;

Datenbank in C# zur Laufzeit (Runtime) erstellen

Beispiel:

1
2
3
SQLiteConnection connection = new SQLiteConnection("Data Source=test.dat");
connection.Open();
connection.Close();

Nachdem Sie den Source des Beispiels ausgeführt haben, finden Sie eine (noch leere) Datenbank “test.dat” im Verzeichnis der ausgeführten .EXE Datei.
In unserem Beispiel liegt diese SQLite Datenbank also unter “C:\tmp\HalloWelt\bin\Debug”.

Datenbank-Tabellen in C# zur Laufzeit erstellen

Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
SQLiteConnection connection = new SQLiteConnection("Data Source=test.dat");
connection.Open();
 
SQLiteCommand command = new SQLiteCommand(connection);
command.CommandText = String.Format("create table {0} (" +
    "  ID integer not null primary key autoincrement," +
    "  Name varchar(100) not null," +
    "  City varchar(100))",
    "Adressen");
command.ExecuteNonQuery();
 
connection.Close();

Im Beispiel wird eine einzelne Tabelle mit dem Namen “Adressen” und den Feldern “ID, Name, City” erstellt. Das Feld “ID” ist dabei der PK (Primary Key) und wird automatisch bei jedem Datensatz hochgezählt (Increment +1).

Daten in eine Tabelle in C# zur Laufzeit einfügen

Dieses Beispiel steht stellvertretend für jeden weiteren verfügbaren SQL Befehl. Eine Übersicht der anwendbaren SQL Befehle finden Sie in der SQLite Hilfe oder auf der SQLite Webseite:
http://www.sqlite.org/

Wie Sie Daten aus Tabellen abrufen können (SELECT Statements) finden Sie im nächsten Beispiel.

Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQLiteConnection connection = new SQLiteConnection("Data Source=test.dat");
connection.Open();
 
SQLiteCommand command = new SQLiteCommand(connection);
command.CommandText = String.Format("insert into Adressen (Name,City) values ('{0}','{1}')",
    "Max Muster",
    "Hamburg");
command.ExecuteNonQuery();
 
command.CommandText = String.Format("insert into Adressen (Name,City) values ('{0}','{1}')",
    "Bertha Besser",
    "Berlin");
command.ExecuteNonQuery();
 
connection.Close();

Im Beispiel werden zwei Datensätze in die oben erstellte Tabelle “Adressen” eingefügt:

  1. Max Muster, Hamburg
  2. Bertha Besser, Berlin

Daten aus einer Tabelle in C# zur Laufzeit abfragen

Dieses Beispiel steht stellvertretend für alle weiteren SQL Befehle, mit denen Sie Daten aus Ihrer Datenbank auslesen.

Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQLiteConnection connection = new SQLiteConnection("Data Source=test.dat");
connection.Open();
 
SQLiteCommand cmd = new SQLiteCommand("select * from Adressen", connection);
SQLiteDataReader reader = cmd.ExecuteReader();
 
if (reader.HasRows)
while (reader.Read())
{
  string name = reader.GetString(reader.GetOrdinal("Name"));
  string city = reader.GetString(reader.GetOrdinal("City"));
  MessageBox.Show(string.Format("{0}, {1}", name, city));
}
 
connection.Close();

Im Beispiel werden alle Datensätze aus der oben erstellten Tabelle “Adressen” eingelesen.
Jeder Datensatz wird dem Benutzer dann als MessageBox angezeigt.

SQLite Datenbank löschen

Ihre Datenbank können Sie (auch aus C# heraus) sehr einfach löschen, indem Sie die Datei “test.dat” (in unserem Beispiel) von der Festplatte löschen.

Voraussetzung ist, dass Sie keine offenen Verbindungen zur Datenbank haben. Ansonsten erhalten Sie einen Zugriffsfehler (“Access denied”).

Achtung:
Wenn Sie die Datendatei Ihrer SQLite Datenbank löschen, verlieren Sie sofort alle gespeicherten Daten !

SVN: Die .svn Ordner rekursiv aus den Verzeichnissen löschen

Dienstag, 16.02.2010

Wenn Sie SVN Projekte betreiben und die lokalen Verzeichnisse kopieren oder weitergeben möchten, dann stören häufig die .svn Folder (Ordner) in jedem einzelnen Unterverzeichnis.

Um diese einfach und schnell zu löschen, legen Sie sich eine Batchdatei mit folgendem Inhalt an:
FOR /F "tokens=*" %%G IN ('DIR /B /AD /S *.svn*') DO RMDIR /S /Q %%G
Direkt auf der Kommandozeile ausgeführt, funktioniert der Befehl leider (meist) nicht.

Um in der Kommandozeile direkt die Batchdatei (hier: “delete_svn.bat”) anzulegen, nutzen Sie folgende Befehle:
copy con delete_svn.bat
FOR /F "tokens=*" %%G IN ('DIR /B /AD /S *.svn*') DO RMDIR /S /Q %%G
^Z

Danach finden Sie im aktuellen Verzeichnis die “delete_svn.bat” und können Sie ausführen.

Achtung:
Die .SVN Ordner werden ohne Rückfrage sofort und rekursiv gelöscht, d.h. auch alle .SVN Ordner in allen Unterverzeichnissen des aktuellen Orderns werden gelöscht.

Sollte das Script mit einem Fehler “” beendet werden, bitte die Anführungszeichen im Befehl entsprechend ändern (z.Bsp. von ” zu ‘ ).

In Linux funktioniert der folgende Befehl:

rm -rf `find . -type d -name .svn`

Ein System per VirtualBox auf einer (realen) Festplatte installieren

Dienstag, 09.02.2010

Die Freeware “VirtualBox” erlaubt es Ihnen auf Ihrem Computer andere (virtuelle) System zu installieren und betreiben. Normalerweise nutzt die Software dafür ebenfalls virtuelle Festplatten auf Ihrem eigentlichen (realen) PC.

Wenn Sie nun ein System auf einer physikalischen Festplatte (im gegensatz zur üblichen virtuellen Festplatte) installieren möchten, stellt Ihnen VirtualBox ab Version 2.2.2 dafür Techniken zur Verfügung. Wir möchten hier kurz zeigen, wie Sie anhand eines Beispieles diese Technik nutzen können:

1. Schritt: Festplatte mit Ihrem Computer verbinden

Entweder bauen Sie die zu verwendende Festplatte in Ihren PC ein oder Sie schließen Sie über externe USB Adapter an Ihren Computer an.

Solche USB Adapter finden Sie unter der Bezeichnung “USB Festplatten Adapter” in den meisten Elektronikfachmärkten.
Beispiel: Google Produktsuche mit Preisvergleich

2. Schritt: Kennung der Festplatte herausfinden

Um die Festplatte für VirtualBox verfügbar zu machen, benötigen wir die eindeutige Kennung (ID) der Festplatte.

Unter Windows:

Unter Linux:

Die Anleitung folgt in Kürze.

3. Schritt: VirtualBox (.vmdk) Datei erstellen

Damit die Festplatte in VirtualBox als Festplatte genutzt werden kann, müssen Sie eine .vmdk Datei erstellen.

Unter Windows:

Unter Linux:

Die Anleitung folgt in Kürze.

4. Schritt: Die Festplatte in VirtualBox einrichten

5. Schritt: Den virtuellen PC mit der realen Festplatte einrichten

In VirtualBox können Sie nun den virtuellen PC einrichten.

Dabei können Sie dann die angeschlossene, physikalische Festplatte auswählen und als Datenträger normal nutzen.

So können Sie z.Bsp. Ihren Server oder Client an Ihrem PC einrichten, installieren oder konfigurieren und die Festplatte später in einem anderen Computer nutzen.

Dabei sind teilweise Einschränkungen bzgl. der Hardware erkennung zu beachten, denn der virtuelle PC (auf welchem Sie das System installierten) hat ggf. andere Hardware als der spätere Computer. Die meisten aktuellen Betriebssysteme erkennen diese Änderung aber und richten die neu gefundene Hardware automatisch ein.

Software

Mehr über VirtualBox erfahren Sie hier: http://www.virtualbox.org/

PHP: Unable to load dynamic library ‘/usr/lib/php5/extensions/mysql.so’

Freitag, 05.02.2010

Wenn im ErrorLog des Apache2 WebServers (“tail /var/log/apache2/error.log”) u.a. folgende Zeile zu finden ist, kann PHP die Extension (Erweiterung) nicht finden und laden:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/extensions/mysql.so' - /usr/lib/php5/extensions/mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Häufig wird dann angefangen, wild an der Konfiguration zu ändern und basteln. Dabei wird meist das naheliegendste übersehen:

Gibt es das angegebene Verzeichnis überhaupt ?
Erst recht, wenn mehrere (oder gar viele) Extensions nicht geladen werden können.

Wenn dann der Befehl

dir -l /usr/lib/php5/extensions/

die folgende Fehlermeldung anzeigt, sollte alles klar sein:

dir: Zugriff auf /usr/lib/php5/extensions/ nicht möglich: Datei oder Verzeichnis nicht gefunden

Lösung

Den Pfad für die Extensions in der “php.ini” anpassen. Diese kann, falls der Pfad nicht bekannt ist, mithilfe des folgenden Befehls gefunden werden.

find / -name php.ini

Dieser Befehl zeigt Ihnen ggf. auch andere “php.ini” Dateien auf ihrem System an. Manchmal konfiguriert man ein einer “php.ini” und wundert sich, dass keine Änderung eintritt. Wenn man zufällig die falsche Datei in den Händen hat, dann kann man auch lange auf ein Ergebnis warten ;)

Häufig fällt dieses Problem nach einer (Neu)Installation erst auf, wenn die mySQL / mySQLi Unterstützung fehlt. Grund ist dann (meist), dass die mysql.so Extension in PHP nicht geladen werden kann.

« Vorheriger Beitrag