dazle
@dazle
Хороший электрик, но в душе программист

Хочу перенести сайт с mysql на PDO или mysqli прочитал много статей хочу внести ясность по некоторым пунктам?

Переход осуществляю только потому что хочу обезопасить сайт от иньекций. На сайте много файлов с запросами типа:
$a=$_SESSION['name'];
$res=mysql_query("SELECT * FROM `messages2` WHERE `komy`='$a'");

$idfilm=$row['idfilm'];
$com=mysql_query("SELECT * FROM `komment` WHERE idfilm=$idfilm ORDER BY `id`");

$query="INSERT INTO `rus` (`idvol`,`reyting`,`name`,`vol`,`file`,`kto`,`rey`,`data`,`orderdate`) 
  VALUES('$ro','$reyting','$name','$vol','$file','$kto','$hj',CURDATE(),DATE_ADD(NOW(), INTERVAL 6 DAY)) ";

Запросы впринципе несложные, многие сайты склоняются за PDO ,но я бы хотел работать с mysqli:
-cтарый знакомый синтаксис
-проще переделать с mysql
-не собираюсь даже в будущем использовать др бд
Единственное что - это защита, но читал на сайте есть хункции-хелпера они понятные и простые, типа:
user = $db->getRow("SELECT * FROM users where name=?s",$_POST['name']);

Может ли такой вид обезопасить сайт от иньекций? или лучше выбрать все таки PDO?
  • Вопрос задан
  • 4972 просмотра
Решения вопроса 1
alekseyHunter
@alekseyHunter
Android developer
Может ли такой вид обезопасить сайт от иньекций?


За код первых запросов хакеры вам скажут спасибо, им софт уже найдет уязвимость.

Последний запрос такой же уязвимый, т.к. вы напрямую берете данные из массива.

Ошибки:
  • Вы не проверяете значение, которое содержится в POST/SESSION (тип данных, пустая строка)
  • Вы не проверяете регуляркой эти данные
  • Вы не используете параметрические запросы


Для наглядности простой пример:

function registration($link,$login,$password,$email) {
	$newlogin = preg_replace('%[^A-Za-zА-Яа-я0-9]%', '', $login);
	$newpassword = preg_replace('%[^A-Za-zА-Яа-я0-9]%', '', $password);

	if($newlogin !=$login || $newpassword != $password) 
                return false;

		$pass = md5($newpassword);

		check_input_data($link,$login,$email); //Кидает ошибку, если логин уже есть в базе

		$stmt = mysqli_prepare($link, "INSERT INTO users (login,password) VALUES (?, ?)");
		mysqli_stmt_bind_param($stmt, 'ss', $newlogin, $pass);

		mysqli_stmt_execute($stmt);

		if(mysqli_stmt_affected_rows($stmt)==1) {
			$user_id = get_user_id($link,$newlogin);
//Что-то делаем
    } else {
      return false;
    }
      mysqli_stmt_close($stmt);

      return true;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Adamos
@Adamos
Если сайт совсем не вариант переписать на чем-нибудь нормальном (в вашем спагетти проблема не только в запросах) - можно как паллиатив использовать phpfaq.ru/safemysql
Но не валяйте запросы по коду, соберите их в классы, работающие с конкретными таблицами и выполняющие абстрагированную от конкретного запроса работу. Так легче будет и сопровождать код, и развивать его дальше.
Ответ написан
@Vitsliputsli
PDO лучше только в плане универсальности (драйвера, а не вашей работы, это не ORM), mysqli как специализированный драйвер к примеру более производителен (несущественно). Защиту от sql инъекций вам дадут только подготовленные запросы, где вы их будете применять, в pdo или mysqli, без разницы.
Но все современные orm и просто обертки пишутся для PDO. Про mysqli забыли. Нативная работа с mysqli ужасна, т.к. очень устарела, эксепшены отсутствуют, да и порой просто не очень адекватна.
Ответ написан
Комментировать
@ozornick
Поверьте мне, переходите на PDO. Сам как-то пробовал адаптировать старый скрипт и все закончилось PDO. Кода напишите столько же, но выгоднее юзать pdo. Все равно вы придете к одному - работа с mysql. Считаю mysqli "обмен шило на мыло"
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы