Как заблокировать ссылку, сравнивая данные из 2 таблиц

Я просто пытаюсь сделать это, но я даже не представляю, как это сделать, вот случай:
У меня 3 стола

**

  • admin_users, admin_permissions & admin_modules

**

Я передаю «iduser» через get на страницу, и я генерирую тип меню из таблицы «admin_modules» …
Теперь я хочу отключить ссылки, к которым у пользователя нет прав доступа ……
Я думаю, что я могу сделать это с помощью CSS, но я не знаю, в каком месте моего «генератора меню» я должен разместить код, чтобы сделать это … *

include ("connector.php");
$con = conectar();
$tbl = "admin_modules";
$i=0;
$query = "SELECT * FROM $tbl";
$resultado = mysqli_query($con,$query) or die(mysqli_error());
while($dato=mysqli_fetch_array($resultado)){
echo "<td width='25%'><a href=../" .
$dato['RootDirectory']  . "/" . $dato['InitialMenu'] . "><img src=./images/icons/" .
$dato['IconName'] . "></a><p>" . $dato['ModuleName'] . "</p></td>";

$i=$i+1;
if ($i==4) {
echo"</tr>";
echo"<tr>";
$i=0;
}

}
mysqli_close($con);//cerrar conexion

Дополнительная информация:

В admin_permissions у меня есть два столбца: «idadmin_users [FK]» и «idadmin_module [FK]». Итак, если у пользователя есть реестр в этой таблице, он имеет доступ к модулю.

Пример:

пользователь Джон имеет доступ к модулю отклонения и к модулю счетов-фактур …
Таким образом, он имеет 2 записи в admin_permissions со своим уникальным идентификатором пользователя и с каждым из уникальных идентификаторов модуля

0

Решение

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

include ("connector.php");
$con = conectar();

// Get permissions
$perms = array();
$result1 = mysqli_query($con, "SELECT * FROM admin_permissions WHERE idadmin_users = $_GET['iduser']");
while ($row = mysqli_fetch_array($result1)) {
$perms[] = $row['idadmin_module'];
}

// Get modules and loop
$i = 0;
$result2 = mysqli_query($con, "SELECT * FROM admin_modules") or die(mysqli_error());
while($dato = mysqli_fetch_array($result2)){
echo '<td width="25%">';

// Only echo the <a> tags if user has permission
// I'm assuming the $dato row has an 'id'
// that matches admin_permissions.idadmin_module
if (in_array($dato['id'], $perms)
echo '<a href="../' . $dato['RootDirectory']  . '/' . $dato['InitialMenu'] . '">';

echo '<img src="./images/icons/' . $dato['IconName'] . '">';

// Only echo the <a> tags if user has permission
if (in_array($dato['id'], $perms))
echo '</a>';

echo '<p>' . $dato['ModuleName'] . '</p></td>';

$i++;
if ($i == 4) {
echo '</tr>';
echo '<tr>';
$i=0;
}
}

mysqli_close($con); // cerrar conexion

ВАЖНЫЙ:

Использование параметра GET в этом запросе является основной уязвимостью:

SELECT * FROM admin_permissions WHERE idadmin_users = $_GET['iduser']

Было бы гораздо лучше использовать MySQLi параметризованные запросы для этого, но это, вероятно, повлечет за собой изменения в connector.php а также (что я не вижу на момент написания этой статьи). Поэтому используйте основные концепции этого ответа, чтобы понять, куда вы идете, а затем обновите свои запросы, чтобы сделать их более безопасными.

1

Другие решения

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

0