VC如何限制PC機上網

來源:互聯網
上載者:User

關鍵字:限制上網 SPI 擷取IEProxy 位址

  某些程式需要實現控制電腦上網的功能,譬如允許孩子星期六8:00-20:00可以上網,其他時間不能上網。經過研究,使用者態下實現這個功能大致有以下幾種方法(以下討論基於windows各平台): 
  1、使用windows Hook,監視IE或其他瀏覽器的地址欄,發現有www或http字樣的,則更改這些url,使之不能訪問相應的url。這種方法實現可能相對容易,但是不準確,不能限制所有的上網軟體。糊弄未成年小孩可能比較有效。 
  2、基於SPI的資料包過濾。通過編寫自己的Winsock服務提供者(SPI),過濾掉不符合規則的包,如過濾訪問Internet的資料包。下面會詳述此方法。 
  3、使用Winsock 2的WSAIoctl特性進行包過濾。WinSock 2允許程式使用WSAIoctl() 給一個SOCK_RAW類型的socket設定SIO_RCVALL屬性,這樣Socket可以接收到所有經過原生資料。此方法詳細參閱文檔“無需驅動程式的Sniffer-IPMon” 
  以上三種都是在使用者態(user-mode)的實現方法。優點是方便實現,無須編程者理解驅動方面的知識,缺點是還是可能遺漏一些資料包,譬如那些一些病毒軟體可能不通過socket介面來訪問網路,這樣使用者態的程式就無法捕獲到這些包。但由於我們的目的是限制普通使用者上網,而不是做防火牆,所以第2種方法基本可以接受。至於第3種方法,據文檔1描述經常無法看到本機發出去的資料包,我也沒有仔細測試,有興趣的朋友可以自己試試。 
  第2種方法主要參考了VC知識庫《線上雜誌》第20期中TOo2y的文章:“基於SPI的資料報過濾原理與實現”。Windows也有一個例子 Layered.zip。另外, 《windows網路編程技術》(Anthony Jones著 京京工作室譯,機工出版),這本書第14章“Winsock2服務提供者介面”較詳細討論了SPI知識。 
  下面討論實現方案。以一個區域網路中的電腦為例,實現目標是:不能訪問Internet,但可以訪問區域網路。我們知道,PC機上網有兩種方式:A 通過網關(路由器)上網,B 通過Proxy 伺服器上網。 
  對於A,則其訪問Internet時的地址都是公網地址,我們直接通過自己的傳輸服務提供者直接過濾掉。如下:

int WSPAPI WSPSendTo( SOCKET           s, LPWSABUF         lpbuffer, DWORD            dwbuffercount, LPDWORD          lpnumberofbytessent, DWORD            dwflags, const struct     sockaddr FAR *lpto, int              itolen, LPWSAOVERLAPPED  lpoverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpcompletionroutine, LPWSATHREADID    lpthreadid, LPINT            lperrno){struct sockaddr_in sin;sin=*(const struct sockaddr_in *)lpto;//過濾掉訪問地址不是本地區域網路的包,下面只是簡單認為192.168.*.*是區域網路的IP,具體需//根據不同的區域網路網路地址進行設定。if (192 != sin.sin_addr.S_un.S_un_b.s_b1){OutputDebugString(_T("WSPSendTo Tencent Filtered"));return 0;}else{return nextproctable.lpWSPSendTo(s, lpbuffer, dwbuffercount, lpnumberofbytessent, dwflags, lpto, itolen, lpoverlapped, lpcompletionroutine, lpthreadid, lperrno);}}            

  對於B,由於PC機是通過區域網路中的代理上網的,所以其所有的上網資料包通過先發給本地代理,然後代理將它請求的網頁返回給它,所以其訪問Internet是間接的,其訪問Internet時發出的包都是區域網路的IP。這樣上面的過濾規則就不適用。怎麼辦?我們可以先取得IE的Proxy 伺服器IP地址和連接埠號碼,然後將包的地址和連接埠號碼與IE的代理IP地址和連接埠號碼比較,如果都相等,則過濾此包。這樣就可以限制PC機通過代理上網,同時不影響它訪問Proxy 伺服器的區域網路資源。 
  至於如何擷取IE的Proxy 伺服器地址和連接埠號碼,可使用下面代碼:

INTERNET_PROXY_INFO *pIEinfo = NULL;DWORD dwSize = 0;BOOL bRet = InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pIEinfo, &dwSize);pIEinfo = (INTERNET_PROXY_INFO*)new char[dwSize];bRet = InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pIEinfo, &dwSize);       

結束語
  這樣,將兩種上網途徑都屏蔽掉,達到了限制PC機上網的目的。歡迎大家討論。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.