【发布时间】: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> </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 触发器。我有一个想法……
-
抱歉,我没有仔细阅读您的问题。尝试使用
<?=htmlentities($data['xxxx'])?>
标签: php forms .htaccess post http-status-code-403