Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安全存储PHP变量值_Php_Variables_Passwords - Fatal编程技术网

安全存储PHP变量值

安全存储PHP变量值,php,variables,passwords,Php,Variables,Passwords,目前,我的Web服务器上的文件夹中有两个文件,一个叫做password.php。该文件包含一行: <?php $password = 'my_password' ?> 另一个php文件包含脚本,我只想在正确的密码参数发布到页面时执行该脚本。我把它设置成这样 <?php require 'password.php'; if (isset($_POST["Password"]) & $_POST["Password"] == $password){ //Exe

目前,我的Web服务器上的文件夹中有两个文件,一个叫做password.php。该文件包含一行:

   <?php $password = 'my_password' ?>

另一个php文件包含脚本,我只想在正确的密码参数发布到页面时执行该脚本。我把它设置成这样

<?php require 'password.php';

if (isset($_POST["Password"]) & $_POST["Password"] == $password){
//Execute code...
}

else {
echo "Error";
}

?>
/userName/app
  controllers
  models
  templates
  views
  config.php
  router.php

/userName/public
  css
  js
  index.php

现在我的问题是,这是否是一种安全的方法,可以确保不需要的人无法通过手动向页面上发布信息来执行该脚本?我被告知,如果脚本处理器被禁用,服务器可以将原始脚本发送回服务器。这是否意味着人们可以故意禁用www.mysite.com/directory/password.php上的处理器,并查看$password变量的值

我被告知:“将password.php文件放在一个单独的文件中,并将其存储在www目录上方的一个目录中。然后,它将只能通过本地文件系统访问,而不能通过外部世界的HTTP访问。”


上述建议究竟是什么意思?我应该做些什么来使密码更安全吗?

也许这不是一个有用的答案,但是一个很好的提示:永远不要使用硬编码的php变量来存储密码。在web目录上方使用htpasswd,或将密码存储在数据库中,并以最小值散列。

使用ftp(或用于传输文件的任何协议)连接到主机提供商时,文件夹结构如何?通常你会有

/yourUserName/public
or
/yourUserName/public_html
您可以在yourdomain.com上上传所有文件。您可以将配置文件(实际上几乎所有服务器端文件)放在public dir之外。这意味着如果我转到yourdomain.com/config.php,它就不在那里了

我通常将我的整个应用程序放在public dir之外,所以看起来像这样

<?php require 'password.php';

if (isset($_POST["Password"]) & $_POST["Password"] == $password){
//Execute code...
}

else {
echo "Error";
}

?>
/userName/app
  controllers
  models
  templates
  views
  config.php
  router.php

/userName/public
  css
  js
  index.php

然后我通常在index.php中执行类似的操作:require'../app/config.php'

为了回答您的问题,您被告知将其放置在web可访问空间之外。这意味着,如果您的web服务器在/var/www/site上设置了文档根目录,那么您应该将其存储在该目录之外,可能存储在/var/www/data中,因为远程HTTP客户端不可能访问后者的目录

有几点建议:

密码不应以纯文本形式存储。它应该存储为散列。也许是这样的:

<?php $password = some-hash; ?>
<?php require '../password.php';

if (isset($_POST["Password"]) && crypt($_POST["Password"]) == $password) {
    //Execute code...
} else {
    echo "Error";
}

?>
以上只是一个例子。。有关如何使用该函数以获得最佳安全性的更多信息,请查看PHP手册中的函数


出于安全目的,存储类型(PHP文件、数据库等)实际上并不重要。重要的是,浏览器无法访问密码,并且密码不是以明文形式存储的。

当您使用ftp(或用于传输文件的任何协议)连接到主机提供商时,文件夹结构如何?通常你会有/yourUserName/public,或者public_html,在这里你可以上传所有文件,这些文件应该可以在yourdomain.com上找到。您可以将配置文件(实际上几乎所有服务器端文件)放在public dir之外。这意味着如果我去yourdomain.com/config.php,它就不在那里了。部分答案:这意味着“…位于www目录之上”,就是把它放在你的
cgi-bin
文件夹中,而不是你的
public\u-html
文件夹中。例如,我仍然使用
.txt
来存储信息,并且受到
.htaccess
文件的保护。
.txt
文件存储在my
cgi bin
文件夹的子文件夹中,并受
.htaccess
保护。这不是保护站点的好方法。有一条规则。切勿在代码中使用硬编码的密码。有人可以访问服务器上的文件并读取您的密码顺便说一句,这一行
if(isset($\u POST[“Password”])&$\u POST[“Password”]==$Password)){
将向您抛出一个错误。看看您是否可以找出原因,或者,这是(语法错误)故意输入错误?@sinaneker关于在公共目录外存储硬编码密码和在数据库中存储密码之间的区别,你有什么链接/信息吗?我同意应该对其进行散列,但我看不出存储的位置有什么关系。如果有什么我认为数据库是网站上最常被破坏的一层,那么在这种情况下,你可以忽略它密码。如果你访问文件,那么你也可以访问数据库。或者你建议如何存储数据库的用户凭据?仅供参考:你保留了与OP相同的语法错误。因此理论上,你的答案(代码)也会抛出错误消息。看看你是否也能找到它们。(眨眼).P.s.:如果你收到任何反对票,它不会来自我。只是说。谢谢你的提醒,但是当我在本地系统“test2.php”上写下这个文件并运行“php-l test2.php”时,它会返回“test2.php中未检测到语法错误”.IOW,根据PHP,没有语法错误。因此,如果您能指出这些错误,我将不胜感激。不客气。但是,您是否已经对OP(和您的)代码?当然不会抛出错误,问问自己原因。-)我测试了我的代码以验证它是否可以运行,我没有测试功能,因为它对我的观点并不重要。错误是if条件中的单个符号(我已经编辑并修复了它)。但这不是语法错误,这是您最初指出的:-)。语法错误会导致解释器抛出错误。干得好!但这不是“语法错误”,还是我使用了错误的术语?或者我应该使用“语法编写错误”?