2017-03-04 3 views
0

J'ai mis en application l'achat de vérification de réception conformément aux recommandations d'Apple en envoyant le reçu à mon serveur qui à son tour, il envoie aux serveurs d'Apple pour la vérification. Tout mon traitement de réception est géré côté serveur et cela fonctionne parfaitement. Mon serveur renvoie un code très obscur à mon application pour confirmer si l'achat est valide ou non. J'utilise une méthode d'obfuscation assez robuste du côté de l'application pour dissimuler ce qui se passe avec ce code de retour afin de rendre la tâche la plus difficile possible pour les pirates informatiques jaloux de la vaincre. Le problème est que j'ai mes fichiers php stockés dans un dossier protégé par mot de passe sur mon serveur web, et je suis préoccupé par la façon dont cela peut être considéré comme sécurisé lorsque l'application a le nom d'utilisateur et le mot de passe pour ce répertoire pour envoyer le reçu au fichier php pour commencer.Les problèmes de sécurité l'envoi de nom d'utilisateur et mot de passe au serveur via https depuis iOS app

Mon application utilise uniquement le serveur pour l'authentification de réception des achats d'applications. Toutes les autres fonctionnalités sont dans l'application elle-même, donc je ne force pas chaque utilisateur à avoir un compte avec un nom d'utilisateur et un mot de passe uniques. J'utilise URLSession pour communiquer avec le serveur via une connexion TLS 1.2 https afin que la partie soit sécurisée, mais je ne peux pas penser à un moyen d'empêcher un pirate déterminé d'extraire potentiellement le nom d'utilisateur et le mot de passe de l'application sur leur appareil, et avoir accès à mon dossier de serveur directement. Quelqu'un avec cette capacité pourrait tout aussi bien modifier le fichier php pour toujours retourner un code indiquant un achat valide. Je cache le nom d'utilisateur et le mot de passe dans l'application au point que je pense que la plupart des gens abandonneraient probablement en essayant de le comprendre, mais je sais que je l'ai seulement rendu plus difficile à extraire, pas impossible .

Des commentaires à ce sujet? À peu près tout ce que j'ai trouvé en ligne concernant cela a été préoccupé de ne pas transmettre un nom d'utilisateur et mot de passe via http, pas le plus gros problème d'un appareil jailbreaké.

+0

Pourquoi avez-vous inclus un nom d'utilisateur et un mot de passe dans votre application? Utilisez simplement un jeton généré aléatoirement qui est vérifié par exemple. par le script PHP côté serveur et cela n'est utile que pour cette API spécifique. – Robert

+0

Robert Je suis assez nouveau pour interagir avec un serveur depuis une application iOS. Le répertoire du serveur est protégé par mot de passe à l'aide d'un fichier .htaccess. J'utilise l'authentification de base avec NSURLSession pour accéder au fichier .php. Je suppose que la question que je pose est de savoir comment accorder l'accès à ce répertoire protégé sans un mot de passe codé en dur et un nom d'utilisateur. – Scooter

+0

N'utilisez pas l'authentification de base, utilisez simplement un paramètre HTTP get et vérifiez que dans le script PHP côté serveur. Bien sûr, vous devez apprendre un peu de PHP pour ça. Encore une fois: JAMAIS JAMAIS EMBARQUÉS CREDENTIALS WEBSERVER QUI PERMETTENT L'ACCÈS DIRECT AUX FICHIERS DANS UNE APPLICATION! – Robert

Répondre

0

Vous imaginez un pirate renverser votre binaire obscurcie pour essayer d'obtenir le nom d'utilisateur et mot de passe. C'est la façon difficile de le faire. La méthode la plus simple consiste à inspecter le trafic réseau.

Oui, le TLS peut facilement contourné par le propriétaire du périphérique même sans le débloquer. TLS protège contre les attaquants externes, mais ne protège pas contre quelque chose qui veut inspecter son propre trafic réseau. C'est très facile à faire, voir par exemple instructions on my blog where I beat a very popular iOS game.

Si vous voulez arrêter cette attaque plus facile, vous pouvez essayer de mettre en œuvre certificate pinning. Cela peut encore être cassé facilement sur un appareil jailbreaké, mais vous dissuaderez beaucoup de hackers occasionnels qui ne voudront pas jailbreaker leur appareil.

A la fin de la journée, vous avez raison qu'un pirate déterminé va gagner contre cette conception de type.

