发布包含带有 html 内容的 textarea 的表单时权限被拒绝
Posted
技术标签:
【中文标题】发布包含带有 html 内容的 textarea 的表单时权限被拒绝【英文标题】:permission denied while posting the form which contains textarea with html content 【发布时间】:2011-12-09 22:32:29 【问题描述】:好的,这是我的问题(我用谷歌搜索过,没有任何帮助):
我有一个包含 textarea 元素的表单,我想在其中写如下内容:
<table><tr><td>123</td></tr></table>
然后单击提交,我希望将其保存在数据库中。
现在,如果我输入非 html 字符,我的代码就可以工作,但如果我按上述方式输入,我会得到:
Forbidden
You don't have permission to access /xxx/sample_posteddata.php on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
我的猜测是,不知何故,我的主机设置了一些安全性来禁止这样做?
我尝试从 php 管理界面插入准确的文本,效果很好:?
编辑:文件podaciEdit.php的完整源代码:
<?
require_once("_dal/CredentialsManager.php");
require_once("_dal/ProizvodRepository.php");
$repos = new ProizvodRepository();
if ( isset( $_POST["spremi"] ) )
$sifra = $_POST["sifra"];
$naziv = $_POST["naziv"];
$slika = $_POST["slika"];
$podaci_full = htmlspecialchars($_POST["podaci_full"]);
$podaci_min = $_POST["podaci_min"];
$kategorija = $_POST["kategorija"];
$kategorija_naziv = $_POST["kategorija_naziv"];
if ($repos->updateProizvod ($sifra, $naziv, $slika, $podaci_full, $podaci_min, $kategorija, $kategorija_naziv))
echo "Podaci uspješno spremljeni!";
else
echo "Greška prilikom spremanja podataka!";
echo '<br/>Kliknite <a href="proizvodiEdit.php">ovdje</a> za povratak.';
else if ( isset( $_GET["sifra"] ) )
$sifra = $_GET["sifra"];
$proizvod = $repos->GetProizvod($sifra);
if ($proizvod)
$sifra = $proizvod["sifra"];
$naziv = $proizvod["naziv"];
$slika = $proizvod["slika"];
$podaci_full = $proizvod["podaci_full"];
$podaci_min = $proizvod["podaci_min"];
$kategorija = $proizvod["kategorija"];
$kategorija_naziv = $proizvod["kategorija_naziv"];
//$data = htmlentities($podaci_full, ENT_QUOTES, "UTF-8");
echo <<<qq
<form id="proizvodEdit" method="POST" action="proizvodEdit.php">
Podaci - tablica: (mozes resizeati po potrebi!)<br/>
<textarea class="podaci_full" id="podaci_full" name="podaci_full">$podaci_full</textarea>
<input type="submit" value="Spremi sve" name="spremi"/>
</form>
qq;
else
echo '<h2 class="title-page">Proizvod koji tražite ne postoji.</h2>';
else
echo '<h2 class="title-page">Proizvod koji tražite ne postoji.</h2>';
【问题讨论】:
没有代码,我们只能猜测。 你在尝试跨域发帖吗?使用 strip_tags() php.net/manual/en/function.strip-tags.php @Rob W:请看,我已经 c/ped 了整个 php 代码 【参考方案1】:如果您是网站的所有者,您可以使用htmlspecialchars()
,然后将输出保存到数据库。如果你想读回来并转换成 html 使用htmlspecialchars_decode()
要获得更准确的答案,您应该发布用于将数据保存到数据库的代码。
【讨论】:
如您所见,我使用 htmlspecialchars() 但没有帮助:( @Nikola 这个方法updateProizvod()
是否对数据做进一步处理?
公共函数 updateProizvod($sifra, $naziv, $slika, $podaci_full, $podaci_min, $kategorija, $kategorija_naziv) if ($this->openConnection()) $sql = "UPDATE proizvodi SET sifra='$sifra',naziv='$naziv',slika='$slika',podaci_full='$podaci_full',podaci_min='$podaci_min',kategorija='$kategorija',kategorija_naziv='$kategorija_naziv'在哪里 sifra='" 。 $sifra 。 "'";回声$sifra; $result = mysql_query ($sql); if (mysql_affected_rows() == 1) 返回真;否则返回假; 其他 返回错误;
@Nikola 您没有正确转义您的数据(为了防止 SQL 注入,在使用 update
查询之前在参数上使用 mysql_real_escape_string()
)。
是的,我知道,谢谢,但这不会产生错误,即使我注释掉整个数据库保存部分也会出错【参考方案2】:
我猜你最初得到的是 403。这是与文件权限相关的问题,是 apache 错误消息,而不是 php。尝试直接访问 www.yourdomain.com//xxx/sample_posteddata.php 并查看是否可以访问该文件。甚至可以尝试 GET 参数。
www.yourdomain.com//xxx/sample_posteddata.php?sifra=xxx
您应该可以访问它。如果不是try
chmod +x /home/domain/public_html
404 是 NOT FOUND 的错误代码。这意味着您的表单没有正确指向您的 php 文件,或者其中一个包含失败。检查你的路径。
【讨论】:
如果我在文本区域输入普通文本(无 HTML 标记)并单击提交,则代码运行良好。它也可以很好地保存到数据库中。【参考方案3】:由于您的 HTML 包含关键字“table”,我最好的选择是它可能与 mod_security 或其他过滤 SQL 关键字的安全工具有关,以帮助防止 SQL 注入。尝试将以下内容添加到您的.htaccess
:
SecFilterEngine Off
如果它以这种方式工作,则可能与 mod_security 有关。请注意,您可能无法从您的 .htaccess
文件中禁用它。
【讨论】:
【参考方案4】:实际上,帮助解决问题的是函数stripslashes。
$podaci_full = stripslashes($_POST["podaci_full"]);
【讨论】:
以上是关于发布包含带有 html 内容的 textarea 的表单时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
我想使用 javascript 检查 textarea 的内容必须包含以前输入的单词
带有支持`css`代码的Textarea html标签[重复]
空 HTML textarea 输入未显示在 mPDF 生成的 PDF 中