Vänligen bortse från alla säkerhetsrisker med detta tillvägagångssätt
Gör inte så här . Det spelar ingen roll om säkerheten kommer före eller efter. Du kommer att sluta skriva om hela koden eftersom lösenordet är hårdkodad i din applikation som kan dekompileras och hämtas enkelt . Gör anslutningen på rätt sätt nu så att du inte behöver skriva om hela applikationen.
Kör ditt databaskommando på din server med php, perl eller vilket språk du är bekväm med men detta bör göras på servern.
Från Unity, använd WWW
eller UnityWebRequest
klass för att kommunicera med det skriptet och sedan kommer du att kunna skicka och ta emot information från Unity till servern. Det finns många exempel där ute. Även med detta behöver du fortfarande implementera din egen säkerhet, men detta är mycket bättre än vad du har nu.
Du kan också ta emot flera data med json.
Nedan är ett komplett exempel från denna Unity-wiki. Den visar hur man interagerar med en databas i Unity med php på serversidan och Unity + C# på klientsidan.
Serversidan :
Lägg till poäng med PDO :
<?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>';
}
}
?>
Hämta poäng med PDO :
<?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";
}
}
?>
Aktivera policy för flera domäner på servern :
Den här filen ska heta "crossdomain.xml" och placeras i roten på din webbserver. Unity kräver att webbplatser som du vill komma åt via en WWW-förfrågan har en policy för flera domäner.
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Kund/enhetssida :
Klientkoden från Unity ansluter till servern, interagerar med PDO och lägger till eller hämtar poäng beroende på vilken funktion som anropas. Den här klientkoden är något modifierad för att kompilera med den senaste Unity-versionen.
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');
}
Detta är bara ett exempel på hur man gör detta på rätt sätt. Om du behöver implementera sessionsfunktionen och bryr dig om säkerhet, titta på OAuth 2.0 protokoll. Det bör finnas befintliga bibliotek som hjälper dig att komma igång med OAuth protokoll.