【问题标题】:PHP/SQL Error: Possible race condition?PHP/SQL 错误:可能的竞争条件?
【发布时间】:2013-07-07 04:52:28
【问题描述】:

我是 AJAX 编程的新手和 PHP 编程的初学者。我不知道为什么,但是当用户点击箭头以“Upvote”帖子反复且非常快速时,PHP login_check 决定用户不再登录。如果我以正常速度点击箭头,程序将工作,但是当我快速射击时,它会变得很奇怪。

PHP 代码:

<?php

include "db_connect.php";
include "functions.php";

sec_session_start();

我想知道这是否是竞争条件的明确案例以及我可以做些什么来防止它-

AJAX 代码:

$(document).ready(function() {

$("#upvotearrow").click(function() {
    setTimeout(function() { }, 500);
    $resdiv=$("#upvotedownvote_resultalert");
    $content=$("#upvotedownvote_resultalert_content");
    $.ajax({
        type: "POST",
        url: "../secure/process_upvotedownvote.php",
        data: { vote: "upvote", poemid: $("#poemidfield").val() },
        dataType:"HTML"
    })
    .done(function(param) {
        if (param=="true_upvote") {
            $content.html("Upvote registered!");
            $resdiv.css("visibility", "visible");
        }

        else {
            $content.html("Invalid request");
            $resdiv.css("visibility", "visible");
        }
    });         
});

$("#downvotearrow").click(function() {
    setTimeout(function() { }, 500);
    $resdiv=$("#upvotedownvote_resultalert");
    $content=$("#upvotedownvote_resultalert_content");
    $.ajax({
        type: "POST", //POST data
        url: "../secure/process_upvotedownvote.php", //Secure upvote/downvote PHP file
        data: { vote: "downvote", poemid: $("#poemidfield").val() }, //Get type of vote and poem_id in URL
        dataType:"HTML" //Set datatype as HTML to send back params to AJAX function
    })
    .done(function(param) { //Param- variable returned by PHP file
        if (param=="true_downvote") {
            $content.html("Downvote registered!");
            $resdiv.css("visibility", "visible");
        }

        else {
            $content.html("Invalid request");
            $resdiv.css("visibility", "visible");
        }
    });
});

    });

有现场演示的网站can be viewed here.

要登录,只需使用此电子邮件:asdf@gmail.com 和此密码:asdf123

提前感谢您的任何建议!

【问题讨论】:

    标签: php mysql sql ajax race-condition


    【解决方案1】:

    我不知道比赛条件(这很可能但不应该与会话混淆,除非它每次都得到regenerated)。无论如何,如果我是你,我会在第一次点击后立即禁用 upvote/downvote 按钮。

    【讨论】:

    • 哦,废话——sec_session 函数会重新生成会话 ID——这是一个 sn-p session_start(); session_regenerate_id(true); // regenerated the session, delete the old one. 我现在该怎么办?重写一个特殊的 sec_session() 函数只是为了赞成/反对?我不想禁用该按钮,因为我 1)希望允许人们更改 upvotes->downvotes,反之亦然 2)这将是不安全的,因为他们可以更改 javascript
    • 好吧,除非有人比我更了解情况,否则我认为您不需要每次都重新生成会话。只需确保您在用户登录时重新生成会话以防止会话固定攻击。此外,如果您每次都重新生成,您会遭受轻微的性能损失(无论如何这可能是可以接受的):生成新的随机、不存在的令牌;序列化会话内容并将其存储到新文件中;删除旧文件;通过 PHPSESSID cookie 设置新的会话 id...
    • 老兄,非常感谢!我在 Stack Overflow 上搜索 session_regenerate_id 安全问题,我读到的每一篇文章都同意你的观点,即没有必要。你把我从一场关于比赛条件的疯狂追逐中救了出来。再次感谢您!
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 2013-04-13
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2019-09-09
    相关资源
    最近更新 更多