无法通过POST方法</script>将<script>标记存储到数据库中

时间:2013-06-14 10:59:09

标签: php html mysql apache post

在我的网站上,我有一个TEXTAREA表单标记,用于接受一些HTML内容并将其存储在MySQL数据库中。一切正常,除非<SCRIPT></SCRIPT>标签内有脚本。如果我尝试存储这样的脚本,我会得到一些奇怪的消息,我没有访问我的php文件的权限(包含这个TEXTAREA)。我可以通过cPanel(mySqlAmin控制台)在我的数据库中存储<SCRIPT>标签sontent,但不能通过web表单(使用POST方法)存储。在我看来,ISP的Apache服务器上的POST方法检查POST方法的内容。有人可以向我解释这里发生了什么,可能是什么解决方案?

这是确切的错误消息:

Forbidden

You don't have permission to access /para-actions.php on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

para-actions.php是带有代码的PHP,它从FORM接收POST内容并将其存储到数据库中。 (正如我所说的,除了里面有<SCRIPT>...</SCRIPT>之外,它适用于所有其他内容!)

更重要的是,相同的PHP代码在一个托管服务器上运行良好,而在另一个托管服务器上运行(同一个Web托管服务提供商)。我注意到的唯一区别是我可以将<SCRIPT>存储到数据库中的托管服务器使用PHP v5.2.17,而不允许<SCRIPT>的其他服务器使用PHP v5.4.32。

4 个答案:

答案 0 :(得分:3)

在最近的这个问题中:Http 406 error on javascript ajax post. Accept header set to accept all一个OP有完全相同的问题。通常mod_security提供一些规则来检测POSTed内容中的<script

这肯定是你的问题。并且您无法更改ISP mod_security规则。

您可以做的唯一事情,如上一个链接答案中所述,编码您的POST ,以便mod_security不会检测到内部的字符串。使用Base64编码通常是最简单的管理方式。

答案 1 :(得分:1)

我刚刚对localhost做了一个简单的测试,它使用了这个代码

        <html>
        <head>
        <title>Untitled Document</title>
        <?php 
        if ($_POST['data'])
        {
            $con=mysqli_connect("localhost","root","password","abkarino");
        // Check connection
        if (mysqli_connect_errno()) {
          echo "Failed to connect to MySQL: " . mysqli_connect_error();
        }

            $sql = "INSERT INTO  `abkarino`.`test` (`script`) VALUES ('".mysqli_real_escape_string($con,$_POST['data'])."');";
            mysqli_query($con,$sql);    
        }

        ?>
        </head>

        <body>
        <form action="script.php" method="post">
        <textarea name="data" cols="10" rows="5"></textarea>
        <input name="submit" type="submit" value="submit" />
        </form>
        </body>
        </html>

并且没有错误。

表示:1)您的代码有问题。

或2)mod_security阻止它为你的页面注入脚本,就像Nikhil Mohan所说的那样。

答案 2 :(得分:0)

我不确定你要做什么,但是如果你允许你的用户上传一个脚本或其他内容,但是不能让他们输入标签告诉他们在没有标签的情况下编写脚本。当您发布脚本时,请自行添加标记。

一种强有力的方法可以让他们做他们想做的事。如果他们键入带有标签的脚本,则在将其放入数据库之前解析内容并删除脚本标记。必须有一个正则表达式函数,允许您搜索其输入的内容<script>并将其替换为''。然后搜索</script>并将其替换为''。然后,您将无标记内容放入数据库或页面上。

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit =  -1 [, int &$count ]] )

希望至少在你正在尝试做的事情的某个地方,哈哈。

答案 3 :(得分:-2)

请在POST之前使用base64_encode和base64_decode对结果进行编码和解码。