Вопрос по firebug, security, ajax, php, forms – Предотвратить пользователю от редактирования значения флажка с чем-то вроде FireBug?

0

У меня есть страница администратора, на которой перечислены группы записей, а рядом с каждой записью установлен флажок, чтобы установить для него значение «активный». статус. Каждый флажок имеет значение, привязанное к идентификатору записи в базе данных. Если кто-то использует FireBug, он может легко изменить значение флажка на другое число, что приведет к неправильной записи в базе данных.

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

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

The HTML + PHP..

<input type="checkbox" class="active" name="active<?php echo $id; ?>" id="active<?php echo $id; ?>" <?php if ($active == 1): ?>checked="checked"<?php endif; ?> value="<?php echo $id; ?>">

jQuery ajax..

$("input.active").click(function() {

var loader = $(this).prev().prev();

$(loader).css("visibility","visible");
// store the values from the form checkbox box, then send via ajax below
var check_active = $(this).is(':checked') ? 1 : 0;
var check_id = $(this).attr('value');

console.log(check_active);
console.log(check_id);

    $.ajax({
        type: "POST",
        url: "active.php",
        data: {id: check_id, active: check_active},
        success: function(){
            $(loader).css("visibility","hidden");

        }
    });
return true;
});

Here is active.php..

<?php

include("dbinfo.php");
mysql_connect($server,$username,$password);
@mysql_select_db($database) or die( "Unable to select database"); 

$active = mysql_real_escape_string($_POST['active']);
$id = mysql_real_escape_string($_POST['id']);

$addEntry = "UPDATE entries SET active = '$active' WHERE id = '$id'";
mysql_query($addEntry) or die(mysql_error());


mysql_close();
?>
Просто чтобы уточнить, беспокоит ли вас администратор, меняющий записи, которые они не должны менять? Если это так, то это просто проблема с разрешениями, и ее следует решать через ACL. В любом случае я не вижу возможности встроить идентификатор в ваш JS / HTML для запуска каждой записи, и это нормально и является нормальным способом сделать что-то. Однако, если вы беспокоитесь о том, чтобы изменить что-то, что они не должны, вам следует просто проверить, что им разрешено это делать. Steve H

Ваш Ответ

2   ответа
1

Firebug имеет полный контроль над HTML.

Но вы не беспокоитесь о HTML, вы на самом деле беспокоитесь о том, что пользователь сделает что-то интересное в active.php, и именно здесь вы должны добавить больше защиты.

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

Проблема безопасности, которую вы описываете, где некоторые вредоносныеadmin может изменить идентификатор в HTML и иметь неправильную запись, изменить активное состояние ничто по сравнению с еще более злонамереннымuser он может отправить запрос на публикацию на вашу страницу active.php так же, как это делает ваш ajax-скрипт, но используя его сервер, эффективно имея доступ к изменению любого активного состояния в любой записи.

Что вы должны сделать, это выполнить некоторую аутентификацию на active.php

Будь то с помощью сессий или HTTP

Хороший ответ, это то, на что я ссылался в своих комментариях, показ идентификаторов является спорным, ACL = решение.
@ SteveH Я предпочитаюCapability based security надAccess Control Lists, но я думаю, что это слишком много информации для ОП
2

$_SESSION значение с информацией об учетной записи в нем, так что если они пытаются получить доступ к учетной записи, которая не там, вы можете поймать его и пометить его соответствующим образом. Просто идентификационный номер их учетной записи, вероятно, будет достаточно. Вы определенно должныnot положить это в скрытые поля или в любое место, где пользователь может изменить его.

Хм, в этом случае он говорит об администраторе, который, как я предполагаю, сможет видеть все данные, поэтому он должен использовать незащищенный идентификатор, иначе как он узнает, какую запись необходимо обновить? Я согласен с $ _SESSION, однако проблема не в том, что значения находятся внутри скрытых полей, а в том, что ему нужно проверить разрешение (я) перед выполнением запроса.
Ваш ответ появился после Googling & quot; запретить изменение флажка php & quot; на этот вопросstackoverflow.com/q/30645705 - 3 seconds on Googleклассика.

Похожие вопросы