我有一个网站,目前有超过900篇html文章,目前可供任何人查看。我想更改它以限制仅通过会员资格查看某些文章。我有sql数据库中带有标志的文章,如果有限制的话。有一篇文章索引,其中包含每篇文章的链接。该过程将检查文章是否受限制,检查用户是否是成员登录,然后显示,否则发送到登录或订阅页面。由于篇幅太多,如果直接访问文章,我不能只添加一些php来显示。我的问题是在我的web目录中我放置了这些文章页面,以及如何保护某人不直接访问该页面,但是一旦用户通过身份验证就允许访问?任何输入都表示赞赏。有人知道这方面的好参考书吗?
答案 0 :(得分:3)
移动文件,使它们位于文档根目录之上,因此无法通过Web服务器访问。或者,将文件移动到您使用密码保护的目录(.htaccess / .htpasswd对)。你永远不会泄密,只是为了阻止直接访问文件。
然后,编写一个代理文章的脚本。该脚本检查用户是否已登录。如果没有,则将其重定向到登录页面。如果是,它会从实际位置读取文章HTML,然后通过它发送。
例如:http://www.example.com/article.php?view=cooking.html
session_start();
if (!isset($_SESSION['logged_in'])) {
header("Location: login.php");
} else {
readfile("/path/to/articles/" . $_GET['view']);
}
您需要在$_GET['view']
上进行某种卫生设施,以确保它不包含任何文章的名称。
您甚至可以通过使用mod_rewrite将文章重新编写到.httaccess
/ httpd.conf
中的代理脚本,来保留当前的网址和文章链接。像这样:
RewriteEngine On
RewriteRule article/(.*)\.html articles.php?view=$1 [L]
答案 1 :(得分:0)
如果您还没有任何现有的PHP开发框架可以帮助解决安全问题,那么您可能会考虑使用PHP来限制访问的简单方法。阅读.htaccess文件,以及如何创建一个受保护的目录,您可以在其中放置所有受限制的文章。然后,您可以设置用户帐户,并要求他们在阅读受限制的文章之前对自己进行身份验证。
以下是如何为用户授权/身份验证设置.htaccess的教程:
答案 2 :(得分:0)
您有几个基本选项:
将代码添加到每个页面。你可以自动化这个,所以它没有听起来那么糟糕。它实际上不应该只是一个包含。
了解如何让您的Web服务器软件(例如,apache)进行身份验证检查。根据您的检查的复杂程度,mod_rewrite外部映射程序可能能够执行此操作。除此之外,还有现有的认证模块,或写一个相当简单的垫片并不难(如果你知道C)
通过PHP提供所有页面加载。遗憾的是,这可能会破坏现有的URL。您将要查看的页面作为参数或路径的一部分传递(取决于服务器配置),然后检查脚本内部,最后在检查通过后发送页面。
答案 3 :(得分:0)
最简单的方法可能是将所有aricle文件移到Web根目录之外,然后在允许客户端看到它的情况下使用PHP来获取它们。
例如:
<?php
if (isset($_GET['id']))
{
$articleDir = "/var/articles/";
// Assuming a "?id=1" query string is used to pass a numberic ID of
// an article. (Like: example.com/showArticle.php?id=1)
$articleID = (int)$_GET['id'];
$articleFile = "article_{$articleID}.html";
// Look through your SQL database to see if the article is restricted.
// I'll leave the codeing to that up to you though.
if (!$isRestricted || $isLoggedIn)
{
$path = $articleDir . $articleFile;
if (file_exists($path))
{
include $path;
}
else
{
echo "The requested article does not exist.";
}
}
else
{
echo "You have to be logged in to see this article.";
}
}
else
{
echo "No article ID was passed. Did you perhaps follow a bad link?";
}
?>
请注意,如果要保持旧链接处于活动状态,可以使用Apache的mod_rewrite重写传入请求并将它们路由到PHP文件。
修改强>
如果您不熟悉mod_rewrite和/或正则表达式,这可能会有所帮助:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^article_(\d+)\.html$ fetchArticle.php?id=$1 [L]
</IfModule>
在没有客户注意到的情况下,将example.com/article_123.html
等任何链接评论为example.com/fetchArticle.php?id=123
。
与Dan Grossman所做的类似,但这只取得数字。