Hello,
j ai un tp avec plusieurs exercice par rapport aux attaques de securite en JAVA,
Parmis ceux la, il y en a un qui m embête beaucoup,
Voici 3 classes
Code :
- package core;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.ObjectOutputStream;
- import java.io.PipedOutputStream;
- public class Execice1 implements Runnable{
-
- public void run(){
- Voiture v= new Voiture();
- //le joueur joue et essaie d'acélérer autant qu'il peut.
- v.accelerer(17);
- //envoyer sa voiture au serveur.
- PipedOutputStream pipedOut;
- try {
- pipedOut = new PipedOutputStream(Jeu.pipedIn);
- Jeu.pipedOut=pipedOut;
- //cré l'objet sérialisé
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos2 = new ObjectOutputStream( baos );
- oos2.writeObject(v); //<-crée l'Objet serialisé
- oos2.close();
-
- //to byteArray (pas nécéssaire mais plus facile à manipuler)
- byte[] yourBytes = baos.toByteArray();
-
-
- pipedOut.write(yourBytes);//envoie l'Objet serializé dans le pipe
- pipedOut.close();
-
-
-
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
- //pourrait etre utile pour tester
- private static void printByteArray(byte[] byteArray)
- {
- for(int i=0;i<byteArray.length;i++)
- System.out.print(String.format("%02X ", byteArray[i]));
- }
- }
|
Code :
- package core;
- import java.io.ByteArrayInputStream;
- import java.io.ObjectInputStream;
- import java.io.PipedInputStream;
- import java.io.PipedOutputStream;
- import java.util.Arrays;
- import java.util.List;
- public class Jeu {
- static PipedOutputStream pipedOut = new PipedOutputStream();
- static PipedInputStream pipedIn = new PipedInputStream();
- public static void main(String [ ] args) {
- //run le joueur
- //pour l'exercice 1:
- new Thread(new Execice1()).start();
- //pour l'exercice 2 et l'exercice 3. commenter la ligne précédente et décommenter la ligne suivante
- //new Thread(new Execice2()).start();
- byte[] ByteArray=new byte[350];
- try {
- Thread.sleep(400);
- int i=0,c=0;
- while((i=pipedIn.read())!=-1){
- //System.out.print((char)i);
- ByteArray[c]=(byte) i;
- c++;
- }
- pipedIn.close();
-
- ByteArrayInputStream in = new ByteArrayInputStream(ByteArray);
- ObjectInputStream is = new ObjectInputStream(in);
- Voiture voitureDuJoueur = (Voiture) is.readObject();
- if (voitureDuJoueur!=null)
- {
- if(voitureDuJoueur.record())
- System.out.println("c'est un record" );//vous devez faire executer cette ligne, sans modifier la classe courrante ou la classe Voiture
- }
- }
- catch(Exception e){
- System.out.println(e);
- }
- }
- }
|
Code :
- package core;
- public final class Voiture implements java.io.Serializable {
- private static final long serialVersionUID = 1L;
- private int vitesse;
- Voiture()
- {
- vitesse=0;
- }
- public void accelerer(int v)
- {
- if(vitesse + v> 20)
- crach();
- else
- vitesse = vitesse+v;
- }
- private void crach()
- {
- vitesse=0;
- }
- public boolean record()
- {
- return (vitesse>20);
- }
- public int getVitesse()
- {
- return vitesse;
- }
- }
|
Le but de l exercice est de faire en sorte que :
À la fin de la partie, l’objet voiture est sérialisé et envoyé au serveur (jeu.java). Ce dernier vérifie si la vitesse atteinte dépasse 20 km/h. Si oui, la ligne « c'est un record» est affiché à l’cran.
Votre première objectif est de faire afficher cette ligne dans la console d’exécution sans modifier les classes jeu.java ou Voiture.java d’aucune façon (puisque vous supposer qu’elles sont exécuté sur le serveur). Vous devez simplement modifier l’objet sérialisé pour qu’il contienne une valeur « impossible », puis envoyer cet objet au serveur.
Ce que j ai compris :
Code :
- Voiture v= new Voiture();
- //le joueur joue et essaie d'acélérer autant qu'il peut.
- v.accelerer(17);
- //envoyer sa voiture au serveur.
- PipedOutputStream pipedOut;
- try {
- pipedOut = new PipedOutputStream(Jeu.pipedIn);
- Jeu.pipedOut=pipedOut;
- //cré l'objet sérialisé
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos2 = new ObjectOutputStream( baos );
- oos2.writeObject(v); //<-crée l'Objet serialisé
- oos2.close();
-
- //to byteArray (pas nécéssaire mais plus facile à manipuler)
- byte[] yourBytes = baos.toByteArray();
|
Sur la ligne 3, je dois changer la valeur que contient mon objet voiture qui est serialisé par la suite de manière a ce que dans jeu.java vitesse+v soit inferieur a 20 pour pas faire appel a la fonction crash()
Mais que "v" seulement soit superieur a 20 pour que le record s affiche. Sauf que je ne dois effectuer des modifications uniquement dans la classe exercice 1.
Je n ai aucun setVitesse dans la classe voiture pour modifier la valeur de vitesse qui est initalisé a 0.
J ai pensé pouvoir jouer avec les bornes min et max d un int "-32 767" lorsque v+vitesse sont associés, puis passer en valeur positive une fois que vitesse serait enlever. Mais je me retrouve encore dans une impasse car mon iterateur vitesse=0. Et si je ne dis pas de betise je n effectue la boucle qu une seule fois.
Si vous avez une idee de la resolution du probleme je serais ravis
cldt