用PHP制作一个安全的评分系统

用PHP制作一个安全的评分系统,php,web,Php,Web,在我的网站上,我每页显示5个问题(MCQ),当用户请求新页面时,我会调用一个脚本score\u update(),并将此页面的分数显示给他,然后显示下一页 scoreUpdate()脚本类似于 <?php //connect to database //update the score ?> PS:用户可能在将来的某个时候再次尝试相同的问题。没有任何限制。因此,没有必要跟踪他提出的问题。只有当他试图回答这个问题并正确回答时,他才能得到分数。希望我说的很清楚。像这样的问题有不同的解决

在我的网站上,我每页显示5个问题(MCQ),当用户请求新页面时,我会调用一个脚本
score\u update()
,并将此页面的分数显示给他,然后显示下一页

scoreUpdate()
脚本类似于

<?php
//connect to database
//update the score
?>

PS:用户可能在将来的某个时候再次尝试相同的问题。没有任何限制。因此,没有必要跟踪他提出的问题。只有当他试图回答这个问题并正确回答时,他才能得到分数。希望我说的很清楚。

像这样的问题有不同的解决方案。这与访客计数器或民意测验基本相同

如果有一个用户已经触发了该脚本并在每次页面调用中重新识别他,那么至少您必须将您的信息存储在某个地方

  • 第一个也是最好的方法是使用一个用户帐户登录,并将其保存在PHP$会话中,或者直接保存在与用户id/帐户id链接的数据库中。但是,如果您的页面现在没有登录,我想这对于一个较小的问题来说太难了。但是如果你已经有一个登录面板,这是目前为止最好的解决方案
  • 另一种方法是保存cookie,如果用户不同意保存cookie,则最近在一些国家可能会出现法律问题,并且cookie可以删除,因此很容易操作
  • 你也可以保存用户的IP地址:更难操作(需要重新启动互联网等,没有人会这么做十几次来伪造你的分数计数器),但如果多人共享同一互联网连接,只有其中一人可以获得一分

它们各有优缺点。根据你的偏执程度,如果你想让欺骗/虐待变得更难,你也可以将多种方法结合起来,但这取决于你自己。

对于这样的问题,有不同的可能解决方案。这与访客计数器或民意测验基本相同

如果有一个用户已经触发了该脚本并在每次页面调用中重新识别他,那么至少您必须将您的信息存储在某个地方

  • 第一个也是最好的方法是使用一个用户帐户登录,并将其保存在PHP$会话中,或者直接保存在与用户id/帐户id链接的数据库中。但是,如果您的页面现在没有登录,我想这对于一个较小的问题来说太难了。但是如果你已经有一个登录面板,这是目前为止最好的解决方案
  • 另一种方法是保存cookie,如果用户不同意保存cookie,则最近在一些国家可能会出现法律问题,并且cookie可以删除,因此很容易操作
  • 你也可以保存用户的IP地址:更难操作(需要重新启动互联网等,没有人会这么做十几次来伪造你的分数计数器),但如果多人共享同一互联网连接,只有其中一人可以获得一分

它们各有优缺点。根据你的偏执程度,如果你想让欺骗/虐待变得更难,你也可以将多种方法结合起来,但这取决于你自己。

对于这样的问题,有不同的可能解决方案。这与访客计数器或民意测验基本相同

如果有一个用户已经触发了该脚本并在每次页面调用中重新识别他,那么至少您必须将您的信息存储在某个地方

  • 第一个也是最好的方法是使用一个用户帐户登录,并将其保存在PHP$会话中,或者直接保存在与用户id/帐户id链接的数据库中。但是,如果您的页面现在没有登录,我想这对于一个较小的问题来说太难了。但是如果你已经有一个登录面板,这是目前为止最好的解决方案
  • 另一种方法是保存cookie,如果用户不同意保存cookie,则最近在一些国家可能会出现法律问题,并且cookie可以删除,因此很容易操作
  • 你也可以保存用户的IP地址:更难操作(需要重新启动互联网等,没有人会这么做十几次来伪造你的分数计数器),但如果多人共享同一互联网连接,只有其中一人可以获得一分

