添加备注

用户贡献的备注 13 个备注

15
dangan at blackjaguargaming dot net
17 年前
我建议使用 404 而不是 403,因为 403 证明存在值得入侵的东西。

index.php
<?php
define
('isdoc',1);
include(
'includes/include.sqlfunctions.php');
// index.php 的其余代码
?>

include.sqlfunctions.php(或其他包含文件)
<?php
if(isdoc !== 1) // 不等于 1
{
header('HTTP/1.1 404 Not Found');
echo
"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>404 Not Found</title>\n</head>";
echo
"<body>\n<h1>Not Found</h1>\n<p>The requested URL ".$_SERVER['REQUEST_URI']." was not found on this server.</p>\n";
echo
"<hr>\n".$_SERVER['SERVER_SIGNATURE']."\n</body></html>\n";
// 输出类似于 Apache 的默认 404(如果您使用的是 Apache)
exit;
}
// 此包含的其余代码
?>
13
k
17 年前
何不将 PHP 代码完全放在 web 根目录之外呢……?

您可以创建一个包含 css、html 等等以及 index.php 的公共目录。然后使用 include_path 设置指向实际 PHP 代码的位置,例如...

webstuff
phpcode
public
images
css
index.php

然后将 include 路径设置为 "../phpcode",并且,由于 PHP 是从脚本所在的目录执行的,因此一切都会正常。

我还建议将主索引命名为 "main.page" 或其他名称,而不是 "index.php",并更改 Web 服务器的默认索引页面。这样,您就可以避免受到在网络上搜索索引页面的工具的攻击。
14
djjokla AT gmail dot com
18 年前
如果必须包含单个文件,我会使用以下方法

index.php(将要包含该文件的位置)
___________
<?php
define
('thefooter', TRUE);
include(
'folder/footer.inc.php');
?>

然后,该页脚文件(例如)将如下所示

footer.inc.php(要包含的文件)
___________
<?php
defined
('thefooter') or die('Not with me my friend');
echo(
'Copyright to me in the year 2000');
?>

因此,当有人尝试直接访问 footer.php 文件时,他/她/它将在屏幕上看到 "Not with me my friend" 的消息。另一个选择是将要访问该文件的用户重定向到其他位置,因此,您需要在 footer.inc.php 文件中写入以下代码,而不是上面的代码。

<?php
defined
('thefooter') or header('Location: http://www.location.com');
echo(
'Copyright to me in the year 2000');
?>

在正常情况下,重定向到外部网站会让访问者感到厌烦,但由于该访问者更感兴趣的是入侵该网站而不是阅读内容,我认为这样做是合理的。我们并不希望这样的人访问我们的网站。

为了保护文件,我使用 .htaccess,在其中声明要保护该文件本身和所有 .inc 文件

<Files ~ "^.*\.([Hh][Tt]|[Ii][Nn][Cc])">
Order allow,deny
Deny from all
Satisfy All
</Files>

如果有人尝试直接访问这些文件,.htaccess 文件应该会返回一个错误 403。如果由于某种原因无法正常工作,则会出现 "Not with me my friend" 文本或重定向(取决于使用哪种方法)。

在我看来,这看起来不错且安全。
12
ocrow at simplexity dot net
21 年前
如果您的 PHP 页面 include() 或 require() 位于 Web 服务器文档根目录内的文件,例如与 PHP 页面位于同一目录的库文件,则必须考虑到攻击者可能直接调用这些库文件。

库文件中的任何程序级代码(即不是函数定义的一部分的代码)都将由调用者直接执行,并且不受预期调用序列范围的限制。攻击者可以利用此功能造成意外影响。

防止这种可能性最可靠的方法是阻止您的 Web 服务器直接调用库脚本,无论是将它们移出文档根目录,还是将它们放在配置为拒绝 Web 服务器访问的文件夹中。例如,使用 Apache,在库脚本文件夹中创建一个 .htaccess 文件,其中包含以下指令

Order Allow,Deny
Deny from any
8
Thomas "Balu" Walter
18 年前
由于许多用户无法修改 Apache 配置或使用 htaccess 文件,因此避免对包含文件进行不必要访问的最佳方法是在包含文件的开头添加一行代码

<?php if (!defined('APPLICATION')) exit; ?>

以及在所有允许外部调用的文件中

<?php define('APPLICATION', true); ?>

Balu
7
steffen at morkland dot com
17 年前
回复 djjokla 和其他人

