2013-04-21 3 views
0

У меня есть код, как показано ниже для УДАЛИТЬ записи по URL ПараметрКак предотвратить SQL-инъекции для URL изменения параметра (ВЕЬЕТЕ) PHP

<td><a href="deletecar.php?car_id=<?php echo $row_cars['car_id']; ?>" onclick=" if (!confirm('Are you sure to DELETE?')) return false; ">Delete</a></td> 

И это выходной URL Параметр

http://localhost/html/deletecar.php?car_id=17 

Но если я меняю car_id = 17 на car_id = 23 (который находится в списке других пользователей), он удаляет

Как я могу предотвратить это

deletecar.php как ниже

<?php 
if (!function_exists("GetSQLValueString")) { 
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{ 
    if (PHP_VERSION < 6) { 
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; 
    } 

    $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); 

    switch ($theType) { 
    case "text": 
     $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; 
     break;  
    case "long": 
    case "int": 
     $theValue = ($theValue != "") ? intval($theValue) : "NULL"; 
     break; 
    case "double": 
     $theValue = ($theValue != "") ? doubleval($theValue) : "NULL"; 
     break; 
    case "date": 
     $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; 
     break; 
    case "defined": 
     $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; 
     break; 
    } 
    return $theValue; 
} 
} 

if ((isset($_GET['car_id'])) && ($_GET['car_id'] != "") && (isset($_SESSION['MM_Username']))) { 
    $deleteSQL = sprintf("DELETE FROM cars WHERE car_id=%s", 
         GetSQLValueString($_GET['car_id'], "int")); 

    mysql_select_db($database_conn, $conn); 
    $Result1 = mysql_query($deleteSQL, $conn) or die(mysql_error()); 

    $deleteGoTo = "myaccount.php"; 
    if (isset($_SERVER['QUERY_STRING'])) { 
    $deleteGoTo .= (strpos($deleteGoTo, '?')) ? "&" : "?"; 
    $deleteGoTo .= $_SERVER['QUERY_STRING']; 
    } 
    header(sprintf("Location: %s", $deleteGoTo)); 
} 
?> 

И это моя таблица в базе данных

INSERT INTO `car` (`car_id`, `c_id`, `c_brand`, `c_model`, `c_model_nd`, `c_model_year`, `c_color`, `c_capacity`, `c_owner`, `c_statu`, `c_show`) VALUES 
(16, '34DA1593', 'Volkswagen', 'Volt', '313 CDI', 2006, 'Beyaz', '', 18, 'yakamozturizm', 'Boş', 0), 
(17, '34BC5897', 'Mercedes', 'Sprinter', '313CDI', 2006, 'Gri', '', 14, 'PcRestorer', 'Boş', 0), 
(18, '34DBC145', 'Volkswagen', 'Volt', '213 CDI', 2013, 'Beyaz', '', 16, 'PcRestorer', 'Boş', 0); 

Редактировать ....

я изменил мой код, как этот

$colname_delete = "-1"; 
if (isset($_GET['car_id'])) { 
    $colname_delete = $_GET['car_id']; 
} 
$owner_delete = "-1"; 
if (isset($_SESSION['MM_Username'])) { 
    $owner_delete = $_SESSION['MM_Username']; 
} 

if ((isset($_GET['car_id'])) && ($_GET['car_id'] != "")) { 
    $deleteSQL = sprintf("DELETE FROM minibusler WHERE car_id = %s AND c_owner =%s", 

GetSQLValueString($colname_delete, "int"), 
GetSQLValueString($owner_delete, "text")); 

    mysql_select_db($database_conn, $conn); 
    $Result1 = mysql_query($deleteSQL, $conn) or die(mysql_error()); 

    $deleteGoTo = "myaccount.php"; 
    if (isset($_SERVER['QUERY_STRING'])) { 
    $deleteGoTo .= (strpos($deleteGoTo, '?')) ? "&" : "?"; 
    $deleteGoTo .= $_SERVER['QUERY_STRING']; 
    } 
    header(sprintf("Location: %s", $deleteGoTo)); 
} 

Похоже, вы думаете, что это безопасный способ сделать это

Спасибо за вашу помощь

+0

Это не инъекция SQL любыми средствами. Остальная часть вопроса в порядке, и нет ничего, что можно было бы сделать. –

+0

Первое условие выглядит совершенно бесполезным –

ответ

0

, чтобы сделать его менее раздутой

if (empty($_SESSION['MM_Username'])) { 
    exit; // take appropriate action here 
} 
if (empty($_GET['car_id'])) { 
    exit; // take appropriate action here 
} 

mysql_select_db($database_conn, $conn); 
$sql = sprintf("DELETE FROM minibusler WHERE car_id = %s AND c_owner =%s", 
       GetSQLValueString($_GET['car_id'], "int"), 
       GetSQLValueString($_SESSION['MM_Username'], "text")); 
mysql_query($sql, $conn) or trigger_error(mysql_error()); 

header("Location: myaccount.php"); 
exit; 
+0

Спасибо, что это лучше – PcRestorer

1

В любом случае перед удалением car вы должны проверить, что если он принадлежит к текущему пользователю. Если не отображается соответствующее сообщение.

+0

Да им спрашивать, что является лучшим способом сделать это – PcRestorer

+0

'SELECT COUNT (*) от автомобилей, пользователей WHERE car.car_id =? AND car.owner = users.user_id' (для некоторых, возможно, слишком упрощенных, угадайте, как выглядит ваша структура базы данных) – Quentin

+0

Не зная структуру вашей базы данных, я не могу сказать много. Но в основном вы должны сделать запрос и получить идентификатор владельца автомобиля и сравнить его с идентификатором текущего пользователя. –

Смежные вопросы