Mike CJ Ответов: 2

Как избежать атаки 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
и т.д.

2 Ответов

Рейтинг:
2

Patrice T

Вы должны выучить "Гугл"

SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Mike CJ

Я был более конкретен в отношении PDO

barneyman

Не объединяйте строки, используйте аргументы ... быстрый гугл нашел это http://php.net/manual/en/pdo.prepare.php

Mike CJ

Но генерала нет. Как обойти блокаду и защититься от таких атак.

barneyman

я процитировал точный общий случай

Не объединяйте строки, используйте аргументы