Sie sind auf Seite 1von 13

Scurit des applications web

GUINKO Tonguim Ferdinand

7 dcembre 2011

Table des matires


1 Flux syndiqus : rappels 1.1 Cration dune application de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 1.1.2 1.2 1.2.1 1.2.2 1.3 1.3.1 1.3.2 1.3.3 1.4 1.4.1 1.4.2 1.4.3 1.5 1.5.1 Cration du descripteur de lapplication : web.xml . . . . . . . . . . . . . . . Cration de la classe HomeServlet . . . . . . . . . . . . . . . . . . . . . . . . Cration du chier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 4 4 5 6 6 8 8 9 9

Cration dune vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


home.jsp

Modication de la classe

HomeServlet

Cration dune application de syndication de ux . . . . . . . . . . . . . . . . . . . . Modication de la servlet Modication de la page Cration du projet
HomeServlet

home.jsp

. . . . . . . . . . . . . . . . . . . . . . . . . .

publisher

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Creation dune application de publication de nouvelles . . . . . . . . . . . . . . . . . Cration dune base de donnes de nouvelles . . . . . . . . . . . . . . . . . . . Cration du chier
Ant build

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Excution des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Cration dune servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Gnration dynamique de ux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Chapitre 1

Flux syndiqus : rappels


Cours inspir du livre Java Web Programming with Eclipse, de David Turner et Jinseok Chae.

1.1
1.1.1

Cration dune application de base


Cration du descripteur de lapplication : web.xml

Ce descripteur web.xml : 1. dnit une servlet nomme home et indique au container web que ce servlet doit tre une instance de la classe package.HomeServlet ; 2. indique au container web que toute requte entrante lintention de home doit tre traite par linstance de nom home.
<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>home</servlet-name> <servlet-class>website.web.HomeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>home</servlet-name> <url-pattern>/home</url-pattern> </servlet-mapping> </web-app>

1.1.2

Cration de la classe HomeServlet


HomeServlet

Crez une servlet dans le package website.web.


methods

hrite de

javax.servlet.http.HttpServlet.

Insrez la mthode DoGet() : pour cela, allez dans le menu source dclipse puis cliquez sur Override/Implements Remplacez le corps de la mthode
PrintWriter writer = resp.getWriter(); writer.println("<h1>Bonjour les amis!</h1>"); doGet

par le code suivant :

Voici le code complet de la classe


package website.web; import import import import import import java.io.IOException; java.io.PrintWriter; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

HomeServlet :

public class HomeServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.println("<h1>Bonjour les amis!</h1>"); } }

1.2
1.2.1

Cration dune vue


Cration du chier
home.jsp home.jsp

Crez la page

contenant le code suivant :

<jsp:useBean id="message" scope="request" class="java.lang.String" /> <html> <head> <title>Site web de Ferdinand</title> </head> <body> <h1>Page daccueil</h1> <p> <%=message%> </p> </body> </html>

La premire ligne est un lment de type useBean. Le useBean gnrera un code qui tentera de localiser une instance dune classe Java (un bean) portant le nom message dans un objet nomm request scope. En 4

dautres termes, le useBean tentera de trouver la valeur associe lobjet message dans lobjet HttpServletRequest cre par le container web pour la gestion de la requte courante. Si le useBean ne trouve pas la cl message elle crera alors une instance de java.lang.String en faisant appel son constructeur sans argument (confre la dnition dun bean ). Modiez le chier la classe HomeServlet an quelle gnre une chane de caractres qui sera porte par lobjet requte HttpServletRequest et passe au chier home.jsp

1.2.2

Modication de la classe

HomeServlet

HomeServlet doit donc tre modie an de transmettre le traitement des requtes home.jsp. Pour cela, une seule instance de RequestDispatcher est ncessaire et sera cre dans la mthode Init() de la servlet HomeServlet. En rappel, la mthode Init() dune servlet est celle qui est invoque lorsque le container charge la servlet pour la premire fois.

private RequestDispatcher homeJsp;

La valeur de

homeJSP

sera xe dans la mthode init() de la servlet.


init(ServletCong) : source

Insrez la mthode

