Dec 5, 2017 - CVE-2016-6816

tomcat CVE-2016-6816

HTTP 요청 줄을 구문 분석 한 코드가 잘못된 문자를 허용한다는 사실이 발견되었습니다.

이는 유효하지 않은 문자가 허용되었지만 해석이 다른 프록시와 함께 HTTP 응답에 데이터를 주입하기 위해 악용 될 수 있습니다.

HTTP 응답을 조작함으로써 공격자는 웹 캐시에 독을 넣거나 XSS 공격을 수행하거나 자신이 아닌 다른 요청으로부터 중요한 정보를 얻을 수 있습니다.

MITER CVE 사전 및 NIST NVD 에서 CVE-2016-6816에 대해 자세히 알아보십시오 .

결론은 저런 문제 때문에 막아 놓음 특수문자들을

이것은 catalina.properties 최 하단에 보면 아래의 옵션이 있음 허용하고 싶은 특수문자를 적어서 넣어서 해결하면 됨


tomcat.util.http.parser.HttpParser.requestTargetAllow=| 

참조


Dec 5, 2017 - java static

java static thread safe

작업 수행 중 여러 스레드가 공유하는 특정 클래스의 인스턴스 상태가 변경 될 가능성이 있는 경우 해당 클래스는 thread safe 하지 않다 라고 표현함.

FreqABTest.setType(adConfigData); 의 경우에는 freqAbtestType 변수를 static으로 사용하여,

실제 쿠키값이 C이나, 다른 D형태의 cookie를 가진 유저에 유입으로 D로 변경될 가능성이 있어 thread safe 하지 않다라고 할 수 있음.

FreqABTest.setType(adConfigData, inclinations); 로 변경하여,

실제 쿠키값을 전달하여 thread safe하도록 변경해야함.

thread safe Test Code

package com.github.sejoung.reactive.test;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class TestCode {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService es = Executors.newCachedThreadPool();

        int count = 100;
        AtomicInteger ai = new AtomicInteger();
        CyclicBarrier cb = new CyclicBarrier(count);

        for (int i = 0; i < count; i++) {
            es.submit(() -> {
                int idx = ai.addAndGet(1);
                cb.await();
                FreqABTest cTest = new FreqABTest();        /// C
                cTest.setFreqAbtestType(idx);

                if ((idx != cTest.getFreqAbtestType())) {
                    System.out.println(" idx " + idx + " freqAbtestType " + cTest.getFreqAbtestType());
                }
                return null;
            });

        }
        es.shutdown();
        es.awaitTermination(10000, TimeUnit.HOURS);

    }
}


package com.github.sejoung.reactive.test;

public class FreqABTest {

    private static int freqAbtestType;

    public static void setFreqAbtestType(int freqAbtestType) {
        FreqABTest.freqAbtestType = freqAbtestType;
    }

    public static int getFreqAbtestType(){
        return FreqABTest.freqAbtestType;
    }
}

참조


Nov 29, 2017 - Reactive Programming

Iterable(PULL) vs Observable(PUSH)


 Iterable<Integer> iter = () ->
                new Iterator<Integer>() {
                    int i = 0;
                    final static int MAX = 10;

                    @Override
                    public boolean hasNext() {
                        return i < MAX;
                    }

                    @Override
                    public Integer next() {
                        return ++i;
                    }
                };


        for (Integer i : iter) {
            System.out.println(i);
        }

        for (Iterator<Integer> it = iter.iterator(); it.hasNext() ;) {
            System.out.println(it.next());
        }



	Observer ob = new Observer() {
            @Override
            public void update(Observable o, Object arg) {
                System.out.println(Thread.currentThread().getName() + " " + arg);
            }
        };

        IntObservable io = new IntObservable();
        io.addObserver(ob);
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.execute(io);
        System.out.println(Thread.currentThread().getName() + " EXIT ");
        es.shutdown();
		
	static class IntObservable extends Observable implements Runnable{

        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                setChanged();
                notifyObservers(i); 		//push
				//int i = it.next();        //pull
            }
        }
    }
	
	

옵저버 패턴의 단점

  1. Complete 이라는것이 없다. 이벤트를 대기 하고있다.

  2. Error 에 대한 처리가 어렵다.


package com.github.sejoung.hystrix;

import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;

import java.util.Arrays;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class PubSub {
    public static void main(String[] args) throws InterruptedException {
        //Publisher <- Observable
        //Subscriber <- Observer

        Iterable<Integer> iter = Arrays.asList(1, 2, 3, 4, 5);
        ExecutorService es = Executors.newSingleThreadExecutor();

        Publisher p = new Publisher() {
            @Override
            public void subscribe(Subscriber subscriber) {
                Iterator<Integer> it = iter.iterator();

                subscriber.onSubscribe(new Subscription() {
                    @Override
                    public void request(long l) {
                        es.execute(() -> {
                            int i = 0;
                            try {
                                while (i++ < l) {
                                    if (it.hasNext()) {
                                        subscriber.onNext(it.next());

                                    } else {
                                        subscriber.onComplete();
                                        break;
                                    }
                                }
                            } catch (RuntimeException e) {
                                subscriber.onError(e);
                            }

                        });

                    }

                    @Override
                    public void cancel() {

                    }
                });
            }
        };


        Subscriber<Integer> s = new Subscriber<Integer>() {
            Subscription subscription;

            @Override
            public void onSubscribe(Subscription subscription) {
                System.out.println("onSubscribe");
                this.subscription = subscription;
                this.subscription.request(2);

            }

            @Override
            public void onNext(Integer integer) {
                System.out.println(Thread.currentThread().getName()+" onNext " + integer);

                this.subscription.request(1);

            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("onError "+throwable.getMessage());
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete");

            }
        };

        p.subscribe(s);
        es.awaitTermination(10, TimeUnit.HOURS);
    }
}


쌍대성


대충 두 구조가 있고 한쪽 구조에서 성립하는 모든 관계가 자동으로 다른 구조에서도 성립하고..
한쪽 구조를 다른쪽 구조로 변환하는 일관된 규칙이 있고..
뭐 그러면 서로를 dual 관계라고 하는데.. 자세한 수학적 정의는 공부를 열심히 안해서 ^^;;
대표적인게   비트 and <-> or
1을 0으로, 0을 1로 바꾸면 and의 세계와 or의 세계는 서로 똑같죠..
전자과에선  저항 <-> 컨덴서,
직렬 병렬이 뒤집히고, 전압과 전류가 서로 대응하던가... 뭐 그런..
여기 있는 쌍대성은 informal하게
방향을 뒤집고
합성 방향도 뒤집자는거니까요.

오현석님의 말을 가지고 왔습니다.

참조