2015-12-11 3 views
2

Здравствуйте, я просто хочу спросить о SQL-инъекции в настоящее время. Я работаю над страницей входа, но у меня возникает небольшая проблема с SQL-инъекцией. В настоящее время я тестирую пакетный SQL-код, как показано ниже. введите параметр SQL, но он, похоже, не работает над SQL-инъекцией. Моя проверка основана на подсчете строк, если она равна 0, она уничтожит сеанс и снова перенаправится в индекс. Кажется, что код работает нормально, но я боюсь, почему он работает правильно, не помещая SQL-параметр для предотвращения SQL-инъекции. Я надеюсь, что кто-то может объяснить, спасибо заранееPHP SQL injection не работает

secured_page.php

<?php 
// Start the session 
session_start(); 

// Set session variables 
$_SESSION["email"] = $_POST['email']; 
$_SESSION["password"] = md5($_POST['password']); 

if (isset($_SESSION['email'])){ 
    header('Location: profile.php');  
} 
else { 
    header('Location: index.php'); 
} 

?> 

profile.php

<?php 
// Start the session 
session_start(); 
include('header.php'); 

include('db_connect.php'); 
$email = $_SESSION["email"]; 
$password = $_SESSION["password"]; 

$sql = "SELECT * FROM user where email = '$email' and password = '$password' LIMIT 1"; 

$result = $conn->query($sql); 
echo $result->num_rows; 

if ($result->num_rows > 0) { 

    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["email"]. "<br>"; 
    } 
} else { 
    header('Location: unset_session.php'); 
} 

if (!isset($_SESSION['email'])){ 
    header('Location: index.php'); 
} 

?> 
<br> 
<a href="unset_session.php">Logout</a> 

<?php 
$conn->close(); 
include('footer.php'); 
?> 
+0

Вы используете mysqli или pdo? –

+0

Я использую mysqli – jester

+0

Итак, ваш вопрос: «Почему я не могу использовать sql-inject в этом, казалось бы, sql-уязвимом коде?», Правильно? Тогда вы должны показать нам, что вы пытались ввести. Ответ, вероятно, можно понять, сбросив ваш '$ sql' и, конечно же, зная, что находится в базе данных. – ippi

ответ

1

Делай так, чтобы предотвратить SQL Injection

$sql = "SELECT * FROM user where email = ? and password = ? LIMIT 1"; 
$result = $mysqli->prepare($sql); 

$result->bind_param("ss", $email, $password); 

/* execute query */ 
$result->execute(); 
//Now you can use $result variable like you used before 
echo $result->num_rows; 

Подробнее о подготовке заявлений здесь: http://php.net/manual/en/mysqli.prepare.php

+0

Моя проблема в том, что когда я использую SQL-инъекцию, я получаю строку 0. И алгоритм, кажется, работает отлично, чтобы предотвратить внедрение sql. Но в любом случае спасибо за ответ и предоставление некоторого кода param :) – jester