标签: php

当所有 php 脚本都有缺陷时,我应该如何设置数据库以防止 sql 注入?

我继承了一个非常不安全的 php web 应用程序,有 sql 注入的历史。我无法立即修复脚本,我宁愿需要它们运行才能使网站运行,并且有太多的 php 脚本需要首先从 php 端处理。但是,我确实可以完全控制服务器和服务器上的软件,包括完全控制 mysql 数据库及其用户。

让我们估计它总共有 300 个脚本、40 个半私有脚本和 20 个私有/安全脚本。

所以我的问题是如何最好地保护数据,隐含假设来自 php 端的 sql 注入(例如在 300 个脚本列表中的某个地方)是不可避免的?

我的初稿计划是在 mysql 数据库中创建多层不同权限的用户。这样我可以先保护最需要保护的数据和脚本(“私有/安全”类别),然后是第二层数据库表和脚本(“半私有”),最后处理整个 php 应用程序的其余部分(最终保护主要处理“公共”信息的数据库表的结果,例如,即使只是查看主页也需要的东西)。

因此,3 个数据库用户(公共、半私有和安全),三个不同的脚本组(安全脚本、半私有脚本和公共脚本)中的每一个都有不同的用户连接。通过这种方式,我可以阻止从“公共”或“半私有”访问“安全”,以及从“公共”访问“半私有”。我应该考虑其他替代方案吗?如果要采用分层访问系统,那么哪种方法最好?

mysql security php sql

6
推荐指数
1
解决办法
1250
查看次数

需要帮助解决 PHP-fpm 高 CPU 使用率问题

有一个问题让我抓狂。有一天我尝试修复 VPS 的 CPU 使用问题后,CPU 负载从 60% 增长到 150%,而且我不知道是什么原因导致了问题。请帮我。

我在 Linode 1024 上安装了 mediawiki 的副本。该 wiki 运行在 Niginx + PHP-fpm + MySql 上。该 wiki 的流量并不多,每天只有大约 4000 个请求,大部分来自 Google 和 Bing 机器人。之前它使用了大约 60% 的 CPU(Linode 上总共使用了 400%)。我认为它有点高,所以两天前,我试图解决这个问题(不知道等待我的是什么)。我什么也没做,只是在wiki的配置文件中添加了一个新的空行,这会改变配置文件的修改时间,然后所有缓存的页面文件将被设置为无效。我以前也这样做过,这会导致 CPU 使用率很高,但通常只需要几个小时就能让一切恢复正常。不是这次,我的CPU使用率已经两天多在150%左右了。

使用大部分CPU的就是php-fpm。100%使用三核的情况并不罕见。我以前没见过。Linode上还有其他网站,但应该是wiki。因为如果我将 wiki 离线,CPU 使用率很快就会回落到 40% 左右。

那天我还复制了 php-fpm.conf 并打开它,但没有更改它。

我不知道我做错了什么。我在这里请求帮助,以免自己陷入疯狂!它是 php-fpm。有没有办法知道它在做什么?我的意思是哪些脚本相关以及哪些功能代码正在运行?

顶部:

top - 06:34:33 up 10 days,  4:23,  2 users,  load average: 1.10, 1.24, 1.37
Tasks:  76 total,   4 running,  72 sleeping,   0 stopped,   0 zombie
Cpu(s): 61.1%us,  3.1%sy,  0.0%ni, 32.8%id, …
Run Code Online (Sandbox Code Playgroud)

php mediawiki php-fpm cpu-usage

6
推荐指数
1
解决办法
4万
查看次数

本地 php.ini 不覆盖主 php.ini

我似乎无法在网站根目录(/var/www)中获取 php.ini 文件来覆盖 /etc/php5/apache2 中的 php.ini 值

/var/www/php.ini 内容

upload_max_filesize = 64M
post_max_size = 64M
Run Code Online (Sandbox Code Playgroud)

但同一目录中的页面分别显示它们和phpinfo()的默认值。而wordpress显示最大上传大小为2MB。2M8M

操作系统:Ubuntu 14.04 LTS PHP:5.5.9-1ubuntu4

有什么想法吗?

ubuntu php

6
推荐指数
2
解决办法
2万
查看次数

在 Ubuntu 上运行 PHP 的 www-data 用户的 umask

在 Ubuntu 14.04 中设置一个新的网络服务器并尝试为 PHP 生成的文件争论文件权限。

默认情况下,其中的所有目录和文件/var/www都属于/分组到 www-admin。目录权限为rwxrwsr-x,文件权限为rw-rw-r--。

然后,我们将有限数量的目录上的组设置为 www-data - 这样 PHP(通过 Apache)就可以在此位置写入日志和缓存文件。

但是,我无法让 PHP 遵守 umask 0002,因此 PHP 生成的文件只能写入 www-data 用户。这是一个问题,因为我们使用持续集成和其他一些清理流程。

到目前为止,我有:

  • 将 umask 设置为 0002/etc/pam.d/common-session
  • 将 umask 设置为 0002/etc/pam.d/common-session-noninteractive
  • 将 umask 设置为 0002/etc/profile
  • 将 umask 设置为 0002/etc/apache2/envvars
  • 将 umask 设置为 0002/etc/login.defs
  • 使用www-data时将 umask 设置为 0002/etc/passwdsudo chfn -o "umask=002" daemon_username

我仍然被困住了。

我已经停止/启动了该服务,甚至重新启动了计算机 - 没有乐趣。

php file-permissions umask apache-2.4 ubuntu-14.04

6
推荐指数
1
解决办法
2万
查看次数

