如何防止自由访问此脚本?

时间:2015-02-21 20:57:09

标签: php mysql

我正在尝试创建一个简单的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上的链接中删除邮件的位置?

2 个答案:

答案 0 :(得分:1)

您的请求中需要某种令牌来验证这确实是来自您系统的有效请求。

一种方法是在您的请求中添加nonce。这可以确保请求来自您控制的表单,而某人没有使用旧表单来欺骗新请求。

您可以选择many nonce libraries for PHP

答案 1 :(得分:0)

脚本需要知道当前用户是否有权执行操作。一种简单的方法是使用$ _SESSION变量。

类似的东西:

session_start();

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

// database query here