2021. 1. 25. 08:30ㆍ개발/C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace HttpRequest
{
class Program
{
static void Main(string[] args)
{
new Program().SendHttp();
}
void SendHttp()
{
// TCP/IP Socket 객체 생성
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("연결할 주소를 입력하세요.");
string confirm1 = Console.ReadLine();
Console.WriteLine("전체 URI를 입력하세요.");
string confirm2 = Console.ReadLine();
// 호스트를 IP로 변경
IPHostEntry hostEntry = Dns.GetHostEntry(confirm1);
IPAddress ip = hostEntry.AddressList[0];
// HTTP 서버 접속
var httpEndPoint = new IPEndPoint(ip, 80);
sock.Connect(httpEndPoint);
// HTTP header should end with double newline (\r\n\r\n)
string http = "GET " + confirm2 + @" HTTP/1.1
User-Agent: Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 67.0.3396.99 Safari / 537.36
Host: "+confirm1+@"
";
// Send
var sendBuff = Encoding.ASCII.GetBytes(http);
sock.Send(sendBuff, sendBuff.Length, SocketFlags.None);
// Receive
byte[] recvBuff = new byte[sock.ReceiveBufferSize];
int nCount = sock.Receive(recvBuff);
string result = Encoding.ASCII.GetString(recvBuff, 0, nCount);
File.WriteAllText(@"C:\Users\user\Desktop\test.txt", result);
using (StreamReader rdr = new StreamReader(@"C:\Users\user\Desktop\test.txt"))
{
// ReadLine()을 써서 한 라인을 읽어 들인다
// 만약 파일 끝이면 null 이 리턴된다
while ((result = rdr.ReadLine()) != null)
{
if (result.Contains("HTTP/1.1"))
{
Console.WriteLine();
Console.WriteLine("------ 응답 코드 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Server"))
{
Console.WriteLine("------ 웹서버 정보 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Date"))
{
Console.WriteLine("------ 요청 생성 시간 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("X-Frame-Options"))
{
Console.WriteLine("------ iframe이나 사용자 눈에 보이지 않는 영역을 추가하는 ClickJacking 방지 관련 옵션 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("X-XSS-Protection"))
{
Console.WriteLine("------ 공격자가 XSS 공격을 시도할 때 브라우저의 내장 XSS 필터를 통한 공격 방어 가능 여부 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
if (result.Contains("mode=block"))
{
Console.WriteLine("1;mode=block일 경우 브라우저가 XSS 공격 감지시 자동으로 내용을 치환합니다.");
Console.WriteLine(Environment.NewLine + Environment.NewLine);
}
}
else if (result.Contains("X-Content-Type-Option"))
{
// MIME 타입이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘입니다
// 웹에서 파일의 확장자는 별 의미가 없습니다. 그러므로, 각 문서와 함께 올바른 MIME 타입을 전송하도록,
// 서버가 정확히 설정하는 것이 중요합니다. 브라우저들은 리소스를 내려받았을 때 해야 할 기본 동작이 무엇인지를
// 결정하기 위해 대게 MIME 타입을 사용합니다.
Console.WriteLine("------ 리소스의 MIMETYPE이 일치하지 않을 경우 차단 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
if (result.Contains("nosniff"))
{
Console.WriteLine("nosniff일 경우 styleSheet는 MIMETYPE이 text/css와 일치할 때까지 styleSheet를 로드하지 않습니다.");
Console.WriteLine(Environment.NewLine + Environment.NewLine);
}
}
else if (result.Contains("Content-Type"))
{
Console.WriteLine("------ 컨텐츠 타입 / 인코딩 방식 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Content-Length"))
{
Console.WriteLine("------ 응답 메시지 길이 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Content-Language"))
{
Console.WriteLine("------ 컨텐츠와 가장 잘 어울리는 사용자 언어 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Access-Control-Allow-Origin"))
{
Console.WriteLine("------ 리소스에 접근 가능한 URI ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Access-Control-Allow-Credentials"))
{
Console.WriteLine("------ 요청에 대한 응답을 내보낼 수 있는지 여부 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Referrer-Policy"))
{
Console.WriteLine("------ 참조 정책 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
if (result.Contains("no-referrer-when-downgrade"))
{
Console.WriteLine("no-referrer-when-downgrade(기본정책)은 HTTPS -> HTTP로는 보내지지 않습니다. ");
Console.WriteLine(Environment.NewLine + Environment.NewLine);
}
}
else if (result.Contains("Location"))
{
// EX) Login이 필요한 페이지가 있을 경우, 이런 페이지에 Login 없이 접근하려할 때 발생
Console.WriteLine("------ 브라우저가 리다이렉트할 주소 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Vary"))
{
// EX) Login이 필요한 페이지가 있을 경우, 이런 페이지에 Login 없이 접근하려할 때 발생
Console.WriteLine("------ 서버의 응답은 ex) Accept-Encoding 요청 헤더를 보낸 클라이언트에게만 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
}
else if (result.Contains("Connection"))
{
Console.WriteLine("------ HTTP 전송 완료 후, TCP 연결 지속 여부 ------");
Console.WriteLine(result + Environment.NewLine + Environment.NewLine);
if (result.Contains("keep-alive"))
{
Console.WriteLine("keep-alive는 연결을 종료하지 않습니다.");
Console.WriteLine();
}
}
else if (result.Contains("charset"))
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine(" **************************** meta Tag - charset tag **************************** " + Environment.NewLine + Environment.NewLine);
// meta 태그는 웹서버와 웹 브라우저 간 상호 교환되는 정보를 정의하는데 사용한다.
// HTML 문서의 <head>와 </head> 사이에 입력하는 특수 태그로서 사이트의 디자인에는 전혀 영향을 미치지 않고
// 문서가 어떤 내용을 담고 있고, 문서의 키워드는 무엇이며, 누가 만들었는지 등의 문서 자체의 특성을 담고 있다
// content 태그는 meta 정보의 내용을 지정한다.
Regex regex = new Regex("charset=.*>");
result = Regex.Replace(result, @"\s+", " | ");
Match m = regex.Match(result);
while (m.Success)
{
Console.WriteLine(m + Environment.NewLine);
m = m.NextMatch();
}
}
else if (result.Contains("name"))
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine(" **************************** meta Tag - name tag **************************** " + Environment.NewLine + Environment.NewLine);
// meta 태그는 웹서버와 웹 브라우저 간 상호 교환되는 정보를 정의하는데 사용한다.
// HTML 문서의 <head>와 </head> 사이에 입력하는 특수 태그로서 사이트의 디자인에는 전혀 영향을 미치지 않고
// 문서가 어떤 내용을 담고 있고, 문서의 키워드는 무엇이며, 누가 만들었는지 등의 문서 자체의 특성을 담고 있다
// content 태그는 meta 정보의 내용을 지정한다.
Regex regex = new Regex("name=.*>");
result = Regex.Replace(result, @"\s+", " | ");
Match m = regex.Match(result);
while (m.Success)
{
Console.WriteLine(m + Environment.NewLine);
m = m.NextMatch();
}
}
else if (result.Contains("<meta"))
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine(" **************************** meta Tag - property / content **************************** " + Environment.NewLine + Environment.NewLine);
// meta 태그는 웹서버와 웹 브라우저 간 상호 교환되는 정보를 정의하는데 사용한다.
// HTML 문서의 <head>와 </head> 사이에 입력하는 특수 태그로서 사이트의 디자인에는 전혀 영향을 미치지 않고
// 문서가 어떤 내용을 담고 있고, 문서의 키워드는 무엇이며, 누가 만들었는지 등의 문서 자체의 특성을 담고 있다
// content 태그는 meta 정보의 내용을 지정한다.
Regex regex = new Regex("property=.*>");
result = Regex.Replace(result, @"\s+", " | ");
Match m = regex.Match(result);
while (m.Success)
{
Console.WriteLine(m + Environment.NewLine );
m = m.NextMatch();
}
}
else if (result.Contains("<link"))
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine(" **************************** link Tag **************************** " + Environment.NewLine + Environment.NewLine);
// meta 태그는 웹서버와 웹 브라우저 간 상호 교환되는 정보를 정의하는데 사용한다.
// HTML 문서의 <head>와 </head> 사이에 입력하는 특수 태그로서 사이트의 디자인에는 전혀 영향을 미치지 않고
// 문서가 어떤 내용을 담고 있고, 문서의 키워드는 무엇이며, 누가 만들었는지 등의 문서 자체의 특성을 담고 있다
// content 태그는 meta 정보의 내용을 지정한다.
Regex regex = new Regex("<link.*>");
result = Regex.Replace(result, @"\s+", " | ");
Match m = regex.Match(result);
while (m.Success)
{
Console.WriteLine(m + Environment.NewLine);
m = m.NextMatch();
}
}
else if (result.Contains("<script"))
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine(" **************************** script **************************** " + Environment.NewLine + Environment.NewLine);
// meta 태그는 웹서버와 웹 브라우저 간 상호 교환되는 정보를 정의하는데 사용한다.
// HTML 문서의 <head>와 </head> 사이에 입력하는 특수 태그로서 사이트의 디자인에는 전혀 영향을 미치지 않고
// 문서가 어떤 내용을 담고 있고, 문서의 키워드는 무엇이며, 누가 만들었는지 등의 문서 자체의 특성을 담고 있다
// content 태그는 meta 정보의 내용을 지정한다.
Regex regex = new Regex("<script.*</script>");
result = Regex.Replace(result, @"\s+", " | ");
Match m = regex.Match(result);
while (m.Success)
{
Console.WriteLine(m + Environment.NewLine);
m = m.NextMatch();
}
}
}
}
Console.ReadLine();
sock.Close();
}
}
}
'개발 > C#' 카테고리의 다른 글
# 객체지향 프로그래밍 (OOP) / 캡슐화 / 상속 / 다형성 (0) | 2021.01.25 |
---|---|
# 이벤트 핸들러 (Event Handler) (0) | 2021.01.25 |
# 실행중인 프로세스 정보 가져오기 / 특정 프로세스 경로 가져오기 (0) | 2021.01.25 |
# 일기 쓰고 텍스트 파일로 저장하는 간단한 프로그램 예제 (0) | 2021.01.25 |
# 여러가지 프로그램을 한개 창에서 선택하여 실행시키는 프로그램 + (CMD 실행 기능) (0) | 2021.01.25 |