在我的网站上,我有一个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。
答案 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对结果进行编码和解码。