Tomcat'in yakın tarihli bir sürümüyse, sorun yaşamayabilirsiniz. Ancak, bu oturumla ilişkili SSL kimliğini kontrol etmenize bağlıdır. Bu tür
String sslId = (String) req.getAttribute("javax.servlet.request.ssl_session");
olarak (- Servlet 3.0 spec parçası olarak özellikte temel javax.servlet.request.ssl_session
_id
için gelecekte değişebilir unutmayın) kodunu kullanarak mevcuttur.
aşağıdaki doGet
yöntemi ile bir sunucu uygulamasını kurmak:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(true);
String sid = session.getId();
String sslId = (String) request.getAttribute(
"javax.servlet.request.ssl_session");
String uri = request.getRequestURI();
OutputStream out = response.getOutputStream();
PrintWriter pw = new PrintWriter(out);
HashMap<String, Object> secrets;
Object secret = null;
Object notSecret;
Date d = new Date();
notSecret = session.getAttribute("unprotected");
if (notSecret == null) {
notSecret = "unprotected: " + d.getTime();
session.setAttribute("unprotected", notSecret);
}
secrets = (HashMap<String, Object>) session.getAttribute("protected");
if (secrets == null) {
secrets = new HashMap<String, Object>();
session.setAttribute("protected", secrets);
}
if (sslId != null) {
if (secrets.containsKey(sslId))
secret = secrets.get(sslId);
else {
secret = "protected: " + d.getTime();
secrets.put(sslId, secret);
}
}
response.setContentType("text/plain");
pw.println(MessageFormat.format("URI: {0}", new Object[] { uri }));
pw.println(MessageFormat.format("SID: {0}", new Object[] { sid }));
pw.println(MessageFormat.format("SSLID: {0}", new Object[] { sslId }));
pw.println(MessageFormat.format("Info: {0}", new Object[] { notSecret }));
pw.println(MessageFormat.format("Secret: {0}", new Object[] { secret }));
pw.println(MessageFormat.format("Date: {0}", new Object[] { d }));
pw.close();
}
Sonra oturumu çerez almak için, Firefox ve Canlı HTTP Başlıkları uzantısını kullanarak, uygun bir korumasız URL çağrılan. Bu benim
http://localhost:8080/EchoWeb/unprotected
gittiğinizde gönderilen cevap oldu (benim web.xml, sizinki gibi, sadece korur/user/* ve/kişisel/*):
URI: /EchoWeb/unprotected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: null
Info: unprotected: 1254034761932
Secret: null
Date: 27/09/09 07:59
İleri, ben çalıştım beklendiği gibi, korumalı bir URL
http://localhost:8080/EchoWeb/personal/protected
erişebilir ve ben
https://localhost:8443/EchoWeb/personal/protected
yönlendirildi var
ve tepki çerez/oturum kimliği aynı olduğunu
URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0d67549489648e7a3cd9292b671ddb9dd844b9dba682ab3f381b462d1ad1
Info: unprotected: 1254034761932
Secret: protected: 1254034791333
Date: 27/09/09 07:59
Bildirim oldu, ama biz artık yeni bir SSLID var. Şimdi, sunucuyu oturum çerezini kullanarak aldatmaya çalışalım.Özellikle, Python bilmek gerekmez, Şimdi
import urllib2
url = "https://localhost:8443/EchoWeb/personal/protected"
headers = {
'Host': 'localhost:8080',
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-gb,en;q=0.5',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Cookie' : 'JSESSIONID=9ACCD06B69CA365EFD8C10816ADD8D71'
}
req = urllib2.Request(url, None, headers)
response = urllib2.urlopen(req)
print response.read()
- Ben sadece bir (farklı) korumalı bir kaynak için bir HTTP isteği göndermek çalışıyorum:
Ben bir Python komut dosyası, spoof.py
kurmak Çerezde aynı oturum kimliğiyle. İşte yanıtı iki kez benim parodi senaryoyu çalıştırdığınızda var: oturum verileri ilk, korunmasız istekte kuruldu (1254034761932
bir zaman damgası ile bir değer), boyunca gönderildiğini yukarıdaki yanıtlarda
C:\temp>spoof
URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0eafb4ffa30b6579cf189c402a8411294201e2df94b33a48ae7484f22854
Info: unprotected: 1254034761932
Secret: protected: 1254035119303
Date: 27/09/09 08:05
C:\temp>spoof
URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0eb184cb380ce69cce28beb01665724c016903650539d095c671d98f1de3
Info: unprotected: 1254034761932
Secret: protected: 1254035122004
Date: 27/09/09 08:05
Bildirimi Çünkü Tomcat aynı oturumu kullanıyor çünkü oturum kimliği aynı. Bu elbette güvenli değildir. Ancak, SSL kimlik numaraları 'un her seferinde farklı olduğunu ve oturum verilerinizi (örn., Gösterildiği gibi)kullandıysanız, güvende olmanız gerektiğini unutmayın. Ben Firefox sekmeyi yenilemek, burada tepkidir: SSLID önceki Firefox istek gelince aynı olduğunu
URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0d67549489648e7a3cd9292b671ddb9dd844b9dba682ab3f381b462d1ad1
Info: unprotected: 1254034761932
Secret: protected: 1254034791333
Date: 27/09/09 08:05
Bildirim söyledi. Böylece sunucu, SSL ID değerini kullanarak oturumları ayrı olarak söyleyebilir. Özellikle "korumalı veriler" in Firefox oturumundan yapılan her istek için aynı olduğuna, ancak sahte oturumların her biri için farklı ve aynı zamanda Firefox oturumundan farklı olduğuna dikkat edin.
Yorumunuzu yapın: SSLID'nin aynı olmasının nedeni, oturumun aynı olmasıdır (Sadece Firefox'ta yenilendim, sonuçta). Bu gerçeği oturum yönetiminizde kullanabilirsiniz. SSLID'nin nasıl oluşturulduğuna gelince, her bir satıcı kendi mekanizmalarını kullanabilmesi için sunucu özellikleri kapsamında değildir. Tomcat kaynaklarını kontrol etmelisin, bekliyorum. Her neyse, belirli bir uygulamaya güvenmemeniz gerekir - sadece JSESSIONID'i kullandığınız gibi kullanın - opak bir değer olarak. –