它们各有优缺点。根据你的偏执程度,如果你想让欺骗/虐待变得更难,你也可以将多种方法结合起来,但这取决于你自己。

对于这样的问题,有不同的可能解决方案。这与访客计数器或民意测验基本相同

如果有一个用户已经触发了该脚本并在每次页面调用中重新识别他,那么至少您必须将您的信息存储在某个地方

  • 第一个也是最好的方法是使用一个用户帐户登录,并将其保存在PHP$会话中,或者直接保存在与用户id/帐户id链接的数据库中。但是,如果您的页面现在没有登录,我想这对于一个较小的问题来说太难了。但是如果你已经有一个登录面板,这是目前为止最好的解决方案
  • 另一种方法是保存cookie,如果用户不同意保存cookie,则最近在一些国家可能会出现法律问题,并且cookie可以删除,因此很容易操作
  • 你也可以保存用户的IP地址:更难操作(需要重新启动互联网等,没有人会这么做十几次来伪造你的分数计数器),但如果多人共享同一互联网连接,只有其中一人可以获得一分

它们各有优缺点。根据你的偏执程度,如果你想让作弊/虐待变得更难,你也可以将多个选项组合在一起,但这取决于你。

检查
$\u服务器['HTTP\u REFERER']

  • 如果相同,则重新加载页面。(什么也不做)
  • 如果是上一个:更新
    ------------------------------------------
    user_id  | username  |  password  | points
    ------------------------------------------
    
    users
    +------------+-------------+------+-----+---------+----------------+
    | Field      | Type        | Null | Key | Default | Extra          |
    +------------+-------------+------+-----+---------+----------------+
    | user_id    | smallint(5) | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(10) | NO   |     | NULL    |                |
    +------------+-------------+------+-----+---------+----------------+
     ... You'll have more columns, but you get the idea
    
    questions
    +----------+--------------+------+-----+---------+----------------+
    | Field    | Type         | Null | Key | Default | Extra          |
    +----------+--------------+------+-----+---------+----------------+
    | qid      | smallint(5)  | NO   | PRI | NULL    | auto_increment |
    | question | varchar(10)  | NO   |     | NULL    |                |
    | votes    | smallint(5)  | NO   |     | 0       |                |
    +----------+--------------+------+-----+---------+----------------+
    
    votes
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | qid    | smallint(5) | NO   |     | NULL    |       |
    | user_id| smallint(5) | NO   |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    
    INSERT INTO `votes` (`qid`,`user_id`) VALUES (1, 1);
    
    SELECT `user_id` FROM `votes` WHERE (`user_id`=1) AND (`qid`=1);
    
    ALTER TABLE votes ADD type ENUM('up', 'down') NOT NULL DEFAULT 'up';
    
    +---------+-------------------+------+-----+---------+-------+
    | Field   | Type              | Null | Key | Default | Extra |
    +---------+-------------------+------+-----+---------+-------+
    | qid     | smallint(5)       | NO   |     | NULL    |       |
    | user_id | smallint(5)       | NO   |     | NULL    |       |
    | type    | enum('up','down') | NO   |     | up      |       |
    +---------+-------------------+------+-----+---------+-------+
    
    SELECT `user_id` FROM `votes` WHERE (`user_id`=1) AND (`qid`=1) AND (`type`='up');
    
    -----------------------------------
    user_id  | question_id  |  answer
    -----------------------------------
    
    ----------------------------
    user_id  | questionnaire_id   
    ----------------------------
    
    ------------------------------------------
     questionnaire_id |  question_id | answer
    ------------------------------------------
    
    update_score ($question_number, $choice)
      if current question for this quizz and user is not set to $question_number
        ignore request
      else
        set choice for this specific question and update score
        increment current question (possibly reaching the end of the quizz)