php禁用eval
The eval() language construct is very dangerous because it allows execution of arbitrary PHP code.
eval是语言结构,不是函数,所以无法使用disable_functions
来禁用
之前写过:从 php 内核挂载钩子解密源码,禁用的原理和这个差不多
static zend_op_array* guard_compile_string(zval *source_string, char *filename)
{
// php_printf("s2: %s %Z\n", filename, source_string);
if (strstr(filename, "eval()'d code")) {
return NULL;
}
return old_compile_string(source_string, filename);
}
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(guard)
{
old_compile_string = zend_compile_string;
zend_compile_string = guard_compile_string;
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION(guard)
{
zend_compile_string = old_compile_string;
return SUCCESS;
}
为什么要写这篇文章
主要是因为之前太浪了:
- MySQL之类的端口都是直接绑定到公网的(并没有进行防火墙限制)
- 博客的目录权限为了偷懒直接设置成了 0777
最主要的是产生的严重后果:今天写文章的时候突然发现文章附件多了个为归属的fileadmin.zip;瞬间菊花一紧,上服务器一看,各种web shell。
在线工具的各种配置更新的还是比较及时,端口也收的比较紧,review之后发现应该不会产生类似的问题;这个问题暂时出现在了博客的vps上。
后面怎么解决这样的问题
- 不向外暴露内部的端口
- php hook eval
- 及时同步最新的php配置等
其他问题
laravel 中使用了 jeremeamia/superclosure
包,而这个包中使用了eval
,所以不能正常工作;这样就需要在上面的代码中做个白名单。