- BrainTools - https://www.braintools.ru -
В то время как все пытаются научить ИИ писать такой хороший код, чтобы он заменил всех программистов, я решил попросить его сделать прямо противоположную задачу – написать максимально плохой код. Мой промпт звучал так:
Напиши максимально ПЛОХОЙ код на языке PHP, реализующий функционал интернет-магазина.
В качестве ИИ я использовал DeepSeek. Разумеется, в режиме рассуждения – ведь чтобы написать максимально плохой код, мне понадобится вся интеллектуальная мощность искусственного интеллекта [1]. Почему плохой код должен быть именно на PHP, я думаю, объяснять не надо.
Итак, сначала рассуждения ИИ:
Мы должны написать максимально плохой код на PHP для интернет-магазина. Задача явно шуточная, нужно продемонстрировать плохие практики: отсутствие безопасности, уязвимости, нечитаемый код, использование устаревших функций, глобальные переменные, смешивание логики и представления, отсутствие структуры, потенциальные ошибки [2] и т.д.
Нужно создать что-то работающее (хотя бы по логике [3]), но с кучей проблем. Подумаем о типичном функционале интернет-магазина: каталог товаров, корзина, оформление заказа, возможно, админка. Но для “максимально плохого” можно сделать один файл, который делает всё.
Плохие практики:
Использование mysql_* функций (устаревшие, удалены в PHP7).
Отсутствие экранирования входных данных -> SQL-инъекции.
Открытое хранение паролей (plain text) или слабое хеширование.
Использование глобальных переменных ($_GET, $_POST) напрямую в SQL.
Отсутствие валидации.
Вывод ошибок на экран (display_errors).
Смешивание HTML и PHP без шаблонов.
Повторное использование кода (copy-paste).
Жестко закодированные пути, пароли.
Отсутствие обработки ошибок.
Длинные процедурные файлы.
Использование extract($_POST) для создания переменных.
Отсутствие защиты от XSS (вывод неэкранированных данных).
Отсутствие CSRF-защиты.
Сессии без регенерации, уязвимости фиксации сессии.
Прямое включение файлов без проверки.
Использование eval или других опасных функций.
Сложная логика с goto? Можно добавить.
Сделаем один файл index.php, который обрабатывает все действия через параметр action. Будем использовать MySQL (устаревшее расширение). Сохраним всё в таблицы: products, users, orders. Добавим админку для добавления товаров (без проверки прав, просто по секретному параметру).
Пароли в открытом виде. SQL-инъекции в каждом запросе. Также можно использовать динамические имена таблиц через пользовательский ввод.
Добавим файловую систему для картинок товаров: загрузка файлов без проверки типа и размера, прямое сохранение в публичную папку.
Сделаем корзину в сессии, но без очистки данных.
Напишем в функциональном стиле с длинными строками.
Также можно использовать тернарные операторы в нечитаемом виде.
Добавим “инновационные” решения, например, использование eval для вычисления цены со скидкой: eval(“return $price * $discount;”) с пользовательским вводом.
Можно использовать include для разных частей страницы, но без проверки, что может привести к LFI.
Также добавим функцию mail для отправки подтверждения заказа, но без проверки email, спам.
Итоговый код должен быть кошмаром для любого разработчика.
Приступим к написанию.
А теперь посмотрим код:
<?php
// =====================================================
// MEGA PLOHOY INTERNET MAGAZIN
// VERSIYA 1.0 (BETA)
// AVTOR: NEIZVESTNY GENIY
// =====================================================
// VKLUCHAEM VSE OSHIBKI NA EKRAN - TAK NADEZHNEE
error_reporting(E_ALL);
ini_set('display_errors', 1);
// PODKLUCHAEMSYA K BAZE DANNYKH (BEZ PROVEROK)
mysql_connect('localhost', 'root', '');
mysql_select_db('shop');
// SOZDAEM TABLITSY, ESLI IKH NET (S POMOSHYU ZAPROSA)
mysql_query("CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY,
name TEXT,
price TEXT,
image TEXT,
descr TEXT
)");
mysql_query("CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
login TEXT,
password TEXT,
email TEXT,
is_admin INT
)");
mysql_query("CREATE TABLE IF NOT EXISTS orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
products TEXT,
total TEXT,
date DATETIME
)");
// VSTAVIM ADMINA, ESLI EGO NET (PAROL' - ADMIN)
$res = mysql_query("SELECT * FROM users WHERE login = 'admin'");
if (mysql_num_rows($res) == 0) {
mysql_query("INSERT INTO users (login, password, email, is_admin) VALUES ('admin', 'admin', 'admin@localhost', 1)");
}
// GLAVNAYA LOGIKA: POLUCHAEM DEYSTVIE IZ GET ILI POST
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'catalog';
// SEANSU NADO VKLYUCHIT' DLYA KORZINY
session_start();
// EKSTRENNO SOZDAEM PEREMENNYE IZ POST - UDOBNO!
if ($_POST) extract($_POST);
// OBRABOTCHIK DEYSTVII
switch ($action) {
case 'catalog':
showCatalog();
break;
case 'product':
showProduct();
break;
case 'cart':
showCart();
break;
case 'add_to_cart':
addToCart();
break;
case 'remove_from_cart':
removeFromCart();
break;
case 'checkout':
checkout();
break;
case 'admin':
adminPanel();
break;
case 'add_product':
addProduct();
break;
case 'delete_product':
deleteProduct();
break;
case 'login':
login();
break;
case 'logout':
logout();
break;
case 'register':
register();
break;
default:
showCatalog();
}
// FUNKTSII
function showCatalog() {
// POLUCHAEM VSE TOVARY IZ BAZY
$res = mysql_query("SELECT * FROM products");
echo "<h1>KATALOG TOVAROV</h1>";
echo "<a href='?action=cart'>Korzina</a> | <a href='?action=admin'>Admin panel</a> | <a href='?action=login'>Login</a><br><br>";
while ($row = mysql_fetch_assoc($res)) {
// VYVODIM TOVAR S SSYLKOY NA PODROBNEE
echo "<div style='border:1px solid #ccc; margin:5px; padding:5px;'>";
echo "<h3>" . $row['name'] . "</h3>";
echo "<p>Cena: " . $row['price'] . " rub.</p>";
if ($row['image']) echo "<img src='uploads/" . $row['image'] . "' width='100'><br>";
echo "<a href='?action=product&id=" . $row['id'] . "'>Podrobnee</a> | ";
echo "<a href='?action=add_to_cart&id=" . $row['id'] . "'>V korzinu</a>";
echo "</div>";
}
}
function showProduct() {
$id = $_GET['id'];
// OPASNYY ZAPROS BEZ EKRANIROVANIYA
$res = mysql_query("SELECT * FROM products WHERE id = $id");
$row = mysql_fetch_assoc($res);
if (!$row) {
echo "Tovar ne nayden!";
return;
}
echo "<h1>" . $row['name'] . "</h1>";
echo "<p>Cena: " . $row['price'] . "</p>";
echo "<p>" . $row['descr'] . "</p>";
if ($row['image']) echo "<img src='uploads/" . $row['image'] . "'><br>";
echo "<a href='?action=add_to_cart&id=" . $row['id'] . "'>Dobavit' v korzinu</a><br>";
echo "<a href='?action=catalog'>Nazad v katalog</a>";
}
function addToCart() {
$id = $_GET['id'];
if (!isset($_SESSION['cart'])) $_SESSION['cart'] = array();
// PROVERIM, CHTO TAKOY Tovar EST'
$res = mysql_query("SELECT * FROM products WHERE id = $id");
if (mysql_num_rows($res) > 0) {
$_SESSION['cart'][$id] = isset($_SESSION['cart'][$id]) ? $_SESSION['cart'][$id] + 1 : 1;
}
header("Location: ?action=cart");
exit;
}
function removeFromCart() {
$id = $_GET['id'];
unset($_SESSION['cart'][$id]);
header("Location: ?action=cart");
exit;
}
function showCart() {
echo "<h1>KORZINA</h1>";
if (empty($_SESSION['cart'])) {
echo "Korzina pusta.";
echo "<br><a href='?action=catalog'>V katalog</a>";
return;
}
$total = 0;
foreach ($_SESSION['cart'] as $id => $qty) {
$res = mysql_query("SELECT * FROM products WHERE id = $id");
$row = mysql_fetch_assoc($res);
if (!$row) continue;
$subtotal = $row['price'] * $qty;
$total += $subtotal;
echo "<div>";
echo $row['name'] . " x $qty = $subtotal rub. ";
echo "<a href='?action=remove_from_cart&id=$id'>Udalit'</a>";
echo "</div>";
}
echo "<hr><b>ITOGO: $total rub.</b><br>";
echo "<a href='?action=catalog'>Prodolzhit' pokupki</a> | ";
if (isset($_SESSION['user_id'])) {
echo "<a href='?action=checkout'>Oformit' zakaz</a>";
} else {
echo "<a href='?action=login'>Voyti dlya oformleniya</a>";
}
}
function checkout() {
if (!isset($_SESSION['user_id'])) {
header("Location: ?action=login");
exit;
}
if (empty($_SESSION['cart'])) {
echo "Korzina pusta.";
return;
}
// SOBIRAEM DANNye O ZAKAZE
$user_id = $_SESSION['user_id'];
$products = serialize($_SESSION['cart']);
$total = 0;
foreach ($_SESSION['cart'] as $id => $qty) {
$res = mysql_query("SELECT * FROM products WHERE id = $id");
$row = mysql_fetch_assoc($res);
$total += $row['price'] * $qty;
}
$date = date('Y-m-d H:i:s');
mysql_query("INSERT INTO orders (user_id, products, total, date) VALUES ($user_id, '$products', $total, '$date')");
// OCHIShAEM KORZINU
$_SESSION['cart'] = array();
echo "Zakaz oformlen! Spasibo za pokupku!";
echo "<br><a href='?action=catalog'>Na glavnuyu</a>";
// OTPRAVLYaEM PIS'MO (ESLI EST' ADRES)
$res = mysql_query("SELECT email FROM users WHERE id = $user_id");
$u = mysql_fetch_assoc($res);
if ($u['email']) {
mail($u['email'], "Zakaz oformlen", "Vash zakaz prinyat. Obshchaya summa: $total rub.");
}
}
function adminPanel() {
// PROVERIM PRAVA (ADMIN? ESLI NET, TO PUST' VOYDET)
if (!isset($_SESSION['is_admin']) || $_SESSION['is_admin'] != 1) {
// POPROBUEM VOYTI KAK ADMIN (DLYA UDOBSTVA)
echo "<h2>Vkhod dlya administratora</h2>";
echo "<form method='post' action='?action=login'>";
echo "Login: <input name='login'><br>";
echo "Password: <input type='password' name='pass'><br>";
echo "<input type='submit' value='Voyti'>";
echo "</form>";
return;
}
// ADMIN PANEL'
echo "<h1>ADMIN PANEL'</h1>";
echo "<a href='?action=catalog'>Katalog</a> | <a href='?action=logout'>Logout</a><br><br>";
// SPISOK TOVAROV S SSYLKAMI NA UDALENIE
$res = mysql_query("SELECT * FROM products");
echo "<table border=1>";
echo "<tr><th>ID</th><th>Nazvanie</th><th>Cena</th><th>Deystvie</th></tr>";
while ($row = mysql_fetch_assoc($res)) {
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['name'] . "</td>";
echo "<td>" . $row['price'] . "</td>";
echo "<td><a href='?action=delete_product&id=" . $row['id'] . "' onclick='return confirm("Udalit?")'>Udalit'</a></td>";
echo "</tr>";
}
echo "</table>";
// FORMA DOBAVLENIYa TOVARA
echo "<h2>Dobavit' tovar</h2>";
echo "<form method='post' action='?action=add_product' enctype='multipart/form-data'>";
echo "Nazvanie: <input name='name'><br>";
echo "Cena: <input name='price'><br>";
echo "Opisanie: <textarea name='descr'></textarea><br>";
echo "Kartinka: <input type='file' name='image'><br>";
echo "<input type='submit' value='Dobavit'>";
echo "</form>";
}
function addProduct() {
// PROVERKA ADMINA (OPYAT')
if (!isset($_SESSION['is_admin']) || $_SESSION['is_admin'] != 1) {
die("Net prav");
}
$name = $_POST['name'];
$price = $_POST['price'];
$descr = $_POST['descr'];
// ZAGRUZKA KARTINKI (BEZ PROVEROK)
$image = '';
if ($_FILES['image']['tmp_name']) {
$image = time() . '_' . $_FILES['image']['name'];
move_uploaded_file($_FILES['image']['tmp_name'], 'uploads/' . $image);
}
// VSTAVLYaEM V BAZU (BEZ EKRANIROVANIYA)
mysql_query("INSERT INTO products (name, price, image, descr) VALUES ('$name', '$price', '$image', '$descr')");
header("Location: ?action=admin");
exit;
}
function deleteProduct() {
if (!isset($_SESSION['is_admin']) || $_SESSION['is_admin'] != 1) {
die("Net prav");
}
$id = $_GET['id'];
// SNAChALA UDALIM KARTINKU IZ FAYLOVOY SISTEMY (NE OBYAZATEL'NO)
$res = mysql_query("SELECT image FROM products WHERE id = $id");
$row = mysql_fetch_assoc($res);
if ($row['image']) {
@unlink('uploads/' . $row['image']);
}
mysql_query("DELETE FROM products WHERE id = $id");
header("Location: ?action=admin");
exit;
}
function login() {
if ($_POST) {
$login = $_POST['login'];
$pass = $_POST['pass'];
// OPASNYY ZAPROS (IN'EKCIYa)
$res = mysql_query("SELECT * FROM users WHERE login = '$login' AND password = '$pass'");
if ($row = mysql_fetch_assoc($res)) {
$_SESSION['user_id'] = $row['id'];
$_SESSION['is_admin'] = $row['is_admin'];
header("Location: ?action=catalog");
exit;
} else {
echo "Nevernyy login/parol";
}
}
echo "<h2>Vkhod</h2>";
echo "<form method='post'>";
echo "Login: <input name='login'><br>";
echo "Password: <input type='password' name='pass'><br>";
echo "<input type='submit' value='Voyti'>";
echo "</form>";
echo "<a href='?action=register'>Register</a>";
}
function register() {
if ($_POST) {
$login = $_POST['login'];
$pass = $_POST['pass'];
$email = $_POST['email'];
// VSTAVKA BEZ EKRANIROVANIYA
mysql_query("INSERT INTO users (login, password, email, is_admin) VALUES ('$login', '$pass', '$email', 0)");
echo "Registraciya uspeshna! Teper' vojdite.";
header("Refresh: 2; url=?action=login");
} else {
echo "<h2>Registraciya</h2>";
echo "<form method='post'>";
echo "Login: <input name='login'><br>";
echo "Password: <input type='password' name='pass'><br>";
echo "Email: <input name='email'><br>";
echo "<input type='submit' value='Zaregistrirovat'sya'>";
echo "</form>";
}
}
function logout() {
session_destroy();
header("Location: ?action=catalog");
exit;
}
// SOZDAEM PAPKU DLYA ZAGRUZOK, ESLI EE NET
if (!is_dir('uploads')) mkdir('uploads');
?>
Что я могу сказать.
Достоинства:
VERSIYA 1.0 (BETA) – это хорошо.
AVTOR: NEIZVESTNY GENIY – еще лучше. Кажется, я научил ИИ чувству юмора [5].
Создавать все таблицы при первом запуске – неплохо
ООП не используется вообще – правильно.
Создать папку для загрузок только после того как весь код отработает – логично.
Все комментарии на транслите – не знаю, насколько намеренно, но выглядит как недостаток, так что плюс.
Как кстати и все сообщения пользователю.
Вывод все ошибок пользователю – классика, сойдет.
Вставка в БД без экранирования – да, норм.
Весь код в одном файле – ну это очевидно.
Недостатки:
Идеальное форматирование кода – очень плохо, новички так не поступают.
Мне обещали использование eval – а его нигде нет.
В CREATE TABLE есть IF NOT EXISTS – скрипт не упадет на втором запуске.
Название полей в БД на идеальном английском – не ок
AUTO_INCREMENT зачем? Генерировать id вручную при каждом добавлении не судьба?
Кавычки слишком правильно используются.
Можно было бы и не разбивать код по функциям – if-else достаточно.
Хотя бы можно было отказаться от использования switch.
Я бы еще добавил вырвиглазные цвета, например зеленый на красном фоне
Не вижу каких-то очевидных логических ошибок, просто не хватает проверок входящих данных.
Итог – ИИ написал довольно плохой код. Но мог бы сделать и хуже.
И нет, я его не запускал. Мне своего сервера жалко.
Предлагаю в комментариях попросить решить аналогичную задачу у других ИИ. И попросить их написать плохой код на других языках программирования.
Автор: freehabr
Источник [6]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/26014
URLs in this post:
[1] интеллекта: http://www.braintools.ru/article/7605
[2] ошибки: http://www.braintools.ru/article/4192
[3] логике: http://www.braintools.ru/article/7640
[4] Image: https://sourcecraft.dev/
[5] юмора: http://www.braintools.ru/article/3517
[6] Источник: https://habr.com/ru/articles/1002202/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1002202
Нажмите здесь для печати.