php防扒
『壹』 php如何做好最基礎的安全防範
PHP如何做好最基礎的安全防範
php給了開發者極大的靈活性,但是這也為安全問題帶來了潛在的隱患,PHP如何做好最基礎的安全防範呢?下面我為大家解答一下,希望能幫到您!
當開發一個互聯網服務的時候,必須時刻牢記安全觀念,並在開發的代碼中體現。PHP腳本語言對安全問題並不關心,特別是對大多數沒有經驗的開發者來說。每當你講任何涉及到錢財事務等交易問題時,需要特別注意安全問題的考慮,例如開發一個論壇或者是一個購物車等。
安全保護一般性要點
不相信表單
對於一般的javascript前台驗證,由於無法得知用戶的行為,例如關閉了瀏覽器的javascript引擎,這樣通過POST惡意數據到伺服器。需要在伺服器端進行驗證,對每個php腳本驗證傳遞到的數據,防止XSS攻擊和sql注入。
不相信用戶
要假設你的網站接收的每一條數據都是存在惡意代碼的,存在隱藏的威脅,要對每一條數據都進行清理
關閉全局變數
在php.ini文件中進行以下配置:
register_globals = Off
如果這個配置選項打開之後,會出現很大的安全隱患。例如有一個process.php的腳本文件,會將接收到的數據插入到資料庫,接收用戶輸入數據的表單可能如下:
< input name="username" type ="text" size = "15" maxlength = "64" >
這樣,當提交數據到process.php之後,php會注冊一個$username變數,將這個變數數據提交到process.php,同時對於任何POST或GET請求參數,都會設置這樣的變數。如果不是顯示進行初始化那麼就會出現下面的問題:
<?php
// Define $authorized = true only if user is authenticated
if
(authenticated_user()) {
$authorized = true;
}
?>
此處,假設authenticated_user函數就是判斷$authorized變數的值,如果開啟了register_globals配置,那麼任何用戶都可以發送一個請求,來設置$authorized變數的值為任意值從而就能繞過這個驗證。所有的這些提交數據都應該通過PHP預定義內置的全局數組來獲取,包括$_POST、$_GET、$_FILES、$_SERVER、$_REQUEST等,其中$_REQUEST是一個$_GET/$_POST/$_COOKIE三個數組的聯合變數,默認的順序是$_COOKIE、$_POST、$_GET。
推薦的安全配置選項
error_reporting設置為Off:不要暴露錯誤信息給用戶,開發的時候可以設置為ON
safe_mode設置為Off
register_globals設置為Off
將以下函數禁用:system、exec、passthru、shell_exec、proc_open、popen
open_basedir設置為 /tmp ,這樣可以讓session信息有存儲許可權,同時設置單獨的網站根目錄expose_php設置為Offallow_url_fopen設置為Offallow_url_include設置為Off
SQL注入攻擊
對於操作資料庫的SQL語句,需要特別注意安全性,因為用戶可能輸入特定語句使得原有的SQL語句改變了功能。類似下面的例子:
$sql ="select * from pinfo where proct = '$proct'";
此時如果用戶輸入的$proct參數為:'39'; DROP pinfo; SELECT 'FOO
那麼最終SQL語句就變成了如下的`樣子:
select proct from pinfo where proct = '39';
DROP pinfo;
SELECT 'FOO'
這樣就會變成三條SQL語句,會造成pinfo表被刪除,這樣會造成嚴重的後果。這個問題可以簡單的使用PHP的內置函數解決:
$sql = 'Select * from pinfo where proct = '"' mysql_real_escape_string($proct) . '"';
防止SQL注入攻擊需要做好兩件事:對輸入的參數總是進行類型驗證對單引號、雙引號、反引號等特殊字元總是使用mysql_real_escape_string函數進行轉義但是,這里根據開發經驗,不要開啟php的Magic Quotes,這個特性在php6中已經廢除,總是自己在需要的時候進行轉義。
防止基本的XSS攻擊
XSS攻擊不像其他攻擊,這種攻擊在客戶端進行,最基本的XSS工具就是防止一段javascript腳本在用戶待提交的表單頁面,將用戶提交的數據和cookie偷取過來。XSS工具比SQL注入更加難以防護,各大公司網站都被XSS攻擊過,雖然這種攻擊與php語言無關,但可以使用php來篩選用戶數據達到保護用戶數據的目的,這里主要使用的是對用戶的數據進行過濾,一般過濾掉HTML標簽,特別是a標簽。下面是一個普通的過濾方法:
function transform_HTML( $string , $length null) { // Helps prevent XSS attacks
// Remove dead space.
$string = trim( $string );
// Prevent potential Unicode codec problems.
$string = utf8_decode( $string );
// HTMLize HTML-specific characters.
$string = htmlentities( $string , ENT_NOQUOTES);
$string = str_replace ( "#" , "#" , $string );
$string = str_replace ( "%" , "%" , $string );
$length = intval ( $length );
if ( $length > 0) {
$string = substr ( $string , 0, $length );
}return $string ;
}
這個函數將HTML的特殊字元轉換為了HTML實體,瀏覽器在渲染這段文本的時候以純文本形式顯示。如bold會被顯示為: BoldText 上述函數的核心就是htmlentities函數,這個函數將html特殊標簽轉換為html實體字元,這樣可以過濾大部分的XSS攻擊。但是對於有經驗的XSS攻擊者,有更加巧妙的辦法進行攻擊:將他們的惡意代碼使用十六進制或者utf-8編碼,而不是普通的ASCII文本,例如可以使用下面的方式進行:
這樣瀏覽器渲染的結果其實是:
< a href = "http://host/a.php?variable=" >
< SCRIPT >Dosomethingmalicious
這樣就達到了攻擊的目的。為了防止這種情況,需要在transform_HTML函數的基礎上再將#和%轉換為他們對應的實體符號,同時加上了$length參數來限制提交的數據的最大長度。
使用SafeHTML防止XSS攻擊
上述關於XSS攻擊的防護非常簡單,但是不包含用戶的所有標記,同時有上百種繞過過濾函數提交javascript代碼的方法,也沒有辦法能完全阻止這個情況。目前,沒有一個單一的腳本能保證不被攻擊突破,但是總有相對來說防護程度更好的。一共有兩個安全防護的方式:白名單和黑名單。其中白名單更加簡單和有效。一種白名單解決方案就是SafeHTML,它足夠智能能夠識別有效的HTML,然後就可以去除任何危險的標簽。這個需要基於HTMLSax包來進行解析。安裝使用SafeHTML的方法:
1、前往http://pixel-apes.com/safehtml/?page=safehtml 下載最新的SafeHTML
2、將文件放入伺服器的classes 目錄,這個目錄包含所有的SafeHTML和HTMLSax庫
3、在自己的腳本中包含SafeHTML類文件
4、建立一個SafeHTML對象
5、使用parse方法進行過濾
<?php/* If you're storing the HTMLSax3.php in the /classes directory, along
with the safehtml.php script, define XML_HTMLSAX3 as a null string. */define(XML_HTMLSAX3, '' );// Include the class file.require_once ( 'classes/safehtml.php' );
// Define some sample bad code.
$data = This data would raise an alert
" ;// Create a safehtml object.$safehtml = new safehtml();// Parse and sanitize the data.$safe_data = $safehtml ->parse( $data );// Display result. echo 'The sanitized data is ' . $safe_data ;
?>
SafeHTML並不能完全防止XSS攻擊,只是一個相對復雜的腳本來檢驗的方式。
使用單向HASH加密方式來保護數據
單向hash加密保證對每個用戶的密碼都是唯一的,而且不能被破譯的,只有最終用戶知道密碼,系統也是不知道原始密碼的。這樣的一個好處是在系統被攻擊後攻擊者也無法知道原始密碼數據。加密和Hash是不同的兩個過程。與加密不同,Hash是無法被解密的,是單向的;同時兩個不同的字元串可能會得到同一個hash值,並不能保證hash值的唯一性。MD5函數處理過的hash值基本不能被破解,但是總是有可能性的,而且網上也有MD5的hash字典。
使用mcrypt加密數據MD5 hash函數可以在可讀的表單中顯示數據,但是對於存儲用戶的信用卡信息的時候,需要進行加密處理後存儲,並且需要之後進行解密。最好的方法是使用mcrypt模塊,這個模塊包含了超過30中加密方式來保證只有加密者才能解密數據。
<?php$data = "Stuff you want encrypted" ;
$key = "Secret passphrase used to encrypt your data" ;
$cipher = "MCRYPT_SERPENT_256" $mode = "MCRYPT_MODE_CBC" ;function encrypt( $data, $key , cipher , $mode ) {// Encrypt datareturn (string) base64_encode ( mcrypt_encrypt ( $cipher , substr (md5( $key ),0,mcrypt_get_key_size( $cipher , $mode )), $data , $mode , substr (md5( $key ),0,mcrypt_get_block_size( $cipher , $mode )) ) );
}function decrypt( $data , $key ,$cipher , $mode ) {// Decrypt data
return (string) mcrypt_decrypt ( $cipher , substr (md5( $key ),0,mcrypt_get_key_size( $cipher , $mode )), base64_decode ( $data ), $mode , substr (md5( $key ),0,mcrypt_get_block_size( $cipher , $mode )) );
}?>
mcrypt函數需要以下信息:
1、待加密數據
2、用來加密和解密數據的key
3、用戶選擇的加密數據的特定演算法(cipher:
如 MCRYPT_TWOFISH192
,MCRYPT_SERPENT_256, MCRYPT_RC2
, MCRYPT_DES
, and MCRYPT_LOKI97
)
4、用來加密的模式
5、加密的種子,用來起始加密過程的數據,是一個額外的二進制數據用來初始化加密演算法
6、加密key和種子的長度,使用mcrypt_get_key_size函數和mcrypt_get_block_size函數可以獲取如果數據和key都被盜取,那麼攻擊者可以遍歷ciphers尋找開行的方式即可,因此我們需要將加密的key進行MD5一次後保證安全性。同時由於mcrypt函數返回的加密數據是一個二進制數據,這樣保存到資料庫欄位中會引起其他錯誤,使用了base64encode將這些數據轉換為了十六進制數方便保存。
;『貳』 php怎麼防止抓包工具
我是做數據採集的,
在我看來,除了輸入驗證碼 , 沒有什麼能對我起到很好的防採集,
一般大的網站都是採用 網頁加入一次性隨機值 ,再有前端JS 生成秘鑰 ,最後一並提交加密了的數據 ,這種沒什麼效果 。對一般的人可以做下防禦 。但是,我只要找出它的JS加密函數 。 使用一個JS伺服器(node.js),或php的 php 改寫的js加密實現過程 ,加密初始值,再模擬發送 。所以,這個也沒什麼多大作用 。
對於驗證碼 ,一般簡單的都可以程序識別 ,復雜的提交到前台讓手動輸入 。再一並發送。 這種用戶體驗不好。 慎行。
總的來說,建議用JS 加密吧 。
但是,還是防禦不了。
我一般用 filefox 的 filebug 或 小提琴工具 。
目前大半年了,沒有破解不了的網站 。
我用我的php程序 ,可以操作你的網站 。實現 用戶操作 我的php程序 ,我的php程序 再去操作源網站 。
你可以去研究下 58同城網 的登錄 。那裡面一堆的加密 。 在我看來都是垃圾代碼 。 我的程序一鍵登錄進去。
『叄』 php防止sql注入的函數介紹
具體用法
addslashes防止SQL注入
雖然國內很多PHP程序員仍在依靠addslashes防止SQL注入 還是建議大家加強中文防止SQL注入的檢查 addslashes的問題在 於黑客 可以用 xbf 來代替單引號 而addslashes只是將 xbf 修改為 xbf c 成為一個有效的多位元組字元 其中的 xbf c仍會 被看作是單引號 所以addslashes無法成功攔截
當然addslashes也不是毫無用處 它是用於單位元組字元串的處理 多位元組字元還是用mysql_real_escape_string吧
另外對於php手冊中get_magic_quotes_gpc的
舉例
代碼如下<?php function post_check($post) { if (!get_magic_quotes_gpc()) // 判斷magic_quotes_gpc是否為打開 { $post = addslashes($post); // 進行magic_quotes_gpc沒有打開的情況對提交數據的過濾 } $post = str_replace("_" "_" $post); // 把 _ 過濾掉 $post = str_replace("%" "%" $post); // 把 % 過濾掉 $post = nl br($post); // 回車轉換 $post= specialchars($post); // 標記轉換 return $post; } ?>
或
<?php function inject_check($sql_str) { return eregi( select|insert|update|delete| | function verify_id($id=null) { if (!$id) { exit( 沒有提交參數! ); } // 是否為空判斷 elseif (inject_check($id)) { exit( 提交的參數非法! ); } // 注射判碰仔肆斷 elseif (!is_numeric($id)) { exit( 提交的參數非法! ); } // 數字判斷 $id = intval($id); // 整型化 return $id; } ?>
string mysql_real_escape_string ( string $unescaped_string [ resource $link_identifier ] )
本函數將 unescaped_string 中的特殊字元轉義 並計及連接的笑轎當前字元集 因此可以安全用於 mysql_query()
Note: mysql_real_escape_string() 並不轉義 % 和 _
mysql_real_escape_string
Example# mysql_real_escape_string() 例子
代碼如下<?php $item = "Zak s and Derick s Laptop" ; $escaped_item = mysql_real_escape_string ( $item ); printf ( "Escaped string: %sn" $escaped_item ); ?>
以上例子將產生如下輸出
Escaped string: Zak s and Derick s Laptop
mysql_escape_string
本函數將 unescaped_string 轉義 使之可以安全用於 mysql_query()
注: mysql_escape_string() 並不轉義 % 和 _
本函數和 mysql_real_escape_string() 完全一樣 除了 mysql_real_escape_string() 接受的是一戚並個連接句柄並根據當前字元集轉移字元串之外 mysql_escape_string() 並不接受連接參數 也不管當前字元集設定
例子 mysql_escape_string() 例子
代碼如下<?php $item = "Zak s Laptop"; $escaped_item = mysql_escape_string($item); printf ("Escaped string: %sn" $escaped_item); ?> 輸出 Escaped string: Zak s Laptop
mysql_real_escape_string和mysql_escape_string這 個函數的區別
mysql_real_escape_string 必須在(PHP >= PHP )的情況下才能使用 否則只能用 mysql_escape_string 兩者的區別是 mysql_real_escape_string 考慮到連接的當前字元集 而mysql_escape_string 不考慮
我們可以利用判斷來綜合處理
代碼如下 function cleanuserinput($dirty){ if (get_magic_quotes_gpc()) { $clean = mysql_real_escape_string(stripslashes($dirty)); }else{ $clean = mysql_real_escape_string($dirty); } return $clean; }總結一下
* addslashes() 是強行加;
* mysql_real_escape_string() 會判斷字元集 但是對PHP版本有要求;
lishixin/Article/program/PHP/201311/21094
『肆』 怎麼用php把一整套網站扒下來
仿站小工具+V8.2
『伍』 php文件如何防止被下載
下載也看不到源代碼的.下載的是轉譯過的HTML代碼.
如果你擔心你的源代碼安全,可以用safeguard加密一下.
『陸』 php文件能不能扒下來
可以扒,但前提是別人得允許你訪問,你得獲取開放地址。
PHP(PHP: Hypertext Preprocessor)即「超文本預處理器」,是在伺服器端執行的腳本語言,早談局尤其適用於Web開發並可嵌入HTML中。PHP語法學習了C語言,吸納Java和Perl多個語言的特色發展出自己的特色語侍野法,並根據它們的長項持續改進提升自己。
例如java的面向對象編程,該語言當初創建的主要目標是讓開發人員快速編寫出優質的web網站。PHP同時支持面向對象和面向過程的開發,使用上非常靈活。
經過二十多年的發展,隨著php-cli相關組件的快速發展和完善,PHP已經可以應用在TCP/UDP服務、高性能Web、WebSocket服務、物聯網、實時通訊、游戲、微服務等非 Web 領域的系陸讓統研發。
『柒』 如何實現php整站下載
現在網上的整站下載器只能下載html,css,js,圖片,php代碼和資料庫只能進到伺服器里才能看到,所以想要下載出後台文件基本是不可能的。
IIS7整站下載器可以有下述功能:1、可多站同時下載、多站同時扒
2、可單頁扒
3、可自定義, 重寫JS\圖片\CSS路徑
4、執行全站下載後,會下載到本程序根目錄下的html文件夾下。
5、全站替換,根據關鍵詞替換。N個(多個)關鍵詞替換。
6、多線程下載
7、自動補齊404不存在的鏈接頁面(下載大站的時候需要)
8、插入自定義的JS(全站插入)
9、整站下載
10、單頁下載
『捌』 我想扒一個很漂亮的站點下來做為自己的模版,但是wordpress是.php文件我扒下來的是html文件怎麼搞!
像你說的直接把其他程序如DEDE,陪吵PHPCMS的模板拿來給WP使用是不可能的。
WP是不支持HTML的,你只能把HTML改寫成PHP調用,也就是仿模板。這是個技術活,但不是很難,你只需要一張首頁靜態頁面:index.html,包括它的圖片等,一個CSS代碼,就可以修改成WP的模板。在這里我說下簡單的原理:就是把index.html拆分成index.php(主體),header.php(頂部),footer.php(底部),sidebar.php(邊欄)等等。
姿宴HTML代碼生成的網頁是完整的一頁,而對於WP來說,當你寫一篇文章生成一個網頁的時候,實際上WP是調用了我上面說的這些位置的PHP代碼(代碼部分用的大部分是WP程序自帶的PHP命令,所跡亂銀以不能和DEDE等其它程序共用模板),整合成這樣的一個頁面。