歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

網絡安全編程技術(二)


2.標准C庫

(1)標准I/O
*fopen():打開一個文件供讀或寫,安全方面的考慮同open()一樣.
*fread(),getc(),fgetc(),gets(),scanf()和fscanf():從已由fopen()打
開供讀的文件中讀取信息.它們並不關心文件的存取許可.這一點
同read().
*fwrite(),put(),fputc(),puts,fputs(),printf(),fprintf():寫信息到
已由fopen()打開供寫的文件中.它們也不關心文件的存取許可.
同write().
*getpass():從終端上讀至多8個字符長的口令,不回顯用戶輸入的字符.
需要一個參數: 提示信息.
該子程序將提示信息顯示在終端上,禁止字符回顯功能,從/dev/tty讀取口
令,然後再恢復字符回顯功能,返回剛敲入的口令的指針.
*popen():將在(5)運行shell中介紹.

(2)/etc/passwd處理
有一組子程序可對/etc/passwd文件進行方便的存取,可對文件讀取到入口
項或寫新的入口項或更新等等.
*getpwuid():從/etc/passwd文件中獲取指定的UID的入口項.
*getpwnam():對於指定的登錄名,在/etc/passwd文件檢索入口項.
以上兩個子程序返回一指向passwd結構的指針,該結構定義在
/usr/include/pwd.h中,定義如下:
struct passwd {
char * pw_name; /* 登錄名 */
char * pw_passwd; /* 加密後的口令 */
uid_t pw_uid; /* UID */
gid_t pw_gid; /* GID */
char * pw_age; /* 代理信息 */
char * pw_comment; /* 注釋 */
char * pw_gecos;
char * pw_dir; /* 主目錄 */
char * pw_shell; /* 使用的shell */
};
*getpwent(),setpwent(),endpwent():對口令文件作後續處理.
首次調用getpwent(),打開/etc/passwd並返回指向文件中第一個入口項的
指針,保持調用之間文件的打開狀態.
再調用getpwent()可順序地返回口令文件中的各入口項.
調用setpwent()把口令文件的指針重新置為文件的開始處.
使用完口令文件後調用endpwent()關閉口令文件.
*putpwent():修改或增加/etc/passwd文件中的入口項.
此子程序將入口項寫到一個指定的文件中,一般是一個臨時文件,直接寫口
令文件是很危險的.最好在執行前做文件封鎖,使兩個程序不能同時寫一個
文件.算法如下:
. 建立一個獨立的臨時文件,即/etc/passnnn,nnn是PID號.
. 建立新產生的臨時文件和標准臨時文件/etc/ptmp的鏈,若建鏈失敗,
則為有人正在使用/etc/ptmp,等待直到/etc/ptmp可用為止或退出.
. 將/etc/passwd拷貝到/etc/ptmp,可對此文件做任何修改.
. 將/etc/passwd移到備份文件/etc/opasswd.
. 建立/etc/ptmp和/etc/passwd的鏈.

. 斷開/etc/passnnn與/etc/ptmp的鏈.
注意:臨時文件應建立在/etc目錄,才能保證文件處於同一文件系統中,建
鏈才能成功,且臨時文件不會不安全.此外,若新文件已存在,即便建
鏈的是root用戶,也將失敗,從而保證了一旦臨時文件成功地建鏈後
沒有人能再插進來干擾.當然,使用臨時文件的程序應確保清除所有
臨時文件,正確地捕捉信號.
(3)/etc/group的處理
有一組類似於前面的子程序處理/etc/group的信息,使用時必須用include
語句將/usr/include/grp.h文件加入到自己的程序中.該文件定義了group
結構,將由getgrnam(),getgrgid(),getgrent()返回group結構指針.
*getgrnam():在/etc/group文件中搜索指定的小組名,然後返回指向小組入
口項的指針.
*getgrgid():類似於前一子程序,不同的是搜索指定的GID.
*getgrent():返回group文件中的下一個入口項.
*setgrent():將group文件的文件指針恢復到文件的起點.
*endgrent():用於完成工作後,關閉group文件.
*getuid():返回調用進程的實際UID.
*getpruid():以getuid()返回的實際UID為參數,確定與實際UID相應的登錄
名,或指定一UID為參數.
*getlogin():返回在終端上登錄的用戶的指針.
系統依次檢查STDIN,STDOUT,STDERR是否與終端相聯,與終端相聯的標准輸
入用於確定終端名,終端名用於查找列於/etc/utmp文件中的用戶,該文件
由login維護,由who程序用來確認用戶.
*cuserid():首先調用getlogin(),若getlogin()返回NULL指針,再調用
getpwuid(getuid()).
*以下為命令:
*logname:列出登錄進終端的用戶名.
*who am i:顯示出運行這條命令的用戶的登錄名.
*id:顯示實際的UID和GID(若有效的UID和GID和實際的不同時也顯示有效的
UID和GID)和相應的登錄名.

(4)加密子程序
1977年1月,NBS宣布一個用於美國聯邦政府ADP系統的網絡的標准加密法:數
據加密標准即DES用於非機密應用方面.DES一次處理64BITS的塊,56位的加
密鍵.
*setkey(),encrypt():提供用戶對DES的存取.
此兩子程序都取64BITS長的字符數組,數組中的每個元素代表一個位,為0
或1.setkey()設置將按DES處理的加密鍵,忽略每第8位構成一個56位的加
密鍵.encrypt()然後加密或解密給定的64BITS長的一塊,加密或解密取決
於該子程序的第二個變元,0:加密 1:解密.
*crypt():是UNIX系統中的口令加密程序,也被/usr/lib/makekey命令調用.
crypt()子程序與crypt命令無關,它與/usr/lib/makekey一樣取8個字符長
的關鍵詞,2個salt字符.關鍵詞送給setkey(),salt字符用於混合encrypt()
中的DES算法,最終調用encrypt()重復25次加密一個相同的字符串.
返回加密後的字符串指針.

(5)運行shell
*system():運行/bin/sh執行其參數指定的命令,當指定命令完成時返回.
*popen():類似於system(),不同的是命令運行時,其標准輸入或輸出聯到由
popen()返回的文件指針.
二者都調用fork(),exec(),popen()還調用pipe(),完成各自的工作,因而
fork()和exec()的安全方面的考慮開始起作用.


——摘自:http://www.linuxaid.com.cn


Copyright © Linux教程網 All Rights Reserved