pour cela :
Override/Implements methods

1. allez dans le menu 2. droulez longlet

dclipse puis cliquez sur

GenericServlet

La mthode de home.jsp.

Init()

sera utilise pour crer une instance de

RequestDispatcher

qui se chargera de lexcution

Pour cela, remplacez le corps de la mthode


ServletContext context = config.getServletContext(); homeJsp = context.getRequestDispatcher("/WEB-INF/home.jsp");

Init()

par le code suivant :

Ensuite, remplacez le contenu de la mthode


req.setAttribute("message", "Aurevoir!"); homeJsp.forward(req, resp);

doGet()

par les lignes suivantes :

Le contenu de la classe
package website.web; import java.io.IOException; import java.io.PrintWriter; import import import import import import

HomeServlet

doit ressembler ceci :

javax.servlet.ServletConfig; javax.servlet.ServletContext; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

import javax.servlet.RequestDispatcher;

@SuppressWarnings("serial") public class HomeServlet extends HttpServlet { private RequestDispatcher homeJsp; @Override public void init(ServletConfig config) throws ServletException { ServletContext context = config.getServletContext(); homeJsp = context.getRequestDispatcher("/WEB-INF/home.jsp"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setAttribute("message", "Aurevoir!"); homeJsp.forward(req, resp); } }

1.3

Cration dune application de syndication de ux

Tlchargez les librairies suivantes : 1. ROME 1.0 jar le http://java.net/projects/rome/sources/svn/content/tags/rome-1_ 0_0/www/dist/rome-1.0.jar?rev=840 2. JDOM http://www.jdom.org/ : une librairie permetant la manipulation de documents XML ; 3. purl-org-content-0.3.jar : une librairie permettant de dcomposer une URL pour par exemple en extraire un lment ;

1.3.1

Modication de la servlet

HomeServlet

Modiez la servlet HomeServlet de telle sorte quelle puisse trouver une source de ux syndiqus et rendre son contenu accessible la page JSP. Replacez le corps de la mthode
doGet()

par le code suivant :

URL url = new URL("http://rss.news.yahoo.com/rss/tech"); SyndFeedInput syndFeedInput = new SyndFeedInput(); SyndFeed syndFeed = null; XmlReader xmlReader = new XmlReader(url); syndFeed = syndFeedInput.build(xmlReader); req.setAttribute("syndFeed", syndFeed); homeJsp.forward(req, resp);

Importez les librairies suivantes dans la classe


import import import import java.net.URL; com.sun.syndication.feed.synd.SyndFeed; com.sun.syndication.io.SyndFeedInput; com.sun.syndication.io.XmlReader;

HomeServlet :

Pour corriger la dernire erreur de compilation cause par linstruction suivante :


syndFeed = syndFeedInput.build(xmlReader);

procdez de la manire suivante : 1. slectionnez linstruction entire ; 2. allez dans le menu


source

dclipse puis cliquez sur

Surround with

puis slectionnez

Try/catch block.

Deux gestionnaires derreurs seront gnrs : 1. lun pour grer une erreur de type
IllegalArgumentException FeedException.

2. lautre pour grer une erreur de type Le code de la classe


package website.web; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; import import import import import import javax.servlet.ServletConfig; javax.servlet.ServletContext; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; HomeServlet

doit ressembler ceci :

import javax.servlet.RequestDispatcher; import import import import com.sun.syndication.feed.synd.SyndFeed; com.sun.syndication.io.FeedException; com.sun.syndication.io.SyndFeedInput; com.sun.syndication.io.XmlReader;

@SuppressWarnings("serial") public class HomeServlet extends HttpServlet { private RequestDispatcher homeJsp; @Override public void init(ServletConfig config) throws ServletException { ServletContext context = config.getServletContext(); homeJsp = context.getRequestDispatcher("/WEB-INF/home.jsp"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { URL url = new URL("http://rss.radio-canada.ca/fils/nouvelles/nouvelles.xml"); SyndFeedInput syndFeedInput = new SyndFeedInput(); SyndFeed syndFeed = null; XmlReader xmlReader = new XmlReader(url); try { syndFeed = syndFeedInput.build(xmlReader); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block

e.printStackTrace(); } catch (FeedException e) { // TODO Auto-generated catch block e.printStackTrace(); } req.setAttribute("syndFeed", syndFeed); homeJsp.forward(req, resp); } }

Testez lapplication en saisissant le lien suivant dans la barre dadresse de votre navigateur : http: //localhost:8080/SecuriteAppWeb/home

1.3.2

Modication de la page

home.jsp

Il sagit de construire la page qui envoie le contenu au navigateur.


<%@ page import="com.sun.syndication.feed.synd.SyndFeed" %> <%@ page import="com.sun.syndication.feed.synd.SyndEntry" %> <%@ page import="java.util.Iterator" %> <jsp:useBean id="syndFeed" scope="request" type="SyndFeed" /> <html> <head> <title>website</title> </head> <body> <h1>Flux syndiqus</h1> <h2><%=syndFeed.getTitle()%></h2> <ul> <% Iterator it = syndFeed.getEntries().iterator(); while (it.hasNext()) { SyndEntry entry = (SyndEntry) it.next(); %> <li> <a href="<%=entry.getLink()%>"><%=entry.getTitle()%></a> </li> <% } %> </ul> </body> </html>

1.3.3

Cration du projet

publisher

Crez un projet dapplication web. Nommez le Voici le contenu du chier


web.xml

publisher.

de ce projet :

<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> </web-app>

Crez un chier nomm

nouvelles.rss

dans le repertoire

WebContent.

Voici le contenu du chier

nouvelles.rss :

<rss version="2.0"> <channel> <title>Mes informations</title> <description>Ceci est mon site web personnel</description> <language>fr-ca</language> <item>

<title>Site web de GUINKO T. Ferdinand</title> <link>http://tonguim.free.fr/</link> <description>Vous tes ici sur le site web de GUINKO T. Ferdinand.</description> </item> <item> <title>Autre site web utile</title> <link>http://cse.csusb.edu/</link> <description>Ce site web est aussi trs intressant.</description> </item> </channel> </rss>

Dployez lapplication

publisher

et visualisez la lURL

http ://localhost :8080/publisher/nouvelles.rss.

Ensuite mettez jour le contenu de la classe HomeServlet du projet SecuriteAppWeb en remplaant lURL qui sy trouve par celle-ci http ://localhost :8080/publisher/nouvelles.rss puis excutez, puis visualisez lapplication
SecuriteAppWeb.

1.4
1.4.1

Creation dune application de publication de nouvelles


Cration dune base de donnes de nouvelles

create table news_item ( id integer primary key, titre text not null, url text not null ); create table sequence ( next_value integer ); insert into sequence value (1000);

La dernire instruction insert une ligne dans la table sequence. Le nombre insr dans cette table est la valeur initiale de dpart de lincrmentation de la cl primaire de la table news_item. MySQL est muni dune fonctionalit permettant de grer automatiquement lincrmentation dune cl primaire ; mais cette fonctionalit ne fait pas partie de la syntaxe normalise du langage SQL, et de plus tous les SGBD tel que PostGreSQL ne sont pas munis dune telle fonctionalit, do lintrt ici de proposer une structure gnrique supporte par tous les SGBD. Crez, la racine du projet
publisher

un repertoire nomm un script

database

Crez, lintrieur du repertoire

database,

insertdb.sql

avec le contenu suivant :

insert into news_item (id, title, url) values (1, CNN, http://www.cnn.com/); insert into news_item (id, title, url) values (2, FOX News, http://www.foxnews.com/);

Crez, lintrieur du repertoire


drop table if exists news_item; drop table if exists sequence;

database,

un script

cleandb.sql

avec le contenu suivant :

1.4.2

Cration du chier

Ant build

Crez, lintrieur du repertoire contenu suivant :


<?xml version="1.0" encoding="UTF-8"?>

database,

un chier nomm

build.xml

Le chier

build.xml

doit avoir le

<project name="publisher" default="all" basedir="."> <property name="mysql.params" value="-u publisher -ppublisher -D publisher" /> <target name="all" depends="cleandb, createdb, insertdb"></target> <target name="cleandb"> <exec executable="mysql" input="cleandb.sql"> <arg line="${mysql.params}" /> </exec> </target> <target name="createdb"> <exec executable="mysql" input="createdb.sql"> <arg line="${mysql.params}" /> </exec> </target> <target name="insertdb"> <exec executable="mysql" input="insertdb.sql"> <arg line="${mysql.params}" /> </exec> </target> </project>

1.4.3

Excution des scripts

1. Faites un clique droit sur le chier build.xml, puis slectionnez Run As puis Ant Build ... Choisissez bien Ant Build ... avec les 3 points de suspension ; 2. Dcochez la case cocherall [default] (voir gure 1.4.3) 3. Cochez les case cocher
createdb

et

insertdb

dans cet ordre

4. Vriez, dans la zone de saisie intitule Target Execution Order, que les 2 scripts sont cits dans lordre suivant : createdb et insertdb 5. Cliquez sur
Run

10

Figure 1.1 Construction dune application laide de Ant

1.5
1.5.1

Gnration dynamique de ux
Cration dune servlet
publisher.web,

Crez, dans le package

la servlet

NewsFeedServlet

qui hrite de la super classe

HttpServlet,

Voici quoi doit ressembler le contenu de la classe


public void init(ServletConfig config) throws ServletException { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e){ throw new ServletException(e); } }

NewsFeedServlet

11

Voici le code complet de la classe


package publisher.web; import java.io.IOException; import java.io.Writer; import import import import import import import import import import import import import import import import import import import javax.servlet.ServletConfig; javax.servlet.ServletException; javax.servlet.annotation.WebServlet; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

NewsFeedServlet

com.sun.syndication.feed.synd.SyndEntry; com.sun.syndication.feed.synd.SyndEntryImpl; com.sun.syndication.feed.synd.SyndFeed; com.sun.syndication.feed.synd.SyndFeedImpl; com.sun.syndication.io.FeedException; com.sun.syndication.io.SyndFeedOutput; java.sql.DriverManager; java.sql.ResultSet; java.sql.SQLException; java.sql.Statement; java.sql.Connection; java.util.ArrayList; java.util.List;

/** * Servlet implementation class NewsFeedServlet */ @WebServlet("/NewsFeedServlet") public class NewsFeedServlet extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new ServletException(e); } } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0"); feed.setTitle("Mes nouvelles"); feed.setLink("http://localhost:8080/publisher/"); feed.setDescription("Ce flux dinformation a t cr en utilisant ROME."); List<SyndEntry> entries = new ArrayList<SyndEntry>(); try { Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost/publisher", "publisher", "publisher"); Statement statement = connection.createStatement(); ResultSet resultSet = statement .executeQuery("select * from news_item;"); while (resultSet.next()) { String title = resultSet.getString("title"); String url = resultSet.getString("url"); SyndEntry entry = new SyndEntryImpl(); entry.setTitle(title); entry.setLink(url); entries.add(entry); } connection.close(); } catch (SQLException e) { throw new ServletException(e); } resp.setContentType("text/xml"); feed.setEntries(entries); Writer writer = resp.getWriter(); SyndFeedOutput output = new SyndFeedOutput(); try { output.output(feed, writer); } catch (FeedException e) { throw new ServletException(e); } } }

12

Linstruction ResultSet contient le rsultat de la commande executeQuery. Pour chaque ligne de linstruction ResultSet, une ligne de ux syndiqu est forme et ajoute lobjet instruction SyndFeed travers le code suivant :
<rss> <channel> <title></title> <item> <title></title> <link></link> </item> <item> : : </channel> </rss>

Enn, modiez le chier

web.xml

de lapplication

publisher

ainsi quil suit :

<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>news-feed</servlet-name> <servlet-class>publisher.web.NewsFeedServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>news-feed</servlet-name> <url-pattern>/news.rss</url-pattern> </servlet-mapping> </web-app>

Testez successivement les 2 URL suivantes : 1. http ://localhost :8080/publisher/news.rss 2. http ://localhost :8080/SecuriteAppWeb/home

13

Das könnte Ihnen auch gefallen