【问题标题】:Forbidden Error When Submitting Simple PHP Form提交简单 PHP 表单时出现禁止错误
【发布时间】:2012-02-08 02:50:14
【问题描述】:

我有一个不复杂的问题......这似乎比它应该的更复杂。

我有一个简单的表单,用于向网站添加内容。有些字段需要输入 html。但是,当您将某些 html 元素输入到表单的不同部分时,它会认为它讨厌您并抛出禁止的 403 错误。这是下面的表格:

<?php
    $data = f("SELECT * FROM table WHERE id = '{$_GET['id']}'");
?>
<form action="<?=$_SERVER['PHP_SELF']?>?id=<?=$_GET['id']?>&action=edit" method="post">
    <table cellspacing="0" cellpadding="2" border="0">
        <tr>
            <td><b>Title:</b></td>
            <td><input type="text" name="title" style="width: 300px;" value="<?=$data['title']?>" /></td>
        </tr>
        <tr>
            <td><b>URL:</b></td>
            <td><input type="text" name="url" style="width: 300px;" value="<?=$data['url']?>" /></td>
        </tr>
        <tr>
            <td><b>Sub-Category:</b></td>
            <td>
                <select name="subCategoryId">
                    <option value=""></option>
                    <option value="1">A</option>
                    <option value="2">B</option>

                </select>
            </td>
        </tr>
        <tr>
            <td><b>Short Description:</b></td>
            <td><textarea name="shortDescription" rows="6" cols="60"><?=$data['shortDescription']?></textarea></td>
        </tr>
        <tr>
            <td><b>Template:</b></td>
            <td><textarea name="template" rows="6" cols="60"><?=$data['template']?></textarea></td>
        </tr>
        <tr>
            <td><b>Ads:</b></td>
            <td><textarea name="ads" rows="6" cols="60"><?=$data['ads']?></textarea></td>
        </tr>
        <tr>
            <td><b>Keywords:</b></td>
            <td><textarea name="keywords" rows="6" cols="60"><?=$data['keywords']?></textarea></td>
        </tr>
        <tr>
            <td><b>Questions:</b></td>
            <td><textarea name="questions" rows="6" cols="60"><?=$data['questions']?></textarea></td>
        </tr>
        <tr>
            <td><b>Salary:</b></td>
            <td><textarea name="salary" rows="6" cols="60"><?=$data['salary']?></textarea></td>
        </tr>
        <tr>
            <td><b>Jobs:</b></td>
            <td><textarea name="jobs" rows="6" cols="60"><?=$data['jobs']?></textarea></td>
        </tr>
        <tr>
            <td><b>Meta Description:</b></td>
            <td><input type="text" name="metaDescription" style="width: 300px;" value="<?=$data['metaDescription']?>" /></td>
        </tr>
        <tr>
            <td><b>Meta Keywords:</b></td>
            <td><input type="text" name="metaKeywords" style="width: 300px;" value="<?=$data['metaKeywords']?>" /></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><input type="submit" name="submit" value="Edit Job" /></td>
        </tr>
    </table>
</form>

我有其他形式遵循相同的模式,没有任何麻烦。为了进一步使这更加混乱,它只会在文本区域中提供任何 2 个 html 元素时抛出此错误(它可以很好地处理一个 html 元素)。文本区域是广告、关键字、薪水和工作。其他文本区域会很好,但是这 4 个不会。如果我可以让这更加混乱,如果我在这些字段中简单地输入文本并保存它,它就可以毫无问题地运行。

为了处理 post 数据,我只使用 mysql_real_escape_string() 来处理数据,我不做 strip_tags() 因为我需要那里的 html。

这是一个奇怪的 apache 错误,可以用 .htaccess 修复吗? PHP中是否有与此冲突的模块?

-------编辑这里是答案--------

Ben 提出了一个奇妙的答案,这可能是问题所在,由于缺乏特权,我无法解决它。所以我根据 Gerben 给我的想法创建了一个 onsubmit 事件并编写了以下 javascript。

function awesome() {
        elements = document.forms[0].elements;
        for(var i = 0; i < elements.length; i++) {
            switch(elements[i].name) {
                case "ads":
                case "shortDescription":
                case "template":
                case "questions":
                case "salary":
                case "jobs":
                    str = elements[i].value;
                    elements[i].value = str.replace(/</g,"#@!");
                    break;
            }
        }
        return true;    
    }