考虑将所有包含文件(如前所述)放在一个单独的文件夹中,该文件夹包含一个 .htaccess,其中包含 Order Deny,Allow

然后创建一个 index 文件,该文件用于处理对您的 PHP 应用程序的所有请求,然后使用 index.php?view=index 调用它

index 文件可能看起来像这样

<?php
switch($_GET['view']){
case
'index':
include(
'libs/index.php');
break;
default:
include(
'libs/404.php');
break;
}
?>

这可以是一个数组,或者更具创意的东西。实际上,您如何实现并不重要……将所有页面都通过一个中央脚本运行有一个很大的优势……控制。
您可以随时轻松地实现对函数的访问控制,而无需忘记关键文件。
2
inland14 at live dot com
5 年前
好的 Dharma 令牌,这些令牌基本上位于供稿中的某个位置,允许无法重新编程和注入的用户进入该网站。

每隔几分钟更改一次此 POST AJAX 调用 URL,以排除未遵循您的门户网站的用户。您可以将此与他们的来源相结合。仅适用于广告点击。

您可以使用 `time()` 函数以及每隔约 5 分钟(?)的一个时间偏移量来生成一个完美的令牌。通过在登录时或用户刚访问网站时免费获取令牌来平衡负载。在没有令牌的情况下,不要允许用户在指定时间(或您在定时更换守卫时进行的算法求和)的第 5 分钟之后访问提要。可以通过跨页面传递变量来弥补这一点。使用 curl 直接将 POST 令牌注入到您自己的网站。并将其与会话 ID 相结合。
2
匿名
9 年前
chroot 不是安全特性。不要将其用作安全特性。请阅读 chroot 手册页以了解其真正用途。
2
ManifoldNick at columbus dot rr dot com
21 年前
请记住,安全风险通常不会涉及数月的准备工作或后门或你在《剑鱼行动》中看到的其他任何东西 ;) 实际上,新手常犯的一个重大错误是,没有从用户输入中删除 "<"(尤其是在使用留言板时),因此理论上用户可以秘密地破坏页面,甚至让您的服务器运行 PHP 脚本,这将允许他们对您的网站造成严重破坏。
1
匿名 at domain dot com
21 年前
最佳做法是将 PHP 构建为 CGI,在 suexec 下运行,并使用 chroot 限制用户的访问权限。这不是最好的方法,但相当不引人注目,提供了多级检查点,唯一的缺点是,嗯,有点慢。 8)
-6
nick dot hristov at gmail dot com
19 年前
对 Dave Mink 之前帖子的一项修正。

<Files ~ "\.inc$">
Order allow,deny
Deny from all
Satisfy All
</Files>

将无法阻止以下情况
http://www.yourserver.com/includefile.inc?pointlessvar=blahblah

以下是针对此任务更复杂的一种方法

<Location ~ "/[^ ](?=\.inc(\?[^ ]*)?)/">
Options None
Order Allow, Deny
Deny from All
AllowOverride None
Satisfy All
</Location>

此外,请考虑将以下内容放在您的 httpd.conf 文件中

<Location ~ "/[^ ](?=\.phps(\?[^ ]*)?)/">
Options None
Order Allow, Deny
Deny from All
AllowOverride None
Satisfy All
</Location>
-16
moehbass at gmail dot com
17 年前
首先,防止用户查看可包含文件中的代码的一种更简单的解决方案是,为包含文件指定一个以 php 结尾的扩展名(例如,myFile.inc.php)。

其次,更重要的是,为什么你要将程序级代码放在包含文件中?我指的是像这样的代码

myFile.inc.php
--------------------------------
...
if ($var = 'whatever')
// 连接到数据库
else
// 执行其他操作。
--------------------------------

包含文件不应包含逻辑!相反,它是一个封装的代码单元,除非被要求执行,否则不会自行执行任何操作。为了实现这种理念,请考虑仅将函数定义包含在包含文件中,然后在包含这些文件到脚本中后,从程序中调用这些函数(即包含 inc 文件的脚本)。如果您一开始不知道函数的名称,请使用 call_user_func() 或 call_user_func_array() 并将依赖于上下文的函数名传递给它。

如果您必须将程序级逻辑放在包含文件中,请考虑将其直接放在程序中!

为什么你应该考虑这样做?以变量名称冲突为例!我敢肯定你还能想到更多!

希望这有帮助
To Top