@V9821

Безопасность кода php -> mysql?

Всем привет. Встал вопрос как обезопасить свою CMS от инъекций. Приведу код ниже, и задам вам вопрос. Какая вероятность того, что мой код безопасен и как можно его еще обезопасить?

<?php
require_once ($_SERVER['DOCUMENT_ROOT']. '/session.php');
if(!empty($_SESSION['login']) and !empty($_SESSION['password']))  {
	$result = $mysqli->query("SELECT * FROM users_all WHERE name LIKE '".$_SESSION['login']."'");
	if ($result->num_rows > 0) {
		$password_mysql = $mysqli->query("select password from users_all where name='".$_SESSION['login']."'")->fetch_object()->password;
		$realname = $mysqli->query("select name from users_all where name='".$_SESSION['login']."'")->fetch_object()->name;
		if (!password_verify(urldecode($_SESSION['password']), $password_mysql)) {
			include('login.php');
		} else {
			include('profile.php');
		}
	} else {
		include('login.php');
	}
} else {
	include('login.php');
}
?>
  • Вопрос задан
  • 407 просмотров
Пригласить эксперта
Ответы на вопрос 3
@d-sem
"select password from users_all where name='".$_SESSION['login']."'"


https://owasp.org/www-community/attacks/SQL_Injection

$_SESSION['password']
https://stackoverflow.com/questions/19594202/is-it...
Ответ написан
Комментировать
Fockker
@Fockker Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Вопрос хороший, характерностью имеющихся в коде ошибок.

На первом месте тут конечно , конечно, незабвенный Бобби Тейблс и его прошаренная мамаша.
Таблицу здесь удалить не получится, но вот скачать всю базу - запросто.

Плюс мамаша конечно тупит. Данные надо не "экранировать", поскольку почти никто не понимает, что это значит, а отправлять в БД отдельно от запроса.

Но меня здесь больше интресует не безопасность, а осмысленность данного кода.
Если элемент "login" попадает в сессию в результате авторизации, то зачем снова делать все эти 100500 запросов в БД?
Я бы этот код сократил до
<?php
require_once $_SERVER["DOCUMENT_ROOT"] . "/engine/core/session.php";
if (empty($_SESSION["user_id"])) {
    include "login.php";
    die;
}

и поместил в profile.php

При этом убедившись, что код собственно авторизации выглядит как-то так

$stmt = $conn->prepare("SELECT * FROM users_all WHERE name=?");
$stmt->bind_param("s", $_POST['name']);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc();

if ($user && password_verify($_POST['password'], $user['password']))
{
    $_SESSION['user_id'] = $user['id'];
    header("Location: /profile.php");
    die;
}
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Какая вероятность того, что мой код безопасен
Околонулевая
как можно его еще обезопасить
Как минимум, использовать подготовленные выражения.

Ну и уйти от большой вложенности if'ов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы