PHP和JavaScript变量传递和安全性

时间:2018-07-23 17:40:03

标签: javascript php security mysqli websecurity

我正在尝试为我的论文审阅网站建立一个通知系统,这是应该发生的事情的基本流程:

flow

这是我的表的结构(MySQL):

schema

我遇到的问题是,一旦用户接受或拒绝审阅请求,我就无法弄清楚如何安全地更新关系表中的状态。我可以将“接受/拒绝”按钮的值设置为该关系的ID,并使用ajax更新该关系的状态,但这似乎并不安全,因为用户可以使用inspect元素更改该值。

以下是我所拥有的一个例子:
request.php

<?php
//define global variables
$dbhost = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbdatabase = "test";
$conn = new mysqli($dbhost, $dbusername, $dbpassword, $dbdatabase);
?>
<a href="user43notifs.php">Click here to go to user 43's notifications</a><br><br>

<!--Example requests-->

<form action="request.inc.php" method="post">
  op_id: 43<br>
  reviewer_id: 42<br>
  essay_id: 34<br>
  <input type="hidden" name="op_id" value="43">
  <input type="hidden" name="reviewer_id" value="42">
  <input type="hidden" name="essay_id" value="34">
  <input type="submit" name="submit">
</form>
<form action="request.inc.php" method="post">
  op_id: 43<br>
  reviewer_id: 16<br>
  essay_id: 135<br>
  <input type="hidden" name="op_id" value="43">
  <input type="hidden" name="reviewer_id" value="16">
  <input type="hidden" name="essay_id" value="135">
  <input type="submit" name="submit">
</form>
<form action="request.inc.php" method="post">
  op_id: 78<br>
  reviewer_id: 12<br>
  essay_id: 25<br>
  <input type="hidden" name="op_id" value="78">
  <input type="hidden" name="reviewer_id" value="12">
  <input type="hidden" name="essay_id" value="25">
  <input type="submit" name="submit">
</form>

request.inc.php

<?php
//define global variables
$dbhost = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbdatabase = "test";
$conn = new mysqli($dbhost, $dbusername, $dbpassword, $dbdatabase);

$op = mysqli_real_escape_string($conn, $_POST['op_id']);
$reviewer = mysqli_real_escape_string($conn, $_POST['reviewer_id']);
$essay = mysqli_real_escape_string($conn, $_POST['essay_id']);

$sql = "INSERT INTO `reviewer_relations` (`reviewer_id`, `essay_id`, `status`)
VALUES ('$reviewer', '$essay', 0)";

$result=mysqli_query($conn, $sql);
if($result === TRUE){
  $title = mysqli_real_escape_string($conn, $reviewer." has requested to review your essay: essay#".$essay.".");
  $message = mysqli_real_escape_string($conn, '<button onclick="location.href=\'scripts/review_request.php?confirmation=accept\'" class="review-accept">Accept</button><button onclick="location.href=\'scripts/review_request.php?confirmation=decline\'" class="review-decline">Decline</button>');
  $sql = "INSERT INTO `notifications` (`user_id`, `title`, `message`)
  VALUES ('$op', '$title', '$message')";

  $result=mysqli_query($conn, $sql);

  if($result === TRUE){
    echo 'notification and relation insert success';
  }
  else{
    echo 'notification insert fail: '.mysqli_error($conn);
  }
}
else{
  echo 'relation insert fail: '.mysqli_error($conn);
}
?>

user43notifs.php

<?php
$dbhost = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbdatabase = "test";
$conn = new mysqli($dbhost, $dbusername, $dbpassword, $dbdatabase);

$sql="SELECT *
FROM notifications
WHERE user_id = 43";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_assoc($result)){
  echo '**********************************************<br>';
  echo $row['title'].'<br>';
  echo $row['message'].'<br>';
}
?>

使用通过PHPMyAdmin设置的这两个表表:
reviewer_relations
reviewer_relations
通知
enter image description here

我需要一种安全的方式来更新当用户单击该通知的接受或拒绝按钮时,该通知所表示的reviewer_relation的状态列。

问题是我无法找到一种将关系ID(或描述该关系的reviewer_id和essay_id)与它的通知相关联的方法,而没有直接将其放入容易更改的通知HTML中。

>

我不常问问题,因此,对于该问题的标题,书面或陈述方式提出的任何批评都值得赞赏。如果需要任何其他信息,请询问。谢谢!

1 个答案:

答案 0 :(得分:0)

我相信已经找到了解决方案:
我在用户文章关系表中添加了一个令牌列,以便可以使用唯一的,密码安全的令牌来标识每个请求(有关令牌生成代码,请参见Scott的更新答案here)。
然后,在将通知插入通知表中时,我将接受按钮的值设置为令牌。这样,当加载通知页面时,可以使用.val()检索令牌,并将其与ajax一起使用以更新相应请求的状态。因此,尽管用户可以更改按钮的值,但他们猜测另一个请求的100个字符长的令牌的机会在天文上很小。
请告诉我这是否不如我想象的那么安全。