В 2002 году казахстанский веб-разработчик имел два пути. Первый - Windows Server + IIS + SQL Server + ASP. Лицензии, дорогой хостинг, Windows-администратор. Для большинства проектов это было нереалистично.
Второй - LAMP: Linux, Apache, MySQL, PHP. Всё бесплатно. Shared-хостинг у Astel или KazNIC: Apache уже стоит, MySQL включён, PHP в комплекте. За $8-15 в месяц.
В то время российские хостинги с такой ценой были доступнее местных. Казахстанские провайдеры только начинали предлагать PHP/MySQL хостинг - Nursat, Astel, первые частные хостеры. Мы разворачивали сайты туда по FTP, иногда через dial-up 33.6 kbps, и это работало.
PHP 4 - язык, которым строился Казнет
<?php
// config.php - стандарт 2002 года
// PDO не было. MySQLi не было в PHP 4.
// Только mysql_* функции.
define('DB_HOST', 'localhost');
define('DB_USER', 'webapp');
define('DB_PASS', 'secret123');
define('DB_NAME', 'kazsite');
$conn = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if (!$conn) {
die('Ошибка подключения: ' . mysql_error());
}
mysql_select_db(DB_NAME, $conn);
mysql_query("SET NAMES 'utf8'", $conn);
// Важно: register_globals был ON по умолчанию.
// GET/POST параметры автоматически становились переменными.
// Это была катастрофа безопасности.
// В Казнете 2002 почти все сайты были уязвимы к SQL-инъекциям.
?>
<?php
// katalog.php - типичный каталог товаров
require_once 'config.php';
// Хоть какая-то защита от инъекций:
$cat_id = isset($_GET['cat']) ? (int)$_GET['cat'] : 0;
$page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
$limit = 20;
$offset = ($page - 1) * $limit;
$where = $cat_id > 0
? "WHERE category_id = $cat_id AND active = 1"
: "WHERE active = 1";
$count_res = mysql_fetch_assoc(
mysql_query("SELECT COUNT(*) AS n FROM products $where", $conn)
);
$total_pages = ceil($count_res['n'] / $limit);
$res = mysql_query(
"SELECT id, name, price, image FROM products $where
ORDER BY id DESC LIMIT $offset, $limit", $conn
);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Каталог</title>
</head>
<body>
<?php while ($row = mysql_fetch_assoc($res)): ?>
<div>
<a href="product.php?id=<?php echo $row['id']; ?>">
<?php echo htmlspecialchars($row['name']); ?>
</a>
- <?php echo number_format($row['price'], 0); ?> тенге
</div>
<?php endwhile; ?>
</body>
</html>
Apache .htaccess: обязательное знание
# .htaccess - каждый PHP-разработчик знал его наизусть
RewriteEngine On
RewriteBase /
# Красивые URL: /tovar/123 → product.php?id=123
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^tovar/([0-9]+)/?$ product.php?id=$1 [L,QSA]
# Отключаем register_globals - обязательно!
php_flag register_globals Off
php_flag display_errors Off
# Листинг директорий - закрыть!
Options -Indexes
# Защита конфига
<FilesMatch "^config\.php$">
Order allow,deny
Deny from all
</FilesMatch>
Типичная уязвимость: SQL-инъекция 2002 года
<?php
// ТАК ДЕЛАЛИ ПОЧТИ ВСЕ в 2002 - это уязвимо!
$id = $_GET['id']; // register_globals: просто $id
// URL: product.php?id=1 OR 1=1--
// Этот запрос вернёт ВСЕ товары:
$result = mysql_query("SELECT * FROM products WHERE id = $id");
// Правильно (минимальная защита 2002):
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
// Или для строк - mysql_real_escape_string:
$name = mysql_real_escape_string($_GET['name']);
$result = mysql_query(
"SELECT * FROM products WHERE name = '$name'"
);
// Параметризованные запросы появятся в PHP 5.1 (PDO, 2005).
// До тех пор - ручное экранирование, которое часто забывали.
?>
Почему LAMP победил в Казнете
Цена. Хостинг с PHP+MySQL стоил в 5-10 раз дешевле Windows-хостинга. Для казахстанского стартапа или малого бизнеса 2002 года это было решающим.
Порог входа. PHP был прост для изучения. HTML-разработчик мог начать вставлять PHP в страницы и получать результат немедленно. Никакой компиляции, никакого апп-сервера.
Сообщество. phpbb.com, php.net, SQL-ошибки гуглились на русском. Казахстанские разработчики учились у российских коллег по тем же форумам.
К 2005 году LAMP лежал в основе 90% новых коммерческих сайтов в Казнете. Все первые казахстанские интернет-магазины, новостные порталы, корпоративные сайты - LAMP. Это основа, на которой вырос современный казахстанский IT.