"You don't have permission to access /news.php on this server." 但只是偶尔



十月份有一个与这个问题相同的问题,但没有得到解答。我不确定协议是什么。

我在一个网站上工作纯粹是为了好玩和学习一些 PHP。这包括发布"新闻"的表格。大多数时候它通过正常,但有时它任意不通过,我得到 403 错误

You don't have permission to access /news.php on this server.

搜索这种情况会导致很多人谈论一种叫做mod_sec的东西,我不知道如果与我在一起的网络主机使用它,该怎么办。

下面是涉及的所有代码,但由于它通常运行良好,因此可能无济于事。有效的用户名和密码不包含函数更改的任何字符。

编辑:点击表单提交按钮时发生错误。经过意外调查,它甚至在到达数据库连接尝试之前就发生了,因此与PHP代码完全无关。

所有包含的代码都位于同一页面上(最初不是,但我移动了它以消除该角度)

这是通过实际的网络主机在线进行的,因此本地文件冲突和防病毒等不应该受到指责。

站点错误日志只是抱怨缺少403或404页面,访问日志只是这样说:

[24/Jan/2016:05:04:56 -0500] "POST /news.php HTTP/1.1" 404 - [URL] "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"

.PHP:

function sanitiseText($text)
{
    $output = nl2br($text);
    $output = str_replace("'", "’", $output);
    $output = str_replace("<", "&lt;", $output);
    $output = str_replace(">", "&gt;", $output);
    $output = str_replace('"', '&quot;', $output);
    return $output;
}
$a_un = sanitiseText($_POST['un']);
$a_pw = sanitiseText($_POST['pw']);
$mysql_admin = new mysqli(DB_SERVER, $a_un, $a_pw, B_NAME) or 
    die("Could not access the database");

    if($_POST['postNews'])
    {   
        $newsTitle = sanitiseText($_POST['newsTitle']);
        $newsPost = sanitiseText($_POST['newsPost']);
        $query = "SELECT * FROM news ORDER BY postID DESC";
        $result = $mysql_admin->query($query);
        $info = $result->fetch_assoc();
        $pID = $info['postID'] + 1;
        $query = "INSERT INTO news(postID, title, post, posted) VALUES ('$pID', '$newsTitle', '$newsPost', NOW())";
        $mysql_admin->query($query);
        header("Location:/");
    }

.HTML:

<form enctype='multipart/form-data' method='post' action='' name='newsform'>
Username: <input type="text" name="un" size="12" value=""/><br>
Password: <input type="password" name="pw" size="12" value=""/><br><br>
Title: <input type="text" name="newsTitle" size="40" value=""/><br><br>
Post:<br><textarea name="newsPost" cols="45" rows="5"></textarea><br><br>
<input type='submit' value='Make News Post' name='postNews'/>

反复试验:

  • 在表单action字段中设置正确的(完整)页面 URL。部分完成

  • 显示.htaccess文件或类似权限设置中的任何详细信息。没有。

  • 您是否在文件空间上使用任何符号链接?不。

  • 我在您的页面中没有发现字符编码,news.php因此建议您在标题和表单中添加字符编码,并在<form>标签中带有accept-charset="utf-8"

  • 以防万一这是 PHP 的解析错误添加 PHP 错误日志记录添加

    ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);

到新闻.php页面的顶部。


重新编码您的 HTML。我认为一个可能的原因是服务器对HTML页面质量差感到困惑,所以这里是页面的修复,(部分原因是我发现很难不修复这些事情!请将其复制/粘贴为news.php的 HTML,然后查看 403 错误发生的频率。

值得注意的是,您没有 404 错误,404

是由 403 寻找相应的错误页面以显示给浏览器引起的,并且由于您没有,因此找不到 404 文件。404并不重要。

代码(升级到HTML5):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>News Page - Scissle</title>
<link href="sheet.css" rel="stylesheet" media="screen" type="text/css" /></head>
<body>
<div id="border">
</div>
<div id="content">
<center> <!-- Do not use <center> tags, use CSS-->
    <form enctype='multipart/form-data' method='post' action='http://scissle.com/news.php' name='newsform' accept-charset="utf-8">
    Username: <input type="text" name="un" size="12" value="" /><br>
    Password: <input type="password" name="pw" size="12" value="" /><br><br>
    Title: <input type="text" name="newsTitle" size="40" value="" /><br><br>
    Post:<br><textarea name="newsPost" cols="45" rows="5"></textarea><br><br>
    <input type='submit' value='Make News Post' name='postNews' />
</form>
<br>
<hr>
<table class="book"><tr class="heading"><td>Some points:
1) Encase CSS classes in quotes.
2) Remember to close html / body/head tags
3) Try to avoid blank spaces/ empty lines at the start or end of the HTML file.
4) remember to close your Form tags too.
</td></tr></table></center>
</div>
</body> 
</html>

来自评论:

点击表单提交按钮时发生错误。这是通过实际的网络主机在线进行的。

因此,我强烈怀疑该错误是由 PHP header() 函数的不当/不准确使用引起的,如我的评论中所述。

将标头块替换为以下内容:

    ...
    $mysql_admin->query($query);
    header("Location: http://scissle.com/index.php");
    exit;
    }

这将为服务器提供一个确切的地址,而不是像您当前那样简单的/

还按照建议在标题后添加了exit;

最新更新