Własny prosty CMS w PHP

1

Napisałem prosty skrypt CMS - systemu zarządzania treścią. Niestety okazał się on bardzo dziurawy, więc obecnie jest już wersja 3. Oto link do pobrania:

http://wrzucacz.pl/file/7831341490468

Co o nim sądzicie? Czy jest bezpieczny? Czy wszystko działa poprawnie? Po instalacji dane do PA /admin
Login: admin
Hasło: haslo

0

po pierwsze kilka Twoich punktów dla czego warto używać Twojego CMS'a jest trochę naciągana:) ale do konkretów
dlaczego trzymasz hasło w bazie w postaci jawnego tekstu? Zahaszuj go choćby głupią MD5. Najlepiej dla każdego użytkownika dodaj tak zwany salt (sól) i tą solą posól hasła. Wtedy trudniej będzie zgadnąć je jest hasło znają jego hash.

Jeśli chodzi o kategorię to co jeśli... bym chciał mieć ich 6? :P albo 16? zastanów się jakby to rozwiązać bardziej uniwersalnie. I nie będziesz musiał trzymać info o nich w plikach.

Gdy wszedłem do aktualizacji systemu i kazałem sprawdzić, czy jest aktualna to... nic się nie zmieniło :)

to tak na szybko :)

3
<?php // Jeśli istnieje pasek boczny dodaj tabelkę
if($pasekboczny_spr == 613) { // Jeśli $pasekboczny_spr jest równy 627 to znaczy że istnieje
	include('include/pasekbocznyspr.php'); // Tabela HTML/PHP z paskiem bocznym
}
else
{
}
?>

Po co pusty blok else? Komentarze albo opisują oczywiste rzeczy, jak echo $naglowek; // wyswietlanie naglowka, albo wręcz bezsensowne i niezrozumiałe jak wyżej.

<html>
<head>

<?php
include('include/baza.php');
?>

Naprawdę nie zalecam osadzania skryptów "na chama" w HTMLu, to strasznie utrudnia dostosowanie szablonu. Poczytaj o systemach szablonów, np. Smarty. Taki system pozwala oddzielić rzeczy związane z wyglądem i prezentacją od reszty kodu.

if(isset($_GET['id']) && !is_array($_GET['id']) && preg_match('/^[0-9a-zA-Z_]{1,25}$/',$_GET['id'])) {
	if(in_array($_GET['id'],$kategorie)) {
		include('kategorie/'.$_GET['id'].'.txt');
	}

Na szczęście całkiem sensowna weryfikacja danych od użytkownika, jesteś jednym z nielicznych newbie, którzy nie otworzyli miliarda naprawdę trywialnych luk bezpieczeństwa :P

<!-- index.php -->
<meta http-equiv="Content-Type" content="text/html; charset=uft8" />

<!-- admin/pasek.php -->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />

Używasz różnych kodowań, to się nie powinno skończyć zbyt dobrze. Zdecyduj się na jedno kodowanie i konsekwentnie wykorzystuj je w każdym miejscu w projekcie.

$login = addslashes($_POST['login']);
$haslo = addslashes($_POST['haslo']);
$ip = addslashes($_SERVER['REMOTE_ADDR']);

mysql_query('INSERT INTO logi SET login=\''.$login.'\', haslo=\''.$haslo.'\', ip=\''.$ip.'\'');

Źle. Użyj biblioteki PDO lub jakiegoś ORMa.
Nie powinno się podstawiać do zapytania danych przepuszczonych przez addslashes (wyjaśnienie).

Generalnie jakieś zadatki widać. Widać, że umiecie wykombinować coś pomimo tego, iż posiadacie dość ograniczoną wiedzę. Rozumienie tego co się robi w jak największym stopniu to jedna z najbardziej pożądanych cech programisty. Papy z dachu nie zrywa, ale jest i prawdopodobnie działa. Jak na początek to i taką aplikację można nazwać osiągnięciem ;] Ćwiczcie dalej.

0

W kwestii zabezpieczeń to raczej się orientuję. Więc tak:

  • skasowałem te else - nie ma po co kodu zapychać
  • przestawiłem to include
  • co do kodowania, strona główna korzysta z bazy, a baza korzysta z utf-8. PA akurat iso. Niech już tak zostanie
  • Dodałem kodowanie hasła w md5

Co do kategorii to pracuję nad tym. Jeszcze jakieś uwagi? Z góry dziękuję

Edit: Dodałem jeszcze zabezpieczenie przy zmianie hasła - należy podać stare. To dla zabezpieczenia przeciw CSRF. Jeszcze zablokuję w bezpośrednich poleceniach do bazy wszystkie operacje z tablicą logowanie

0
  • Dodałem kodowanie hasła w md5

To nie kodowanie, tylko hashowanie. Nie opłaca się używać MD5, ponieważ nie był on nawet projektowany z zamysłem przechowywania haseł. Zainteresuj się blowfishem, do zabezpieczania haseł potrzebny jest algorytm, który nie był optymalizowany pod względem szybkości, wręcz taki, który ma celowo większą złożoność.

