Unity WebGL PHP数据库操作
我正试图让一个WebGL unity游戏更新一个MySQL数据库,基本上,我想这样做,当一个用户登录到网站并击败unity游戏时,他们会解锁网站上个人资料上的徽章 因此,我编写了一个PHP脚本来更新数据库以解锁徽章,然后我为unity游戏编写了一个C#脚本来向PHP脚本发送post请求。这个解决方案的问题是,任何像postman这样的外部网站都可以发送相同的帖子请求,玩家不需要真正击败游戏来解锁徽章 然后我想也许我应该把数据库凭据放在C#脚本中,然后直接从那里编辑数据库,但我在网上读到这是一个安全问题,因为玩家可以反编译游戏并将登录凭据获取到数据库 所以我做了一些研究,认为也许我的解决方案是PHP页面上的CSRF,然后也许我可以将令牌传递给unity游戏?我能够让PHP与添加到其中的CSRF一起工作,但是我不知道如何让unity游戏能够发送带有令牌的post请求来解锁站点上的徽章 让unity游戏直接编辑数据库会不会是一个安全问题?任何关于如何解决这个问题的建议都将不胜感激,下面我已经发布了相关的文件,如果有帮助的话,但我认为这更多的是一个概念性的问题 unlockcard2.phpUnity WebGL PHP数据库操作,php,mysql,unity3d,Php,Mysql,Unity3d,我正试图让一个WebGL unity游戏更新一个MySQL数据库,基本上,我想这样做,当一个用户登录到网站并击败unity游戏时,他们会解锁网站上个人资料上的徽章 因此,我编写了一个PHP脚本来更新数据库以解锁徽章,然后我为unity游戏编写了一个C#脚本来向PHP脚本发送post请求。这个解决方案的问题是,任何像postman这样的外部网站都可以发送相同的帖子请求,玩家不需要真正击败游戏来解锁徽章 然后我想也许我应该把数据库凭据放在C#脚本中,然后直接从那里编辑数据库,但我在网上读到这是一个安
<?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);
}
}
}