2015-02-21 2 views
1

Я пытаюсь создать простую систему сообщений PHP/MySQL. Следующий код представляет собой раздел страницы, на котором отображаются сообщения, полученные пользователем, messages.php. Сообщения пользователя были получены из MySQL и сохранены в переменной $messages.Как я могу предотвратить свободный доступ к этому сценарию?

foreach($messages as $message) { 
    // formatting, printing the text, etc. 
    echo '<a href="msg_del.php?id=' . $message['id'] . '">Remove</a>'; 
} 

А вот файл msg_del.php:

<?php 
$id = $_GET['id']; 

// Connect to the database 
require("../info/dbinfo.php"); 
$db_user = constant("DB_USER"); 
$db_pass = constant("DB_PASS"); 
$db_name = constant("DB_NAME"); 
$db_server = constant("DB_SERVER"); 

try { 
    $conn = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user, $db_pass); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $conn->prepare("DELETE FROM messages WHERE id = " . $conn->quote($id) . ";"); 
    $stmt->execute(); 
} 
catch(PDOException $e) { 
    echo "Error connecting to database!"; 
    exit(); 
} 

// Redirect to messages page 
header("Location: messages.php"); 
exit(); 
?> 

код полностью работоспособен, но проблема в том, что любой человек может ввести msg_del.php?id=SOMEID в браузер и удалять сообщения. Как я могу защитить это, где сообщения могут быть удалены только из ссылок на messages.php?

ответ

1

В вашем запросе вам понадобится какой-то токен, чтобы подтвердить, что это действительно действительный запрос из вашей системы.

Один из способов заключается в добавлении nonce к вашему запросу. Это гарантирует, что запрос пришел из формы, которую вы контролируете, и кто-то не использует старую форму для подмены нового запроса.

many nonce libraries for PHP вы можете выбрать.

0

Сценарий должен знать, имеет ли текущий пользователь разрешение на выполнение действия. Один простой способ сделать это с переменной $ _SESSION.

Что-то вроде:

session_start(); 

if (!isset($_SESSION['user_id']) && /*permission logic here*/) { 
    //display an error message 
    die(); 
} 

// database query here 
Смежные вопросы