"您无权访问此服务器上的/news.php。"但有时候只是

时间:2016-01-23 23:37:36

标签: php html-form http-status-code-403

There is an identical question to this issue from October,但未得到答复。我不确定该协议的用途。

我在网站上工作纯粹是为了好玩并学习一些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'/>

1 个答案:

答案 0 :(得分:0)

试错:

  • 将正确的(完整)网页网址设置为action字段。 <强>兼完成

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

  • 您是否在文件空间中使用任何SymLink?

  • 我在您的网页news.php中未找到任何字符编码,因此建议您在标题和accept-charset="utf-8"标记内<form>的表单中添加字符编码。

  • 只是因为这是一个解析错误,PHP添加了一个PHP错误记录添加

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

到news.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;
    }

这将为服务器提供一个准确的地址,而不是您现在拥有的简单/

在标题as recommended之后添加了exit;