从上游读取响应标头时上游过早关闭连接 502 Bad GateWay

nginx 正在杀死我.. 所以现在我有 502 Bad Gateway。错误日志说:

2016/10/12 17:39:53 [info] 3023#0: *464 client closed connection while waiting for request, client: 127.0.0.1, server: 0.0.0.0:443
2016/10/12 17:39:53 [info] 3023#0: *465 client closed connection while waiting for request, client: 127.0.0.1, server: 0.0.0.0:443
2016/10/12 17:39:55 [error] 3023#0: *459 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: local.beerhawk.co.uk, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "local.mydomain.co.uk"
Run Code Online (Sandbox Code Playgroud)

我的 ngninx conf 文件现在看起来像这样:

#user  RobDee;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  info;
pid        logs/nginx.pid; …
Run Code Online (Sandbox Code Playgroud)

php nginx mac-osx

6
推荐指数
1
解决办法
3万
查看次数

Nginx + PHP 最大输出限制

我安装了 php 5.5 (fpm) 和 nginx 1.10(gzip 配置为 1)。在 ubuntu 上运行。

当我“回应”一个大输出(超过 2 mb)时,它突然停止在 520 kb 左右。

但是当我在 php-cli 上运行相同的程序时,将整个内容“回显”到终端上没有问题。

通过 adminer 下载 mysql 转储也中途停止。我的意思是下载不完整的文件(如果正确的总输出大几 MB)。

如何解决这个问题?

我的程序没有任何问题。即使是一个足够长的简单循环,也可以在特定字节限制处停止回声“hello world”。

我不确定这个问题是由 nginx 端还是 php 端引起的。

php nginx php-fpm php-cli

6
推荐指数
1
解决办法
1080
查看次数

将 systemd 用于 Apache 环境变量或 SetEnv?

我的系统:

  1. CentOS 7.2.1511(核心)
  2. 阿帕奇 2.4.6

我有很多环境变量想添加到 Apache 中。

我目前正在通过添加到我的/etc/httpd/conf.d/vhosts.conf文件中来做到这一点:

SetEnv API_USERNAME 'my_special_username'
SetEnv API_PASSWORD 'my_special_password'
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式访问 PHP 中的两个环境变量:

echo $_SERVER['API_USERNAME'];
echo $_SERVER['API_PASSWORD'];
// or
echo getenv('API_USERNAME');
echo getenv('API_PASSWORD');
Run Code Online (Sandbox Code Playgroud)

最近,我发现我还可以通过添加环境变量systemd:

我创建文件/etc/systemd/system/httpd.service.d/envvars.conf:

[Service]
Environment="API_USERNAME=my_special_username"
Environment="API_PASSWORD=my_special_password"
Run Code Online (Sandbox Code Playgroud)

其次是

systemctl daemon-reload

systemctl restart httpd

我可以通过以下方式访问 PHP 中的两个环境变量:

echo getenv('API_USERNAME');
echo getenv('API_PASSWORD');
// $_SERVER does not work when I specify environment variables in systemd
echo $_SERVER['API_USERNAME']; // returns blank
echo $_SERVER['API_PASSWORD']; // returns blank
Run Code Online (Sandbox Code Playgroud)

题

在安全性或最佳实践方面,最好使用 SetEnv 或systemd …

php redhat centos systemd apache-2.4

6
推荐指数
1
解决办法
4764
查看次数

Apache 的 mod_rewrite 和 PHP 的 REQUEST_URI 变量

我有一个问题,ApachePHP $_SERVER['REQUEST_URI']在 URL 被重写而不是原始请求后将 URL传递给变量。

我正在做这个重写,因为我有一个 WordPress 网站,想把它移动到一个子目录而不是把它放在根路径中,但仍然想保持它的 URL 作为根 URL。

这不会一直发生。如果我请求www.xyz.com/wp-admin它填充 PHPREQUEST_URI变量www.xyz.com/wordpress/wp-admin(这是重写后的 URL),但如果我请求www.xyz.com/wp-admin/(带有尾部斜杠),它实际上填充 PHPREQUEST_URI变量www.xyz.com/wp-admin/(重写之前的原始 URL)。我想要的是REQUEST_URI在重写之前用 URL 填充。

我的.htaccess文件如下:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?xyz.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wordpress/$1
RewriteCond %{HTTP_HOST} ^(www.)?xyz.com$
RewriteRule ^(/)?$ wordpress/index.php [L]
</IfModule>`
Run Code Online (Sandbox Code Playgroud)

PHP 版本是 5.3。Apache 版本是 2.4 (Win32)。


更新:我查看了更多,当我输入 URL 时,www.xyz.com/wp-admin首先会有一个 301 重定向,www.xyz.com/wordpress/wp-admin/但这不会发生 …

php mod-rewrite rewrite apache-2.4 apache2

6
推荐指数
1
解决办法
3110
查看次数

如何检查当前的 pm.max_children 设置?

我在/opt/plesk/php/7.0/etc/php-fpm.d/domain.com.conf文件中修改了 pm.max_children 。

我重新启动了 php70-fpm 服务,想检查我的设置是否启用。

如何检查此设置?

php php-fpm php7

6
推荐指数
1
解决办法
2879
查看次数

如何小幅更新PHP版本?

有很多关于将 PHP 升级到下一个主要版本的教程。如果我想对 PHP 进行小幅更新,例如 7.0.1 到 7.0.3,该怎么办?这样做的正确方法是什么?

在本例中,我使用 ubuntu 14。

ubuntu php

6
推荐指数
1
解决办法
6785
查看次数