<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>DLL [DLL.kr] &amp;gt; 개발자료 &amp;gt; 델파이 자료실</title>
<link>http://dll.kr/gnuboard5/bbs/board.php?bo_table=dev</link>
<description>테스트 버전 0.2 (2004-04-26)</description>
<language>ko</language>


<item>
<title>중국 아아피 차단, 대역차단, 방화벽 인바운드규칙 차단</title>
<link>http://dll.kr/gnuboard5/bbs/board.php?bo_table=dev&amp;amp;wr_id=24</link>
<description><![CDATA[<p>중국 아아피 차단, 대역차단, 방화벽 인바운드규칙 차단 </p>]]></description>
<dc:creator>DLL</dc:creator>
<dc:date>Fri, 21 Oct 2022 01:44:47 +0900</dc:date>
</item>


<item>
<title>아이피 차단 처리[단일 대역 클래스 등.]</title>
<link>http://dll.kr/gnuboard5/bbs/board.php?bo_table=dev&amp;amp;wr_id=23</link>
<description><![CDATA[<p>고오~급 보안이 적용된 방화벽에서</p><p>인바운드 규칙에 간단하게 아이피 차단을 단일/대역/클래스로 해주는 작업을 하는 코드임.</p><p> </p><p>unit Unit1;</p><p> </p><p>interface</p><p> </p><p>uses</p><p>  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ShellAPI, VistaMan, ExtCtrls;</p><p>type</p><p>  TForm1 = class(TForm)</p><p>    L: TMemo;</p><p>    Panel1: TPanel;</p><p>    BtnStart: TBitBtn;</p><p>    BtnStop: TBitBtn;</p><p>    Memo1: TMemo;</p><p>    BtnWF_SMC: TBitBtn;</p><p>    Procedure LChange(Sender: TObject);</p><p>    Procedure BtnStartClick(Sender: TObject);</p><p>    Procedure BtnStopClick(Sender: TObject);</p><p>    Procedure FormCreate(Sender: TObject);</p><p>    Procedure BtnWF_SMCClick(Sender: TObject);</p><p>    Procedure GetDosOutput(CommandLine: string; Work: string = 'C:\');</p><p>  private</p><p>  public</p><p>  end;</p><p> </p><p>var</p><p>  Form1: TForm1;</p><p> </p><p> </p><p>implementation</p><p> </p><p>{$R *.dfm}</p><p> </p><p>{=====================}</p><p>{ 콘솔프로세스 생성후 }</p><p>{ 고급보안 방화벽실행 }</p><p>{=====================}</p><p>Procedure TForm1.GetDosOutput(CommandLine: String; Work: String = 'C:\');</p><p>Var</p><p>  SecAtrrs: TSecurityAttributes;</p><p>  StartupInfo: TStartupInfo;</p><p>  ProcessInfo: TProcessInformation;</p><p>  StdOutPipeRead, StdOutPipeWrite: THandle;</p><p>  WasOK: Boolean;</p><p>  pCommandLine: PChar;</p><p>  BytesRead: Cardinal;</p><p>  WorkDir: String;</p><p>  Rtn: String; {디버깅용}</p><p>  Handle: Boolean;</p><p>Begin</p><p>  Rtn := '';</p><p>  With SecAtrrs Do Begin</p><p>    nLength := SizeOf(SecAtrrs);</p><p>    bInheritHandle := True;</p><p>    lpSecurityDescriptor := Nil;</p><p>  End;</p><p>  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SecAtrrs, 0);</p><p>  Try</p><p>    With StartupInfo Do Begin</p><p>      FillChar(StartupInfo, SizeOf(StartupInfo), 0);</p><p>      cb := SizeOf(StartupInfo);</p><p>      dwFlags := STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES;</p><p>      wShowWindow := SW_HIDE;</p><p>      hStdInput := GetStdHandle(STD_INPUT_HANDLE);</p><p>      hStdOutput := StdOutPipeWrite;</p><p>      hStdError := StdOutPipeWrite;</p><p>    End;</p><p>    WorkDir := Work;</p><p>    Handle := CreateProcess(Nil, PChar('cmd.exe /C ' + CommandLine),</p><p>                            Nil, Nil, True, 0, Nil,</p><p>                            PChar(WorkDir), StartupInfo, ProcessInfo);</p><p>    CloseHandle(StdOutPipeWrite);</p><p>    If Handle Then Begin</p><p>      Try</p><p>        Repeat</p><p>          WasOK := windows.ReadFile(StdOutPipeRead, pCommandLine, 255, BytesRead, Nil);</p><p>          If BytesRead &gt; 0 Then Begin</p><p>            pCommandLine[BytesRead] := #0;</p><p>            Rtn := Rtn + pCommandLine;</p><p>          End;</p><p>        Until Not WasOK Or (BytesRead = 0);</p><p>        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);</p><p>      Finally</p><p>        CloseHandle(ProcessInfo.hThread);</p><p>        CloseHandle(ProcessInfo.hProcess);</p><p>      End;</p><p>    End;</p><p>  Finally</p><p>    CloseHandle(StdOutPipeRead);</p><p>  End;</p><p>End;</p><p> </p><p> </p><p>Procedure TForm1.FormCreate(Sender: TObject);</p><p>begin</p><p>  Try</p><p>    L.Lines.LoadFromFile('List.txt');</p><p>  Except End;</p><p>  BtnStop.Click;</p><p>  BtnStart.Click;</p><p>End;</p><p> </p><p>{=================================================}</p><p>{ 아이피 리스트를 방화벽 인바운드 규칙에 차단처리 }</p><p>{=================================================}</p><p>Procedure TForm1.BtnStartClick(Sender: TObject);</p><p>Var</p><p>  Rtn : Integer;</p><p>  Data, IPData, Tmp : String;</p><p>  Idx : Integer;</p><p>begin</p><p>  BtnStart.Enabled := False;</p><p>  Try</p><p>    IPData := '';</p><p>    {============================================}</p><p>    { 리스트처리시, 빈 공백 엔터를 했거나 여러번 }</p><p>    { 엔터를 한 경우 공란으로 넘겨서 처리 하도록 }</p><p>    {============================================}</p><p>    For Idx := 0 To L.Lines.Count-1 Do Begin</p><p>      If L.Lines.Strings[Idx] &lt;&gt; '' Then Begin</p><p> </p><p>          Tmp := L.Lines.Strings[Idx];</p><p>          Tmp := StringReplace(Tmp, ' ', '', [rfReplaceAll]); {혹시라도 공백입력 헀으면 없애기}</p><p>          Tmp := StringReplace(Tmp, ',', '.', [rfReplaceAll]); {혹시라도 콤마입력 했으면 점으로}</p><p> </p><p>        If IPData = '' Then Begin</p><p>          IPData := Tmp;</p><p>        End Else Begin</p><p>          IPData := IPData + ',' + Tmp;</p><p>        End;</p><p>      End;</p><p>    End;</p><p> </p><p>    IPData := StringReplace(IPData, ' ', '', [rfReplaceAll]); {조합시 뜻밖의 공백이 나오면 없애기}</p><p> </p><p>    If IPData &lt;&gt; '' Then Begin</p><p>      Data := 'advfirewall firewall add rule name="@앰피소프트_IP차단" dir=in action=block remoteip=' + IPData + ' enable=yes';</p><p>      Rtn := 0;</p><p>      Rtn := ShellExecute(Form1.Handle, 'open', 'netsh', PChar(Data), Nil, SW_HIDE);</p><p>      If (Rtn &gt; 32) Then Begin End Else Begin End; { 리턴으로 수행완료 대기 }</p><p>      BtnStart.Enabled := False;</p><p>      BtnStop.Enabled := True;</p><p>    End Else Begin</p><p>      BtnStart.Enabled := True;</p><p>      BtnStop.Enabled := False;</p><p>      ShowMessage('목록에 아이피가 없음... 기본 아이피를 1.1.1.1 입력해서 해보세요~ 그리고 고급방화벽 설정에서 인바운드 규칙에 추가되어 있을 것임ㅋㅋㅋ');</p><p>    End;</p><p>  Except</p><p>    ShowMessage('현재 운영체제의 방화벽 설정 상태와 라이센스에서는 설정이 불가능합니다. 윈도우 버전과 라이센스 체크를 해야 할 듯한데? (ㅡ,.ㅡ;)');</p><p>    BtnStart.Enabled := True;</p><p>  End;</p><p>End;</p><p> </p><p>{==========}</p><p>{ 차단중단 }</p><p>{==========}</p><p>Procedure TForm1.BtnStopClick(Sender: TObject);</p><p>Var</p><p>  Rtn : Integer;</p><p>  Data : String;</p><p>begin</p><p>  BtnStop.Enabled := False;</p><p>  Try</p><p>    Data := 'advfirewall firewall delete rule name="@앰피소프트_IP차단"';</p><p>    Rtn := 0;</p><p>    Rtn := ShellExecute(Form1.Handle, 'open', 'netsh', PChar(Data), Nil, SW_HIDE);</p><p>    If (Rtn &gt; 32) Then Begin End Else Begin End; { 리턴으로 수행완료 대기 }</p><p>  Except</p><p>    ShowMessage('현재 운영체제의 라이센스에서는 설정이 불가능합니다 (T_T).. 개발자에게 운영체제 버전과, 방화벽 설정 상태를 알려주세요');</p><p>  End;</p><p>  BtnStart.Enabled := True;</p><p>End;</p><p> </p><p> </p><p> </p><p>{=======================}</p><p>{ 인바운드규칙 캡션으로 }</p><p>{ 고급 보안 방화벽 실행 }</p><p>{=======================}</p><p>Procedure TForm1.BtnWF_SMCClick(Sender: TObject);</p><p>begin</p><p>  GetDosOutput('WF.MSC');</p><p>end;</p><p> </p><p> </p><p>{=================}</p><p>{ 변경시 바로저장 }</p><p>{=================}</p><p>Procedure TForm1.LChange(Sender: TObject);</p><p>begin</p><p>  Try</p><p>    L.Lines.SaveToFile('List.txt');</p><p>  Except End;</p><p>end;</p><p> </p><p>END.</p><p> </p><p>코드에 관한 질문 받지 않음 ㅋㅋ 하지마~! (ㅅㅂ~)</p><p>중간에 쓰잘데기 없는 디버깅용 변수나 로직이 있으니, 알아서들 구워 삶아서 쓰길 바람. ㅇㅇ</p><p> </p><p> </p>]]></description>
<dc:creator>DLL</dc:creator>
<dc:date>Fri, 21 Oct 2022 00:14:57 +0900</dc:date>
</item>


<item>
<title>IdHTTP로 POST전송하기</title>
<link>http://dll.kr/gnuboard5/bbs/board.php?bo_table=dev&amp;amp;wr_id=1</link>
<description><![CDATA[<p><b>{================}</b></p><p><b>{ POST 전송 처리 }</b></p><p><b>{================}</b></p><p><b>Function Send_POST</b>(AURL: <b>String</b>; AData : TStringList): <b>String</b>;</p><p><b>Var</b></p><p>  LStream: <b>TMemoryStream</b>;</p><p>  RStream: <b>TStringStream</b>;</p><p><b>Begin</b></p><p>  LStream := <b>TMemoryStream</b>.Create;</p><p>  RStream := <b>TStringStream</b>.Create;</p><p>  <b>Try</b></p><p>    <b>Try</b></p><p>      WB.Post(AURL, AData ,LStream);</p><p>      LStream.Position := 0; RStream.Position := 0;</p><p>      RStream.CopyFrom(LStream,LStream.Size);</p><p>      <b>Result </b>:= RStream.Encoding.<b>GetEncoding(949)</b>.GetString(RStream.Bytes,0,RStream.Size);</p><p>    <b>Finally</b></p><p>      LStream.Free; RStream.Free;</p><p>    <b>End</b>;</p><p>  <b>Except On </b>E : Exception <b>Do Begin</b></p><p>    Log.Lines.Add(DateTimeToStr(Now()) + ' ▶' + '오류발생  : ' + E.Message);</p><p>  <b>End</b>;<b>End</b>;</p><p><b>End</b>;</p><p> </p><p>Send_POST 호출시, </p><p>AURL -&gt; POST 전송될 페이지 주소. </p><p>AData -&gt; POST 전송할 데이터 값.</p><p> </p><p>AData는 스트링리스트이며, 값들은</p><p>AData.Add('mem_id=' + Edt_mem_id.Text);</p><p> </p><p> * 형식으로 웹상 포스트 되는 값들을 모두 Add 합니다.</p><p> * 함수 호출후 리설트를 받으면 POST 전송후 처리값이 나옵니다.</p><p> * 오류발생시 Log라는 TMemo로 시간+오류메시지가 나오게 됩니다.</p><p> </p><p>주의할 점 : 웹서버가 대부분 <span style="line-height:1.5;">레퍼러를 체크하기 때문에, 레퍼러값을 함께 보내주셔야 합니다.</span></p><p>드물게는 User-Agent (에이전트)값도 체크를 합니다.</p><p>WB.Request.UserAgent := '인디 라이브러리가 아닌 브라우져의 에이전트값~'; </p><p>WB.Request.Referer := <span style="line-height:1.5;">AURL</span><span style="line-height:1.5;">; {보통 전송하는 주소를 넣거나 최상위 도메인주소를 넣으면 됩니다.}</span></p><p><span style="line-height:1.5;"> </span></p><p><span style="line-height:1.5;">문자열이 외계어로 리턴되실수도 있는데, 이는 utf인코딩이나 euckr인코딩일 경우에 그렇더군요.</span></p><p><span style="line-height:1.5;">그래서 상황 봐가면서 </span><b style="line-height:1.5;">GetEncoding(949), </b><b style="line-height:1.5;">GetEncoding(65001) </b><span style="line-height:1.5;">인코딩처리를 골라서 하시면 됩니다.</span></p><p> </p>]]></description>
<dc:creator>DLL</dc:creator>
<dc:date>Sun, 07 Aug 2016 17:59:41 +0900</dc:date>
</item>

</channel>
</rss>
