Bitte ignorieren Sie bei dieser Vorgehensweise jegliche Sicherheitsrisiken
Mach es nicht so . Es spielt keine Rolle, ob die Sicherheit vorher oder nachher kommt. Sie müssen den gesamten Code wegen des Passworts neu schreiben ist in Ihrer Anwendung fest codiert und kann einfach dekompiliert und abgerufen werden . Stellen Sie die Verbindung jetzt richtig her, damit Sie nicht die gesamte Anwendung neu schreiben müssen.
Führen Sie Ihren Datenbankbefehl auf Ihrem Server mit PHP, Perl oder einer beliebigen Sprache aus, mit der Sie vertraut sind, aber dies sollte auf dem Server erfolgen.
Verwenden Sie in Unity den WWW
oder UnityWebRequest
Klasse, um mit diesem Skript zu kommunizieren, und dann können Sie Informationen von Unity an den Server senden und empfangen. Es gibt viele Beispiele da draußen. Selbst damit müssen Sie immer noch Ihre eigene Sicherheit implementieren, aber das ist viel besser als das, was Sie jetzt haben.
Sie können Daten auch mehrfach mit json empfangen.
Nachfolgend finden Sie ein vollständiges Beispiel aus diesem Unity-Wiki. Es zeigt, wie man mit einer Datenbank in Unity mit PHP auf der Serverseite und Unity + C# auf der Clientseite interagiert.
Serverseite :
Score mit PDO hinzufügen :
<?php
// Configuration
$hostname = 'localhot';
$username = 'yourusername';
$password = 'yourpassword';
$database = 'yourdatabase';
$secretKey = "mySecretKey"; // Change this value to match the value stored in the client javascript below
try {
$dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);
} catch(PDOException $e) {
echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';
}
$realHash = md5($_GET['name'] . $_GET['score'] . $secretKey);
if($realHash == $hash) {
$sth = $dbh->prepare('INSERT INTO scores VALUES (null, :name, :score)');
try {
$sth->execute($_GET);
} catch(Exception $e) {
echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';
}
}
?>
Punktzahl mit PDO abrufen :
<?php
// Configuration
$hostname = 'localhost';
$username = 'yourusername';
$password = 'yourpassword';
$database = 'yourdatabase';
try {
$dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);
} catch(PDOException $e) {
echo '<h1>An error has occurred.</h1><pre>', $e->getMessage() ,'</pre>';
}
$sth = $dbh->query('SELECT * FROM scores ORDER BY score DESC LIMIT 5');
$sth->setFetchMode(PDO::FETCH_ASSOC);
$result = $sth->fetchAll();
if(count($result) > 0) {
foreach($result as $r) {
echo $r['name'], "\t", $r['score'], "\n";
}
}
?>
Domänenübergreifende Richtlinie auf dem Server aktivieren :
Diese Datei sollte "crossdomain.xml" heißen und im Stammverzeichnis Ihres Webservers abgelegt werden. Unity erfordert, dass Websites, auf die Sie über eine WWW-Anfrage zugreifen möchten, eine domänenübergreifende Richtlinie haben.
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Client-/Unity-Seite :
Der Client-Code von Unity stellt eine Verbindung zum Server her, interagiert mit PDO und fügt Punkte hinzu oder ruft sie ab, je nachdem, welche Funktion aufgerufen wird. Dieser Client-Code wurde leicht modifiziert, um mit der neuesten Unity-Version zu kompilieren.
private string secretKey = "mySecretKey"; // Edit this value and make sure it's the same as the one stored on the server
public string addScoreURL = "http://localhost/unity_test/addscore.php?"; //be sure to add a ? to your url
public string highscoreURL = "http://localhost/unity_test/display.php";
//Text to display the result on
public Text statusText;
void Start()
{
StartCoroutine(GetScores());
}
// remember to use StartCoroutine when calling this function!
IEnumerator PostScores(string name, int score)
{
//This connects to a server side php script that will add the name and score to a MySQL DB.
// Supply it with a string representing the players name and the players score.
string hash = Md5Sum(name + score + secretKey);
string post_url = addScoreURL + "name=" + WWW.EscapeURL(name) + "&score=" + score + "&hash=" + hash;
// Post the URL to the site and create a download object to get the result.
WWW hs_post = new WWW(post_url);
yield return hs_post; // Wait until the download is done
if (hs_post.error != null)
{
print("There was an error posting the high score: " + hs_post.error);
}
}
// Get the scores from the MySQL DB to display in a GUIText.
// remember to use StartCoroutine when calling this function!
IEnumerator GetScores()
{
statusText.text = "Loading Scores";
WWW hs_get = new WWW(highscoreURL);
yield return hs_get;
if (hs_get.error != null)
{
print("There was an error getting the high score: " + hs_get.error);
}
else
{
statusText.text = hs_get.text; // this is a GUIText that will display the scores in game.
}
}
public string Md5Sum(string strToEncrypt)
{
System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
byte[] bytes = ue.GetBytes(strToEncrypt);
// encrypt bytes
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hashBytes = md5.ComputeHash(bytes);
// Convert the encrypted bytes back to a string (base 16)
string hashString = "";
for (int i = 0; i < hashBytes.Length; i++)
{
hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
}
return hashString.PadLeft(32, '0');
}
Dies ist nur ein Beispiel dafür, wie man dies richtig macht. Wenn Sie Sitzungsfunktionen implementieren müssen und Wert auf Sicherheit legen, sehen Sie sich OAuth 2.0 an Protokoll. Es sollte vorhandene Bibliotheken geben, die den Einstieg in OAuth erleichtern Protokoll.