2009-10-15 1 views
0
while($info = mysql_fetch_array($data)) { 
// Print out the contents of the entry 
Print "<li><b>Name:</b> ".$info['name'] . " <br />"; 
Print "<b>ID:</b> ".$info['ID']." <br />"; 
Print "<b>Age:</b> ".$info['age'] ." <br />"; 
Print "<b>Location:</b> ".$info['location'] ."<br /> "; 
Print "<form action=delete.php method=POST><input name=ID value="safe(.$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>"; 
} 
Print "</ol>"; 

Это мой код. Я, однако, сосредоточив внимание на этой линии:Предоставление формы с предоплатой

Print "<form action=delete.php method=POST><input name=ID value=".$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>"; 

Как было отмечено в одном из моих предыдущих постов, это не безопасно против инъекции SQL атаки.

Я позаимствовал эту функцию из другого поста:

function safe($value){ 
    return mysql_real_escape_string($value); 
} 

Теперь, как, черт возьми, я сделал бы эту часть в безопасности от нападения?

value=".$info['ID']." 

Ваша постоянная поддержка с благодарностью.

ответ

1

просто проверьте, имеет ли сервер эту запись или нет.

Для этого:

$query = 'SELECT * FROM `table` WHERE `ID` = '.(int)$_POST['ID']; 

Casting его в целое число должно быть достаточно безопасным. Если это строка, она также будет преобразована. См. «Жонглирование» типа PHP: http://www.php.net/manual/en/language.types.type-juggling.php

Кроме того, проверяя, существует ли эта запись или нет, вы двойным образом гарантируете, что данные действительны.

Итак:

$result=mysql_query('DELETE FROM `savannah` WHERE `ID`='.(int)$_POST['ID']); 
if(!$result){ 
    die(mysql_error()); 
} 
+0

Должен ли я беспокоиться mysql_real_escape_string? Эта вещь, которую я создаю для своего собственного образования, будет использовать DELETE, только найдя идентификатор. Тем не менее, я хотел бы защитить строки, которые я тоже вхожу в базу данных. Любой совет? –

+0

Если он уже введен в целое число, то нет необходимости в mysql_real_escape_string (поскольку он уже целочисленный, в нем нет смешных символов!). – mauris

+0

Хорошо. Тип поля ID - int (1) - поэтому я знаю, что это целое число. Это, однако, не защищает меня от людей, угадывающих идентификаторы. Итак, теперь я пытаюсь реализовать этот код, который вы написали, и я не уверен, куда его поместить в delete.php. $ result = mysql_query ("УДАЛИТЬ ИЗ САПАННЫ WHERE ID = '. (Int) $ _ POST [' ID ']") или умереть (mysql_error()); дает мне ошибки. –

2

ДА ДА ДА ВЫ НУЖНЫ ПРЕОДОЛЕНИЕ (не слишком выразительный)

Чтобы защитить этот код от атаки, вы должны убедиться, что у вас есть с проверкой подлинности пользователь. Загружен ли пользователь, который просматривает эту страницу? Если да, где хранится их сеанс?

Независимо от того, какую логику вы использовали для чтения данных, которые необходимо использовать при удалении данных.

// Read data in at top to prevent E_STRICT errors if user messes with Query string  
$User_ID = $_SESSION['User_ID']; //assuming it was authenticated 
$a_filter = (isset($_POST['a_filter']) ? $_POST['a_filter'] : ''); 

$query = " 
    SELECT 
     a, b, c 
    FROM 
     table 
    WHERE 1 
     AND a  = " . mysql_real_escape_string($a_filter) . " 
     AND User_ID = " . intval($User_ID) . " 
    "; 

Этот запрос обеспечит:

  1. что опрашиваемый пользователь может видеть только свои записи.
  2. Что не имеет значения, какие хакерские данные они отправляют, это будет сбежать.

Теперь, когда вы печатаете его на HTML, убедитесь, что вы защиты от XSS атак:

<td><?= htmlspecialchars($data); ?></td> 

или если вы в атрибуте:

<input type="text" name="a_filter" value="<? htmlspecialchars($data, ENT_QUOTES); ?>" /> 

Теперь, когда ты удалите запись, просто убедитесь, что вы применяете те же самые гарантии ...

// Read data in at top to prevent E_STRICT errors if user messes with Query string 
$User_ID = $_SESSION['User_ID']; //assuming it was authenticated 
$ID  = (int) (isset($_POST['id']) ? $_POST['id'] : 0); 

$query = " 
    DELETE FROM 
     table 
    WHERE 1 
     AND ID  = " . intval($ID) . " 
     AND User_ID = " . intval($User_ID) . " 
    "; 

Это сообщение покрывается спасаясь SQL, спасаясь HTML, спасаясь HTML атрибуты, и обеспечить, чтобы запросы разрешены.

Вот краткое сообщение о том, где спасаясь имеет важное значение:
http://blog.gahooa.com/answers/what-kind-of-data-needs-to-be-escaped/

+0

Ничего себе. Спасибо. –

1

безопасность здесь, вероятно, следует быть многоуровневым - там не так много еще можно сделать в этой конкретной области.

У вас есть уникальная сессия для идентификации пользователя (даже если вы этого еще не сделали, это не так сложно сделать просто)?

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

, которые должны защитить от простых атак нагнетательных ...

, как для экранирования целых значений - я вообще отбрасывать поступающее значение как целое, и, как правило, снимает проблему изгоев символов и поврежденных входы:

$safe['value'] = (int) $_POST['value']; 

Если строка не-цифровая, ваше безопасное значение будет равно 0.

Edit: я должен упомянуть, что просто полагаясь на то, что поле базы данных представляет собой целое число не является безопасным в любом случае, и не избежать или c перед вводом данных перед созданием запроса вы открываете SQL-инъекцию.

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