Negeer eventuele veiligheidsrisico's met deze aanpak
Doe het niet zo . Het maakt niet uit of de beveiliging ervoor of erna komt. U zult stoppen met het herschrijven van de hele code omdat het wachtwoord is hard gecodeerd in uw applicatie en kan gemakkelijk worden gedecompileerd en opgehaald . Voer de verbinding nu op de juiste manier uit, zodat u niet de hele toepassing hoeft te herschrijven.
Voer uw databaseopdracht uit op uw server met php, perl of welke taal u ook prettig vindt, maar dit moet op de server worden gedaan.
Gebruik vanuit Unity de WWW
of UnityWebRequest
class om met dat script te communiceren en dan kun je informatie van Unity naar de server verzenden en ontvangen. Er zijn veel voorbeelden die er zijn. Zelfs hiermee moet je nog steeds je eigen beveiliging implementeren, maar dit is veel beter dan wat je nu hebt.
U kunt met json ook meerdere gegevens ontvangen.
Hieronder staat een compleet voorbeeld van deze Unity-wiki. Het laat zien hoe u kunt communiceren met een database in Unity met behulp van php aan de serverzijde en Unity + C# aan de clientzijde.
Serverzijde :
Score toevoegen met 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>';
}
}
?>
Score ophalen met 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";
}
}
?>
Schakel domeinoverschrijdend beleid in op de server :
Dit bestand moet de naam "crossdomain.xml" hebben en in de hoofdmap van uw webserver worden geplaatst. Unity vereist dat websites die u wilt openen via een WWW-verzoek een domeinoverschrijdend beleid hebben.
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Klant/eenheidszijde :
De clientcode van Unity maakt verbinding met de server, communiceert met PDO en voegt een score toe of haalt deze op, afhankelijk van welke functie wordt aangeroepen. Deze klantcode is enigszins aangepast om te compileren met de nieuwste Unity-versie.
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');
}
Dit is slechts een voorbeeld van hoe u dit op de juiste manier kunt doen. Als u de sessiefunctie moet implementeren en u zich zorgen maakt over beveiliging, kijk dan in de OAuth 2.0 protocol. Er moeten bestaande bibliotheken zijn die u kunnen helpen aan de slag te gaan met de OAuth protocol.