Javascript 使用浏览器控制台发送ajax数据

Javascript 使用浏览器控制台发送ajax数据,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我有一个PHP测验页面,它通过ajax通过名为answer()的函数单击答案时发布答案数据,然后如果loadQuestion()函数也通过ajax正确,则加载问答内容。以下是我代码的一部分: <ul class="choices"> <li><a href="javascript:void(0);" onclick="answer(this);"><span id="a0"><?php echo $questionDetail['a'

我有一个PHP测验页面,它通过ajax通过名为answer()的函数单击答案时发布答案数据,然后如果loadQuestion()函数也通过ajax正确,则加载问答内容。以下是我代码的一部分:

<ul class="choices">
    <li><a href="javascript:void(0);" onclick="answer(this);"><span id="a0"><?php echo $questionDetail['a'.$answerOrder[0]]; ?></span></a></li>
    <li><a href="javascript:void(0);" onclick="answer(this);"><span id="a1"><?php echo $questionDetail['a'.$answerOrder[1]]; ?></span></a></li>
</ul>
<div id="countdown"><div class="saniyeLoading" style="display: none;"></div></div>
<ul>
    <li><a href="javascript:void(0);" onclick="answer(this);"><span id="a2"><?php echo $questionDetail['a'.$answerOrder[2]]; ?></span></a></li>
    <li><a href="javascript:void(0);" onclick="answer(this);"><span id="a3"><?php echo $questionDetail['a'.$answerOrder[3]]; ?></span></a></li>
</ul>
<script type="text/javascript">
function answer(elm){
    countdown.stop();
    var answer = $(elm).text();
    $.ajax({
        type: 'POST',
        url: "/soru",
        data: {act: 'soru', answer: answer},
        success:function (data) {
            if(data == "success"){
                setTimeout(loadQuestion, 300);
            } else {
                location.href = "/yanlis";
            }
        }
    });
}
function loadQuestion() {
    $.ajax({
        type: 'POST',
        url: "/",
        data: {act: 'ysoru'},
        success: function (data) {
            try {
                data = $.parseJSON(data);
                $("#questionDetailQuestion").text(data.questionDetail['question']);
                $("#a0").text(data.questionDetail['a0']);
                $("#a1").text(data.questionDetail['a1']);
                $("#a2").text(data.questionDetail['a2']);
                $("#a3").text(data.questionDetail['a3']);
                $('.saniyeLoading').hide();
                countdown.start();
            } catch (e) {
            }
        }
    });
}
</script>
功能应答(elm){ 倒计时。停止(); var answer=$(elm.text(); $.ajax({ 键入:“POST”, 网址:“/soru”, 数据:{act:'soru',答案:答案}, 成功:功能(数据){ 如果(数据=“成功”){ setTimeout(loadQuestion,300); }否则{ location.href=“/yanlis”; } } }); } 函数loadQuestion(){ $.ajax({ 键入:“POST”, 网址:“/”, 数据:{act:'ysoru'}, 成功:功能(数据){ 试一试{ data=$.parseJSON(数据); $(“#questionDetailQuestion”).text(data.questionDetail['question']); $(“#a0”).text(data.questionDetail['a0']); $(“#a1”).text(data.questionDetail['a1']); $(“#a2”).text(data.questionDetail['a2']); $(“#a3”).text(data.questionDetail['a3']); $('.saniyeLoading').hide(); 倒计时。开始(); }捕获(e){ } } }); }
我这里的问题是,人们可以通过在浏览器开发人员控制台中编写一个简单的for循环来操作answer()函数。大概是这样的:

for(i = 1 ; i <= 4; i ++ ) {
        $.ajax({
            type: 'POST',
            url: "/soru",
            data: {act: 'soru', answer: $('#a' + i).text()},
            success:function (data) {
                if(data == "success"){
                    loadQuestion();
                }
            }
        });
    }

for(i=1;i),但您无法阻止用户使用控制台操纵代码。我可以建议如下:

  • 您可以在服务器端限制从单个用户接受的Ajax请求的数量

  • 添加验证码,如果您看到异常活动

  • 混淆您的代码和AJAX调用格式,所以它需要用户更多的精力来分析代码,并将阻止大多数人

  • 使用动态生成的图像和位于随机位置的答案“单选按钮”,并返回用户单击事件的x和y位置,并使用服务器端逻辑将单击位置与答案选项匹配


  • 使用服务器端的会话跟踪每个用户的正确猜测和错误猜测,并强制执行规则


    只要你依靠客户端“玩得很好”,你就是在向最终用户展示你的应用程序。

    谢谢你的回答。你觉得我的解决方案怎么样?你认为它容易操作吗?是的。jQuery有.trigger()函数,它允许您触发click event ProgramMatically您指的是类似于(i=1;我刚刚在链接的帮助下检查了这一点,有一个名为isTrigger的变量,它只使用触发器()触发)函数。我认为这将解决我的问题。除非在控制台中也可以将其设置为null。实际上,我的应用程序是一个测验,如果你回答错误,你将无法进行到最后。有500多个问题。我已经在一个会话中跟踪回答的问题,很遗憾,这不是Mehm的解决方案……我会让API完全依赖于删除用户状态,该状态将仅存储在服务器上。例如,负责检查答案是否正确的API也有权在错误时立即终止用户会话,要求他们在任何“正确答案”之前重新开始数据将被提供给他们——这将防止您试图避免的确切类型的滥用。最简单的实现将返回data=='failed',即使对于正确的答案也是如此,如果发出请求的用户在会话数据中“failed”(来自上一个错误的答案)。然后,无论什么操作都将重新启动他们的游戏(我相信是hitting/yanlis)将刷新他们的会话。这样游戏就不能被强制。只要你检查用户是否参与他们提交答案的问题。同样,如果用户会话数据没有显示他们参与了这个问题,那么永远不要对此问题发出成功响应。