在网站上运行php脚本的最佳方式?

时间:2014-10-01 12:27:37

标签: php security

我想查看在网站上运行php脚本的最合适方法是什么,该网站会执行多项更新并对网站进行动态更改。

这些应该通过将php文件放在与网站其余部分相同的FTP目录并访问来运行 他们作为网页?如果是这样,我怎么能控制它,以便只有网络管理员可以访问这些链接或PHP脚本?

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以在包含管理脚本的文件夹上使用htaccess保护。

<强>的.htaccess

AuthName "Restricted Area" 
AuthType Basic 
AuthUserFile /var/www/mysite/.htpasswd 
AuthGroupFile /dev/null 
<Files my-protected-file.php>
require valid-user
</Files>

.htpasswd (用户:john,pw:john):

john:cH/Bl.u9Yl2x.

如果要保护位于FTP文件夹中的文件,请将htaccess / htpassword文件向上移动一级并调整路径或设置正确的权限以禁止阅读(请参阅注释)。

/var/www/mysite/ftp (contains your admin scripts and has ftp access)
/var/www/mysite (has no ftp access, so add your protection here)

答案 1 :(得分:0)

你给了我们一些细节,但我会尽我所能地回答你的问题。

  

这些应该通过将php文件放在与网站其余部分相同的FTP目录并将其作为网页访问来运行吗?如果是这样,我怎么能控制它,以便只有网络管理员可以访问这些链接或PHP脚本?

如果我是你,我会在PHP中添加自己的帐户管理系统,但不使用.htpasswd。然后我会用HTTPS保护它,这样就不会用数据包分析器来嗅探密码。与使用.htpasswd文件相比,HTTPS被认为是更强大的保护。

这样,为了执行更新,我必须在登录后点击一个按钮或类似的东西。这使您可以在将来轻松扩展管理面板并使其对人类友好。

仅通过访问URL做一些工作似乎非常脆弱。当它应该是API的一部分时非常有用,因此它对机器人友好(另请参见:REST API),但在这种情况下,可能不应该暴露给所有人。如果它将被机器人使用,但应该仅对“好”机器人可用,您可能想要了解REST身份验证方法(大多数依赖于某种形式的帐户)。

最后,如果您想以自动方式运行作业,请研究cron任务。然后,没有什么能阻止您创建执行相同代码的两个管理面板和cron作业。

如果您不想将其放在公共WWW文件夹中,那么只有那些具有SSH访问权限的人才能访问它(不要与FTP访问混淆)。这些人可以使用php script.php命令执行该脚本。我想这不是你想要的,因为你从来没有提到过SSH访问。此外,根据脚本和应用程序的性质,使管理员通过SSH连接到服务器以执行某些任务可能是也可能不是一个好主意。除了通过SSH之外,没有办法在WWW文件夹外执行脚本,除了cron作业。

答案 2 :(得分:0)

将您的php文件放在非www目录中。 例如,不要将PHP源文件放在public_html目录中,以免浏览器访问它们。

答案 3 :(得分:0)

您熟悉所设计的安全隐患吗?我假设您提到了一些问题,因为您提到了身份验证管理员。

Survive the Deep End OWASP Home Page

就个人而言,我不会通过Web界面访问您描述的脚本。此外,我不会使用FTP。我过去曾使用cron jobs + wget / curl来调用PHP脚本,而我从中看到的唯一好处就是一致的语言和一致的环境定义。如果您的环境中没有任何特殊的管理脚本需要它们并且它们按计划运行,那么您可以通过命令行从cron轻松调用服务器上的那些脚本(不要暴露脚本通过网络界面)。

如果维护脚本按计划运行,Cron最佳,但永远不需要手动运行。你使用过SSH吗?您是否知道可以在本地系统上执行的单个命令中执行远程服务器上的命令?它运行良好,可以解决您在服务器上验证管理员的问题 - 如果配置正确,SSH已经是一个强大的身份验证框架(根本不是很难)。

$ ssh username@server.domain.com "php /path/to/scripts/task1.php"
password:

凭据(即SSH请求的用户名/密码)是您在系统上定义的凭证(除非您使用的是Kerbose,ldap或类似的凭证管理基础结构)。

