- 帖子
- 1008
- 主题
- 761
- 精华
- 0
- 积分
- 1794
- 贡献
- 941
- 激情
- 7771
- 阅读权限
- 100
- 最后登录
- 2020-4-28
|
[安全] 这样完美解决Nginx的跨站(防WEB shell)安全问题
看了很多方法,试了一下这个最好用,需要更改php源程序后,重新编译php。在使用fpm方式安装时,打补丁过程中会修改php的文件,所以需要在打完fpm补丁后再修改php源程序。; d6 r" k, S# X2 w
- D! a$ W# U t5 o$ R
tar zxvf php-5.2.14.tar.gz
! q6 X" w3 a: a, F/ Qgzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1 O8 g: z' k. {" _* s
cd php-5.2.14/
) e8 [- B2 P3 {) Z9 K- E( k2 ?* ?# ]0 y9 b% G4 O" m+ h
vi main/fopen_wrappers.c2 W! W( a& [% n. }4 f, N7 Z2 v" d: g
* }% a) I- I" J M- [ U9 N) u4 h1 R9 x0 J0 L# B2 L
- /* {{{ php_check_open_basedir
- */
- PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
- {
- /* Only check when open_basedir is available */
- if (PG(open_basedir) && *PG(open_basedir)) {
- char *pathbuf;
- char *ptr;
- char *end;
- // 添加的内容开始
- char *env_document_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
- if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
- efree(env_document_root);
- return 0;
- }
- // 添加的内容结束
- pathbuf = estrdup(PG(open_basedir));
- ptr = pathbuf;
- while (ptr && *ptr) {
- end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
- if (end != NULL) {
- *end = '\0';
- end++;
- }
- if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
- efree(pathbuf);
- return 0;
- }
- ptr = end;
- }
- if (warn) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
- }
- efree(pathbuf);
- errno = EPERM; /* we deny permission to open it */
- return -1;
- }
- /* Nothing to check... */
- return 0;
- }
复制代码
# S9 i2 ]; W3 x+ j% t4 E r+ f9 W4 K
需要添加的内容用红色表示出来了,然后重新编译安装php即可。经亲测可用。
" y! Y# `5 y) H2 ^
2 d {6 [9 H4 g/ M8 L( ^ r" {使用phpspy2008测试,无法浏览其他目录。
9 Z6 h V! ?. z: h, w+ K参考: http://www.xpb.cn/blog/743.html |
|