2012-01-11 63 views
5

我有一个非复杂的问题......它似乎比它应该更复杂。提交简单的PHP表单时出现禁止的错误

我有一个简单的表单,用于向网站添加内容。一些字段需要输入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个不会。如果我可以让这个更容易混淆,如果我简单地在这些字段中输入文本并保存它,它会毫无问题地运行。

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

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

-------编辑下面是答案--------

本带来了一个梦幻般的答案,也可能是问题,我无法修复它,因为缺乏的特权。所以我从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来代替#@!回到<,至少让事情奏效。

我在一匹马.... hyaa!

感谢您的帮助。 :)

+1

你也可以发布负责处理提交的代码吗?这可能是验证php生成的重定向或错误处理程序问题。 – 2012-01-11 18:52:13

+1

当提交表单时,网址看起来有什么不同,就像表单页面本身的url一样? – Gerben 2012-01-11 19:07:03

+0

@BenD真的没有任何代码负责处理提交。这是一个简单的foreach语句,用于运行$ _POST变量并在其上引发一个mysql_real_escape_string。没有任何javascript验证。您只需点击提交,即可加载相同的页面,它只是属于一个switch语句,应该将其置于该区域以更新信息。它适用于网站其他部分的其他所有内容(相同的foreach语句),当涉及多个html元素时,不在此处。 – n0nag0n 2012-01-11 19:38:32

回答

7

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

要测试此,尝试添加一个htaccess文件到您的Web根目录(假设你被允许覆盖与htaccess的阿帕奇设置),并设置:

SecFilterEngine Off 

重启Apache,然后看它是否仍然发生。如果这是一个共享主机,或者你没有修改apache设置的能力,你可以尝试使用javascript的解决方法,即提交之前的所有数据(onsubmit),然后base64_decode($ _ POST [ key])在处理它的php脚本中。

+1

我在想我不能重写该功能。我做了phpinfo();我没有看到有关防火墙或mod_security的任何信息。我尝试将代码输入到htaccess文件中,它给了我一个内部服务器错误500.这是另一个客户端帐户,他们正在使用fastwebhost.com,它会阻止您的IP,如果您呼吸错误。 – n0nag0n 2012-01-11 21:10:02

+0

感谢您的帮助。我和你和格尔本的帮助一起解决了这个问题。 – n0nag0n 2012-01-11 21:35:22

+0

这也是一个好主意。矿是更多......新手和.....是只是新手。 :) – n0nag0n 2012-01-11 21:51:29

1

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

另外值得一增加的php.ini post_max_size和使用测试尺寸:$_SERVER['CONTENT_LENGTH']

0

可能会晚点升技的,但我今天遇到了类似的问题,而试图通过POST提交表单。它不会允许我提交带有链接的文本,并会发出403禁止访问拒绝错误。 禁用modsecurity(我是从控制面板中完成的)解决了它!