Unity WebGL PHP数据库操作

Unity WebGL PHP数据库操作,php,mysql,unity3d,Php,Mysql,Unity3d,我正试图让一个WebGL unity游戏更新一个MySQL数据库,基本上,我想这样做,当一个用户登录到网站并击败unity游戏时,他们会解锁网站上个人资料上的徽章 因此,我编写了一个PHP脚本来更新数据库以解锁徽章,然后我为unity游戏编写了一个C#脚本来向PHP脚本发送post请求。这个解决方案的问题是,任何像postman这样的外部网站都可以发送相同的帖子请求,玩家不需要真正击败游戏来解锁徽章 然后我想也许我应该把数据库凭据放在C#脚本中,然后直接从那里编辑数据库,但我在网上读到这是一个安

我正试图让一个WebGL unity游戏更新一个MySQL数据库,基本上,我想这样做,当一个用户登录到网站并击败unity游戏时,他们会解锁网站上个人资料上的徽章

因此,我编写了一个PHP脚本来更新数据库以解锁徽章,然后我为unity游戏编写了一个C#脚本来向PHP脚本发送post请求。这个解决方案的问题是,任何像postman这样的外部网站都可以发送相同的帖子请求,玩家不需要真正击败游戏来解锁徽章

然后我想也许我应该把数据库凭据放在C#脚本中,然后直接从那里编辑数据库,但我在网上读到这是一个安全问题,因为玩家可以反编译游戏并将登录凭据获取到数据库

所以我做了一些研究,认为也许我的解决方案是PHP页面上的CSRF,然后也许我可以将令牌传递给unity游戏?我能够让PHP与添加到其中的CSRF一起工作,但是我不知道如何让unity游戏能够发送带有令牌的post请求来解锁站点上的徽章

让unity游戏直接编辑数据库会不会是一个安全问题?任何关于如何解决这个问题的建议都将不胜感激,下面我已经发布了相关的文件,如果有帮助的话,但我认为这更多的是一个概念性的问题

unlockcard2.php

<?php
 require "header.php";

 //check if user is logged in
 if(isset($_SESSION['userId'])){

    //create key for hash_hmac function
    if(empty($_SESSION['key']))
        $_SESSION['key'] = bin2hex(random_bytes(32));

    //create CSRF token
    $csrf = hash_hmac('sha256', 'some random string', $_SESSION['key']);
    if (isset($_POST['submit'])) {

        if(hash_equals($csrf, $_POST['csrf'])) {
            echo '<form action="includes/unlockcard.inc.php" method="post">
            <button type="submit" name="unlock-submit">unlock card</button>
            </form>';
        }
        else{
            echo 'CSRF Token Failed';
        }
    }
 }
 ?>

 <html>
 <form method="POST" action ="unlockcard2.php">
 <input type="hidden" name="csrf" value="<?php echo $csrf ?>" >
 <input type="submit" name="submit" value="SUBMIT">
 </form>
 </html>

谢谢,我编辑了我的文件以使用准备好的声明并更新了帖子。干得好。您仍然需要删除所有这些错误检查。改为启用错误报告好吧,我读了这篇文章,换成了错误报告,希望是正确的。再次感谢。谢谢,我编辑了我的文件以使用准备好的声明并更新了帖子。干得好。您仍然需要删除所有这些错误检查。改为启用错误报告好吧,我读了这篇文章,换成了错误报告,希望是正确的。再次感谢。
<?php

$servername = "localhost";
$dBUsername = "root";
$dBPassword = "";
$dBName = "loginsystem";

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); //error reporting
$conn = mysqli_connect($servername, $dBUsername, $dBPassword, $dBName);

session_start();    
$sql = "UPDATE users SET card1 =? WHERE idUsers =?";
$stmt = $conn->prepare($sql);

$c = '1';
$i = $_SESSION['userId'];

$stmt->bind_param("ii", $c, $i); //bind variables
$stmt->execute(); //execute prepared statement


$stmt->close();
$conn->close();
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class cardUnlocker : MonoBehaviour
{
    string unlockCardURL = "http://localhost/phpstuff/includes/unlockcard.inc.php";

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(PostRequest(unlockCardURL));
    }

    // Update is called once per frame
    void Update()
    {

    }

    IEnumerator PostRequest(string url)
    {
        WWWForm form = new WWWForm();
        UnityWebRequest uwr = UnityWebRequest.Post(unlockCardURL, form);
        yield return uwr.SendWebRequest();

        if (uwr.isNetworkError)
        {
            Debug.Log("Error while sending: " + uwr.error);
        }
        else
        {
            Debug.Log("Received: " + uwr.downloadHandler.text);
        }
    }
}