发布包含带有 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 的表单时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

php将textarea内容上传到mysql表中

我想使用 javascript 检查 textarea 的内容必须包含以前输入的单词

带有支持`css`代码的Textarea html标签[重复]

空 HTML textarea 输入未显示在 mPDF 生成的 PDF 中

带有#id的jQuery load()不适用于TEXTAREA

jQueryWEUI自定义对话框-带有textarea