您也可以在不使用FTP的情况下将脚本更新到服务器;是的,我会让他们远离&#34;正常&#34;网络服务器脚本文件。也许您会发现在服务器上创建用户帐户很容易,让我们说您创建用户名维护,设置密钥身份验证并授权管理员通过将他们的公钥添加到/ home / maintenance来使用该帐户/.ssh/authorized_keys文件。通过这种方式你可以控制(读取限制在发生意外时可能造成的伤害,愤怒的管理员,疯狂的女朋友,外星人......这并不重要,因为你只给予维护用户权限并获得执行此操作所需的内容#39; s job,只能写入那些可以安全写入这些进程的区域,并将读取/执行权限限制在它不需要的区域.Jail或chroot很棒,但可能也有点在这一点上要担心。

BTW,您的FTP和Web服务器应该作为具有有限访问权限的用户(非root用户)运行。希望您已经熟悉我想要描述的概念。

想象一下这些帐户。

ADMIN1  描述:我决定信任一些webdude   - id_rsa   - id_rsa.pub

的admin2  描述:webdude的朋友;我持怀疑态度   - id_rsa   - id_rsa.pub

adminN  描述:我管理服务器的第N个管理员   - id_rsa   - id_rsa.pub

youruser   - id_rsa   - id_rsa.pub

服务器  用户:httpd / www-data  描述:运行Web服务器的用户帐户

用户:ftpd  描述:运行FTP服务器的用户帐户

用户:root  说明:默认帐户;为root禁用ssh登录(了解如何使用SUDO)

用户:admin  描述:设置服务器时创建的第一个用户帐户;这可能是您以远程方式登录的帐户,除非您创建的帐户与您的用户名相匹配或具有集中凭据管理。请勿让您的帐户访问此帐户。

用户:维护  描述:新创建的共享帐户,管理员可以根据需要使用它来执行服务器维护/更新脚本。或者,您可以根据与此帐户类似的有限权限模板为每个管理员创建自己的帐户。如果有很多管理员或高流动率,这是一个负担。共享帐户的主要缺点是,确定&#34;谁&#34;变得有点困难。正在登录,因为帐户是共享的 - 这是可能的,但并不像查看用户名那么容易;明显。

工作流。当您向团队添加/授权新管理员时,您要求他/她创建一个ssh密钥对(使用非空密码)并向您发送公钥。默认情况下,该文件将被调用&#34; id_rsa.pub&#34;如果世界上任何人都能看到该文件的内容,那就完全没问题 - 它是&#34; public&#34;密钥对的密钥。他们应该在不允许其他用户读取它的目录中保留对应的(在类似名称&#34; id_rsa&#34;)私钥中(这是〜/ .ssh目录的默认值)并且如果他们怀疑他们的私钥已被泄露,然后简单地创建一个新的对并扔掉旧的。

当您收到公钥时,您会将其添加到服务器的维护帐户authorized_keys文件中,如下所示;从您的本地系统,您将复制&#34; id_rsa&#34;密钥,他们创建并提供/分享给您直到服务器。

# just to set up the example (not required once you understand)
$ ssh maintenance@server.domain.com "ls ~/.ssh/
id_rsa   id_rsa.pub   admin1_id_rsa.pub 
known_hosts     authorized_keys2    ssh_config

# That's an example of the files you should might see if you you, admin1, and the 
# maintenance account itself were already set up.  The public are just for record
# keeping and not actually required once their contents are added to the authorized_keys
# file.  If you don't keep the admin's public key files, then the following two commands
# could actually be done in a single step, but I've shown them as two here for clarity.
#
# Copy the new guy's public keyfile up to the server (admin2)
$ scp id_rsa.pub maintenance@server.example.com:~/.ssh/admin2_id_rsa.pub
$ ssh maintenance@server.example.com "cat ~/.ssh/admin2_id_rsa.pub >> ~/.ssh/authorized_keys2

那就是它。您刚刚向服务器添加了新的管理员。如果你想限制他们登录到服务器,你可以配置帐户,同时仍然允许他们通过ssh远程执行php脚本。

这有意义吗?如果没有,请告诉我,我会为您解释。