+0

Merci pour la réponse réfléchie.Je vais en effet me pencher sur l'épinglage des certificats, mais le plus drôle c'est que plus je creuse dans ce dossier, plus je me sens vulnérable. J'ai probablement passé plus de temps à essayer de sécuriser l'achat in-app que j'ai passé à écrire l'application! Bien sûr, ce temps n'est pas perdu, car je serai en mesure de revenir sur le reste de mes applications avec cela une fois que je l'ai perfectionné. Merci encore. – Scooter

+0

@Scooter: Vous avez raison. Vous menez une bataille qui peut être plus d'effort que ce que ça vaut. En particulier, la mise en œuvre correcte de l'épinglage de certificat peut être un PITA. Mais j'espère que vous obtenez le message à emporter de mon poste: toute cette obfuscation est inutile s'il y a un moyen beaucoup plus facile pour un attaquant de réussir. Intercepter le trafic réseau comme décrit ci-dessus est à peu près toujours la première chose qu'un attaquant va faire. – TheGreatContini

+0

J'ai compris ce que vous vouliez dire, mais de toute façon, tout est là. C'est vraiment devenu un défi intellectuel plus intéressant pour moi maintenant. Je suis curieux de savoir comment la sécurité au niveau des banques défait cela. Je suppose que forcer les gens à enregistrer un compte sur mon serveur ajouterait un niveau de difficulté pour un pirate. Je dois aussi étudier les jetons et échapper à l'authentification de base du serveur. C'est certainement beaucoup de chat et de souris! – Scooter

0

Donc je pense que j'ai trouvé une solution relativement sûre à ce gâchis. Merci beaucoup aux gens qui ont pris le temps de commenter, car vos contributions ont été utiles. Tout d'abord, même si j'ai beaucoup d'expérience avec le développement d'Obj-C/Swift iOS, le côté serveur est assez nouveau pour moi, mais j'apprends beaucoup plus rapidement. Ce qui peut me sembler un énorme moment d'eureka, semblera assez routinier à un expert REST/Linux/PHP, alors supportez-moi.

Pour résumer le défi: je voulais envoyer une représentation JSON d'un reçu d'achat en application de mon application à un.fichier php sur mon serveur afin qu'il puisse l'envoyer à Apple pour vérification. Pour protéger ce fichier .php, j'ai placé un fichier .htaccess dans son dossier pour exiger un nom d'utilisateur et un mot de passe pour y accéder.

NSURLSession s'est bien occupé de cela, mais m'a demandé de mettre le nom d'utilisateur et mot de passe dans l'application ... pas bon. C'est ce qui a déclenché la conversation d'obfuscation, et je me suis rendu compte qu'il n'y avait aucun moyen de garder le mot de passe en sécurité lors du codage en dur dans l'application. Puis j'ai réalisé que je pouvais garer des fichiers en dehors de mon dossier public_html (mon moment eureka), et c'est ce que j'ai fait. Donc, dans le dossier public_html, qui contient aussi un fichier index.html, j'ai maintenant un fichier .php très simple qui ne fait qu'appeler une fonction dans un autre fichier .php qui fait tout le travail en parlant aux serveurs d'Apple et analyser la réponse. Quand il a fini d'analyser, il retourne un code très obscur (pas les codes bien publicisés qu'Apple retourne) au simple fichier .php qui à son tour renvoie cela à mon application.
En fonction de ce code, l'application décidera si elle accorde ou non l'accès aux biens achetés. En utilisant les autorisations côté serveur, j'ai limité le fichier .php simple dans le répertoire public_html à partir d'un accès en lecture ou en écriture depuis le "monde", le laissant uniquement comme exécutable. Donc, alors qu'un pirate peut rapidement obtenir le nom de ce fichier s'il pirate l'application, il ne devrait pas leur faire du bien. Je n'ai plus besoin d'un nom d'utilisateur ou d'un mot de passe dans l'application, et le fichier .php "principal" qui fait tout le travail dans un dossier situé en dehors du dossier public_html, a ses permissions pour restreindre lecture/écriture/exécution du "monde", et même si je pense que c'est exagéré, je mets un fichier. Htaccess là et nie tout.

Je pense avoir une solution "assez" sécurisée qui devrait rendre la tâche difficile à un hacker occasionnel de voler un achat in-app, mais comme toujours, je suis ouvert à la suggestion au cas où je manquerais quelque chose.