PHP/ajax -防止用户提交一个url与get变量,除非在ajax调用

PHP/ajax - prevent user from submitting a url with get variables except in ajax call

本文关键字:ajax 变量 get url 调用 一个 用户 提交 PHP      更新时间:2023-09-26

嗨,我有一个jquery函数,它使用ajax调用向php页面发送信息。它使用get方法发送此信息。我担心的是,如果用户直接进入php页面,并在url中输入一些get变量。虽然敏感数据不被php脚本处理,但我仍然希望ajax调用能够与脚本交互,而不是用户(通过在浏览器中输入url)。如何做到这一点?

js代码
$.ajax({
    type: "GET",
    url: "/add.php",
    data: 'id=' + itemid,
    dataType: "json",
    success: function (data) {
        document.getElementById("name").innerHTML = data[0];
        document.getElementById("desc").innerHTML = data[1];
        document.getElementById("price").innerHTML = data[2];
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert(xhr.status);
        alert(thrownError);
    }
});
php代码

$output = array();
$output[0] = $itemname . " " . $_GET['id'];
$output[1] = $itemdescription;
$output[2] = $itemprice;
echo json_encode($output);
exit();

不幸的是,我不能使用POST方法,因为这与一些代码冲突。

大多数ajax框架(如jQuery)都发送HTTP_X_REQUESTED_WITH标头。
这里已经描述了如何检索它的值。

我认为真的不建议使用头值来保护你的脚本,因为你可以操纵请求头(例如curl)。您使用的方法,GET, POST, PUTDELETE并不重要,您的服务器端api必须是安全的。如果您想防止重复调用该url,请查看captcha服务或为url添加只有效一次的uid。

对于POST或GET请求,如果你在数据库中做插入,你必须-保护你的表单-安全发布数据

另外,您应该考虑优先使用键/值数组

    $output = array(
        'id' => $_GET['id'],
        'name' => $itemname,
        'description' => $itemdescription,
        'price' => $itemprice
    );
    echo json_encode($output);

js

    $.ajax({
        type: "GET",
        url: "/add.php",
        data: 'id=' + itemid,
        dataType: "json",
        success: function ( item ) {
            document.getElementById("name").innerHTML = item.name + " " + item.id;
            document.getElementById("desc").innerHTML = item.description;
            document.getElementById("price").innerHTML = item.price;
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });

要使ajax查询安全,必须转义html实体、sql注入。为了使表单安全,您可以为每个表单生成一个令牌,并在将数据发送到服务器之前对其进行编码,这样客户端将无法读取您发送给服务器的数据类型。

在服务器端,您可以在插入之前解码