0

W takim razie zrobię tak, dam md5(sha1($haslo)) - na taki prosty CMS to aż za duże zabezpieczenie.

Co jeszcze proponujecie, gdzie widzicie błędy, co poprawić, co dodać, itp.

0

Źle. Podwójne hashowanie spowoduje tylko tyle, że wygenerujesz znacznie więcej kolizji, a poziomu zabezpieczeń nie podniesiesz. Nie olewaj, poczytaj o blowfishu.

0

Chcę zastosować proste kodowanie, zrobię to tak, aby uniemożliwić atak słownikowy i utrudnić atak brute force:

sha1($haslo.'matercms'.$haslo)

0

Ja zrobiłbym:
sha1($data_rejestracji_usera.$hasło.$coś_innego) (nie wiem, jakie dane trzymasz w bazie).


No i to nie jest kodowanie, tylko hashowanie+to, co powiedział @{Demonical Monk} - lepiej zastosuj blowfish.
0

A jeżeli dwóch użytkowników będzie miało takie samo hasło? Przy twoim podejściu wygenerujesz taki sam skrót SHA-1 i atakujący będzie wiedział które hasła są stosowane najczęściej i to od nich zacznie łamanie.

Data rejestracji jest dość dobrą solą o ile jest podana w dość dokładnej precyzji, co najmniej z dokładnością do sekund.

0

W bazie jest tylko jeden user - admin. Zostawię tak jak jest (haslo.matercms.haslo).

0

Zrobiłem trochę zmian i prosiłbym jeszcze o jedno przeglądnięcie tego kodu:
http://wrzucacz.pl/file/5151343072153

Zmieniłem większość tego, co radziliście. Co sądzicie o tym teraz? Z góry mówię że jest tam tyle mysql_* że nie mam siły przerabiać to na PDO

0

Trudno to nazwać frameworkiem, raczej dobry materiał do nauki.

Koledzy wykazali się dużą dozą rezerwy do tego kodu, ja może napiszę bardziej wprost:

  • oddzielaj kod HTML od PHP (szablony: Smarty, XTemplate, itd)
  • rozdziel treść statyczną i dynamiczną katalogami, tak żeby móc zabronić dostępu do niektórych katalogów
  • gdzie przechowujesz aktualnie konfigurację? Chodzi o połączenie z bazą, katalogi, elementy strony etc
  • tag wychodzi z użycia: http://www.w3schools.com/tags/tag_center.asp
  • brakuje własnych funkcji CMS-a, nie mówiąc o klasach - jakie są w takim razie zalety z jego stosowania?
  • zamiast zwykłego "include" używaj "include_once" lub "require_once"
  • nie mieszaj dużych i małych tagów -
<BR><td width="150"
  • używaj stałych a nie literałów w kodzie jak poniżej:
$pasekboczny['wartosc'] == 'tak' ? $pasekboczny_spr = 613 : $pasekboczny_spr = 770;
  • nie zauważyłem jakiegoś specjalnego podejścia do CSS-a. instalator ma, admin i strona - nie.

Też niedawno skrobałem własny mini-site oparty na czystym PHP (profesjonaliści webdev AFAIK tego nie robią), kilka funkcjonalności które się tam znalazły - może warto żebyś nad czymś podobnym pomyślał w swoim CMS-ie:

  • obsługa konfiguracji (w pliku typu config.php)
  • obsługa wielojęzyczności
  • obsługa modułów
  • obsługa stron top-level (np. O nas, Regulamin, Links etc)
  • obsługa szablonów
  • obsługa zadań w tle (cron + poor-man cron)
  • obsługa logowania błędów i informacji serwisowych
  • warstwa dostępu do bazy danych (modele + coś-jak-PDO)
  • obsługa pluginów (moduły które automatycznie się uruchamiają i rejestrują tam gdzie trzeba - wystarczy wgrać w odp. miejsce)
  • obsługa cache'owania danych i stron
  • monitorowanie zbyt wolnych zapytań
  • obsługa kontrolerów
  • obsługa zdarzeń (potrzebne do obsługi pluginów)

Nie wiem czy to można nazwać CMS-em, raczej własny mini-framework.
CMS służy do zarządzania treścią - po to żeby użytkownik końcowy strony nie musiał oglądać tagów HTML czy funkcji PHP.

Jest kilka mini-frameworków i kilka większych, warto je poznać zanim się zacznie robić coś swojego.
Ja robiłem swój serwis na podstawie konstrukcji dużych skryptów które już znam.

Przykłady frameworków:

Duże
Zend Framework
Symfony
CakePHP
kohana
CodeIgniter

Małe:
poszukaj "php micro framework"

Przykłady CMS-ów:

  • Wordpress
  • Drupal

Więcej:
http://www.webdesignbooth.com/20-promising-open-source-php-content-management-systemscms/

1 użytkowników online, w tym zalogowanych: 0, gości: 1