然后在接收端,我做了一个str_replace来替换#@!回到

我在骑马....嘿!

感谢您的所有帮助。 :)

【问题讨论】:

  • 能否也贴出负责处理提交的代码?这可能是验证 php 生成的重定向或错误处理程序问题。
  • 提交表单时 url 看起来是否与表单页面本身的 url 不同?
  • 403是apache抛出的,应该不是你的php造成的。我的猜测是您的主机以某种方式不允许 POST。不过这种情况非常罕见。
  • @Gerben,403 通常由 apache 抛出,但 PHP 可以通过 (a) 故意发送 403 错误标头来导致它;或 (b) 通过将页面重定向到禁止资源来触发 apache 403 错误。但是,鉴于 Firefly 的响应,鉴于他所描述的内容,它似乎既不是 _POST 限制也不是 php 触发器。我有一个想法……
  • 抱歉,我没有仔细阅读您的问题。尝试使用&lt;?=htmlentities($data['xxxx'])?&gt;

标签: php forms .htaccess post http-status-code-403


【解决方案1】:

鉴于您能够发布,并且您的后期处理显然非常简单,因此不太可能引发 403 错误或重定向到禁止的目录,我会冒险猜测您正在运行apache级防火墙。查看您的 apache 配置文件,并检查您是否正在运行 mod_security 或任何其他已加载的防火墙模块。有多种方式可以配置 mod_security,包括扫描 POST 数据中的 html 内容并做出相应的反应。如果它被配置为防止 html 注入,这可能是您的问题(请参阅此处的配置详细信息:http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html)。

要对此进行测试,请尝试将 htaccess 文件添加到您的 Web 根目录(假设您被允许使用 htaccess 覆盖 apache 设置)并设置:

SecFilterEngine Off

重启 apache,然后看看它是否还在发生。

如果这是一个共享主机,或者您无法修改 apache 设置,您可以尝试使用 JavaScript 解决方法,在提交 (onsubmit) 之前使用 base64 encodes 所有数据,然后使用 base64_decode($_POST [key]) 在处理它的 php 脚本中。

【讨论】:

  • 我认为我无法覆盖该功能。我做了 phpinfo();我没有看到任何关于防火墙或 mod_security 的信息。我尝试将代码输入到 htaccess 文件中,它给了我一个内部服务器错误 500。这是另一个客户帐户,他们正在使用 fastwebhost.com,如果你呼吸不畅,它会阻止你的 IP。
  • 感谢您的帮助。在你和 Gerben 的帮助下,我想通了。
  • 这也是个好主意。我的更多......新手和......是的只是新手。 :)
【解决方案2】:
<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

使用此代码我认为这解决了您的问题

【讨论】:

  • 这应该是正确的答案
【解决方案3】:

刚刚在提交时遇到了同样的问题,显示 403 错误,但对我来说这很简单,因为表单太大触发了 mod_security 上的规则。

还值得增加 php.ini post_max_size 和测试大小使用:$_SERVER['CONTENT_LENGTH']

【讨论】:

    【解决方案4】:

    就我而言,在 cPanel 中禁用 MOD 安全性为我解决了这个问题。

    【讨论】:

      【解决方案5】:

      可能有点晚了,但是我今天在尝试通过 POST 提交表单时遇到了类似的问题。它不允许我提交带有链接的文本,并且会抛出 403 Forbidden Acess Denied 错误。 禁用 modsecurity(我从控制面板执行此操作)解决了它!

      【讨论】:

        【解决方案6】:

        此问题是由 Apache Firewall mod 引起的,如果您不能或不想编辑 httpd.conf,也可以通过 .htaccess 文件修复。

        在调用脚本的目录(通常是 index.php 所在的目录)中创建或编辑现有的 .htaccess 文件并添加以下行:

        <IfModule mod_security.c>
        #SecRuleEngine Off
        SecRequestBodyAccess Off
        </IfModule>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-28
          • 2014-02-25
          • 2018-11-24
          • 2017-08-24
          • 2011-01-06
          • 1970-01-01
          相关资源
          最近更新 更多