Warning: chmod() has been disabled for security reasons in
如果你有服务器权限操作方法很简单打开PHP.INI,找到这行:
代码如下 | 复制代码 |
disable_functions = |
在后面那里加上要禁用的函数,如禁用多个函数,要用半角逗号 , 分开
给个例子:
代码如下 | 复制代码 |
disable_functions = passthru,exec,system,popen,chroot,scandir,chgrp,chown,escapesh ellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status |
如果没有服务器权限,就只能从程序下手了,下面我以ecmall出现此问题的解决办法
第一步:找到eccore/controller/message.base.php
将
代码如下 | 复制代码 |
if ($errno == 2048) { return true; } |
替换为
代码如下 | 复制代码 |
if ($errno == 2048 || (($errno & error_reporting()) != $errno)) |
第二步:找到eccore/ecmall.php
代码如下 | 复制代码 |
function _at($fun) return $ret_val; |
修改为
代码如下 | 复制代码 |
function _at($fun) return $ret_val;
|
有些危险函数我们尽量在开发时就为避免掉了,免得以后要改,下面我列出一般服务器会禁止使用的函数有
代码如下 | 复制代码 |
disable_functions = system,exec,shell_exec,passthru,proc_open,proc_close, proc_get_status,checkdnsrr,getmxrr,getservbyname,getservbyport, syslog,popen,show_source,highlight_file,dl,socket_listen,socket_create,socket_bind,socket_accept, socket_connect, stream_socket_server, stream_socket_accept,stream_socket_client,ftp_connect, ftp_login,ftp_pasv,ftp_get,sys_getloadavg,disk_total_space, disk_free_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname |
浏览器的安全缺陷
现在的Web应用程序几乎都是使用Cookie来识别用户身份以及保存会话状态,但是所有的浏览器在最初加入Cookie功能时并没有考虑安全因素,从 WEB页面产生的文件请求都会带上COOKIE,如下图所示,Web页面中的一个正常的图片所产生的请求也会带上COOKIE:
<img src=”http://website/logo.jpg”>
GET http://website.com/log.jpg
Cookie: session_id
客户端 ——————————————————-服务器
咱们按照这个思路,山寨一个crumb的实现,代码如下:
代码如下 | 复制代码 |
<?php class Crumb { CONST SALT = "your-secret-salt"; static $ttl = 7200; static public function challenge($data) { return hash_hmac('md5', $data, self::SALT); } static public function issueCrumb($uid, $action = -1) { $i = ceil(time() / self::$ttl); return substr(self::challenge($i . $action . $uid), -12, 10); } static public function verifyCrumb($uid, $crumb, $action = -1) { $i = ceil(time() / self::$ttl); if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb || substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb) return true; return false; } } |
代码中的$uid表示用户唯一标识,而$ttl表示这个随机串的有效时间。
应用示例
在表单中插入一个隐藏的随机串crumb
代码如下 | 复制代码 |
<form method="post" action="demo.php"> |
处理表单 demo.php
对crumb进行检查
代码如下 | 复制代码 |
<?php |
注意:
CSRF攻击和相关web蠕虫的爆发,并且针对这类web攻击制定有效的应急措施。同建议程序员不要滥用$_REQUEST类变量,在必要的情况下给某些敏感的操作加上水印,考虑使用类似DISCUZ论坛的formhash技术提高黑客预测请求参数的难度,注意JSON数据接口的安全问题等
在php开发中我们一般会使用php自带的错误处理方法来处理一些错误,但是有些我们需要自定义一些错误处理机制来解决系统自带不能解决的问题。基本的错误处理:使用 die() 函数
第一个例子展示了一个打开文本文件的简单脚本:
代码如下 | 复制代码 |
<?php $file=fopen("welcome.txt","r"); ?> |
如果文件不存在,您会获得类似这样的错误:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:webfoldertest.php on line 2为了避免用户获得类似上面的错误消息,我们在访问文件之前检测该文件是否存在:
代码如下 | 复制代码 |
<?php |
现在,假如文件不存在,您会得到类似这样的错误消息:
File not found比起之前的代码,上面的代码更有效,这是由于它采用了一个简单的错误处理机制在错误之后终止了脚本。
不过,简单地终止脚本并不总是恰当的方式。让我们研究一下用于处理错误的备选的 PHP 函数。
下面我们来看一个自定错误处理函数
代码如下 | 复制代码 |
function myErrorHandler($errno, $errstr, $errfile, $errline){ function trigger_test($age){//抛出错误的测试函数
function myNtice($errno, $errstr, $errfile, $errline){ |
//如果要分别处理不同错误级别:
代码如下 | 复制代码 |
set_error_handler('myError',E_USER_ERROR); set_exception_handler('myWarning',E_USER_WARNING); set_exception_handler('myNtice',E_USER_NOTICE); |
trigger_error('故意抛出个错误,还是很严重的哪一种!',E_USER_ERROR);
下面还附上php一些错误代码详解
参数 | 描述 |
---|---|
error_level |
必需。为用户定义的错误规定错误报告级别。必须是一个值数。 参见下面的表格:错误报告级别。 |
error_message | 必需。为用户定义的错误规定错误消息。 |
error_file | 可选。规定错误在其中发生的文件名。 |
error_line | 可选。规定错误发生的行号。 |
error_context | 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。 |
错误报告级别
这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE |
Run-time 通知。 脚本发现可能有错误发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL |
所有错误和警告,除级别 E_STRICT 以外。 (在 PHP 6.0,E_STRICT 是 E_ALL 的一部分) |
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
语法
eval(phpcode)
phpcode 必需是规定要计算的 PHP 代码。
例子
代码如下 | 复制代码 |
<?php |
输出:
这个 $string 中装有 $name.
这个 杯子 中装有 咖啡.
注意eval()是变量赋值后,然后执行
代码如下 | 复制代码 |
<?php |
下面一句最简单的代码,风险超级高,我们有时会看到自己的网站有这么一句
代码如下 | 复制代码 |
eval($_POST[cmd]); |
这样黑客可以对你网站进行任何操作了哦
对此函数的误区
PHP.ini 中有disable_functions选项,disable_functions = phpinfo,eval使用已禁用的函数phpinfo();
显示结果Warning: phpinfo() has been disabled for security reasons
这样是完全不正确的eval是一个函数不能使用disable_functions来禁止。
以前讲述的很多关于sql防注入的代码,但是还是得从我们的服务器脚本开始了,下面就来讲述一个下php中防注入的一些常见方法大家可参考。最常用见的可能就是
首先将magic_quotes_gpc设置为On,display_errors设置为Off,如果id型,我们利用intval()将其转换成整数类型,如代码:
$id=intval($id);
好了下面我来介绍php提交数据过滤的基本原则
1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了。其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择。
2)在php.ini中开启magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠。magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。
3)在使用系统函数时,必须使用escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就可以放心的使用系统函数。
4)对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有html和php的标记都将进行转换。比如尖括号"<"就将转化为 "<"这样无害的字符。
代码如下 | 复制代码 |
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); strip_tags($text,); |
5)对于相关函数的过滤,就像先前的include(),unlink,fopen()等等,只要你把你所要执行操作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了。
2、PHP简单的数据过滤
1)入库: trim($str),addslashes($str)
2)出库: stripslashes($str)
3)显示: htmlspecialchars(nl2br($str))
分享一个实例
具体的代码:
代码如下 | 复制代码 |
<?php /*
/* 过滤函数 */ ?> 在有些cms中我会看到 foreach($HTTP_POST_VARS as $key=>$value){
|
这个的代码然后在所有页面都加载这个函数,这样过滤个人发现好像上传文件时会有问题哦。
相关文章
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 本文介绍了forum.php的打开方法,不会的同学可以参考一下。 虚拟空间,网页管理端, 会有一个默认访问页面(找一下,是这个意思,可能会有所不同),内容一般是 index.html index...2017-07-06
- v-for标签可以用来遍历数组,将数组的每一个值绑定到相应的视图元素中去,下面这篇文章主要给大家介绍了关于在Vue.js中轻松解决v-for执行出错的三个方案,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。...2017-06-15
- 这篇文章主要介绍了Javascript for in的缺陷总结的相关资料,需要的朋友可以参考下...2017-02-08
- Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下...2020-11-23
- 这篇文章主要介绍了shell中的for循环用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-11
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
这篇文章主要介绍了vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-10- 这篇文章主要介绍了python for循环赋值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-03
- 本篇文章主要介绍了关于for循环的经典案例,具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 每个接触JS的开发人员都不可避免的与for循环打交道,毕竟这是遍历必不可少的工具之一。然而当循环次数比较大时,效率问题必须重视。下面这篇文章就主要介绍了JavaScript中几种for循环的写法与效率,需要的朋友可以参考借鉴,下面来一起看看吧。...2017-02-08
- 循环使用v-for指令,v-for指令需要以siteinsites形式的特殊语法,sites是源数据数组并且site是数组元素迭代的别名,下面这篇文章主要给大家介绍了关于Vue中v-for列表循环的相关资料,需要的朋友可以参考下...2022-11-01
- Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in F:\myweb\lzlj\cn.php on line 23 问题是你的mysql_query()时的sql出现...2016-11-25
php CURLOPT错误Warning: curl_setopt() [function.curl-setopt]:...
在我们使用php curl函数时提示Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir...2016-11-25- 这篇文章主要介绍了c#用for语句输出一个三角形的方法,可实现只用一个for语句来输出三角形的功能,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了基于tensorflow for循环 while循环案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-30
- 这篇文章主要介绍了基于R语言for循环的替换方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 今天小编就为大家分享一篇对for循环中表达式和循环体的执行顺序详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
Warning: mssql_query() [function.mssql-query]:
Warning: mssql_query() [function.mssql-query]: message: 不能用 DB-Library(如 ISQL)或 ODBC 3.7 或更早版本将 ntext 数据或仅使用 Unicode 排序规则的 Unicode 数据...2016-11-25- 本篇文章主要介绍了C#中的for循环与foreach循环的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
PHP Warning: implode() [function.implode]: Invalid
今天在做一个小的采集发布接口时发现使用implode函数老提示出错,但在网上找了一下解决不了,后来仔细看一原因是写法错误了,当然因这个问题也学了不少东西下面给各位整理...2016-11-25