Как избежать атаки SQL-инъекции ?
Здравствуйте. Хотел бы узнать защиту от sql-инъекций. Как вы знаете, лучшая защита, которую вы можете получить с помощью ядерной бомбы, - это то, как работает sql-инъекция. У меня есть код, написанный на PHP. Я использовал PDO для большей безопасности. Я прочитал много статей, связанных с атаками с использованием sql-инъекций, но мало статей о PDO, поэтому можно понять, что PDO более безопасен. У меня есть код, который временами предотвращал мои атаки. Короче говоря, в будущем я хотел бы стать экспертом по безопасности. Тем не мение. Может вы знаете, какие методы атаки есть на PDO? Ниже я дам вам код, который, как я сказал ранее, относительно устойчив к атакам. Заранее спасибо за помощь.
index.php
<!DOCTYPE html> <html> <body> <form action="login.php" method="post"> <input type="text" name="name" placeholder="Your name"> <input type="text" name="email" placeholder="Your email"> <input type="submit" name="sent" id="ref" value="Send"> </form>< </div> </body> </html>
login.php
<?php session_start(); $dbname = 'test'; $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; try { if((!isset($_POST['name'])) || (!isset($_POST['email']))) { header("Location: index.php"); exit(); } $PDO = new PDO('mysql:host='.$dbhost.';dbname='.$dbname,$dbuser,$dbpass); $userow = $PDO->prepare('SELECT * FROM `users` WHERE `user`="'.$_POST['name'].'" '); $userow->execute(); $count = $userow->rowCount(); if($count>0) { $row = $userow->fetch(PDO::FETCH_ASSOC); if($_POST['email'] === $row['pass']) { $_SESSION['logged'] = true; $_SESSION['nick'] = $row['user']; $_SESSION['pass'] = $row['pass']; header("Location: logged.php"); } else { echo "Wrong login or password!"; } } else { echo "Wrong login or password!"; } } catch(PDOException $error) { die('Error!:'.$error->getMessage()); } ?>
logged.php
<?php session_start(); if (!isset($_SESSION['logged'])) { header("Location: index.php"); exit(); } ?> <!DOCTYPE html> <html> <body> <a href="logout.php">Logout!</a> <?php $dbname = 'test'; $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; try { $PDO = new PDO('mysql:host='.$dbhost.';dbname='.$dbname,$dbuser,$dbpass); $userow = $PDO->prepare('SELECT * FROM `users` WHERE user`="'.$_SESSION['nick'].'" '); $userow->execute(); $row = $userow->fetch(PDO::FETCH_ASSOC); echo $row['user']; } catch(PDOException $error) { die('Error!'.$error->getMessage()); } ?> </body> </html>
Что я уже пробовал:
Базовые SQL-инъекции
- Добавить Апостроф в текстовое поле Логин
- Добавьте Апостроф к паролю текстового поля или 1=2
и т.д.