我已经建立了迷你内容管理系统。在我的页面添加表单我正在使用 ckeditor 。对于文本命名内容
<textarea id="content" style="width:100%" name="content"></textarea>
使用以下php代码将表单中的所有数据添加到db表中。 (用于消毒数据的函数过滤器)
<?php
require '../../core/includes/common.php';
$name=filter($_POST['name'], $db);
$title=filter($_POST['title'], $db);
$parentcheck=filter($_POST['parentcheck'],$db);
if(isset ($_POST['parent'])) $parent=filter($_POST['parent'],$db);
else $parent=$parentcheck;
$menu=filter($_POST['menu'], $db);
$content = $db->escape_string($_POST['content']);
if(isset($_POST['submit'])&&$_POST['submit']=='ok'){
$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$menu')") or die($db->error);
$new_id = $db->insert_id;
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', '$title', '$content')") or die($db->error);
header("location:".$wsurl."admin/?page=add");
}
?>
功能过滤器(数据清理)
function filter($data, $db)
{
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $db->escape_string($data);
return $data;
}
我对此有疑问。 (我是ajax的新手。)
提前谢谢
答案 0 :(得分:3)
假设您想使用jQuery为您执行ajax业务,您需要在textarea中设置数据的定期POST(请注意,在某些浏览器中,GET请求有限制)。
在第一次POST时,您需要告诉PHP脚本“这是第一个POST”,以便它知道要插入数据,然后它应该返回给您一些识别特征。每次你发布数据时,你也应该发送这个识别特征,让我们只使用主键(PK)。当您发布数据+ PK时,PHP脚本应该对SQL运行更新查询。
构建这些时,需要考虑的是使用JavaScript从浏览器向PHP脚本发送数据。 PHP脚本只获取您发送的任何数据包,并且可以通过生成例如JSON来返回值。然后,您的JavaScript代码可以使用这些返回值来决定下一步该做什么。许多初学者经常犯错误,认为PHP可以调用JS,但实际上它是另一种方式,总是在这里开始使用JS。
在这种情况下,PHP将为您保存数据库中的数据,因此您需要将需要保存的所有数据发送到PHP。在JS中,这就像有一些你称之为“saveMyData”的魔术函数,在PHP中,它就像处理表单提交一样。
这方面的JavaScript看起来像这样(未经测试):
<script type="text/javascript">
var postUpdate = function(postKey){
postKey = postKey || -1;
$.post("/myscript.php",
/* note that you need to send some other form stuff
here that I've omitted for brevity */
{ data: $("#content").value(), key: postKey },
function(reply){
if(reply.key){
// if we got a response containing the primary key
// then we can schedule the next update in 1s
setTimeout(function(){postUpdate(reply.key);}, "1000");
}
}
});
};
// first invocation:
postUpdate();
</script>
PHP方面看起来像这样(未经测试):
除此之外:filter
的实施应使用mysql_real_escape_string()
代替条带标记,mysql_real_escape_string
将提供您所需的转义。
<?php
require '../../core/includes/common.php';
$name = filter($_POST['name'], $db);
$title = filter($_POST['title'], $db);
$parentcheck = filter($_POST['parentcheck'],$db);
if(isset($_POST['parent'])){
$parent = filter($_POST['parent'],$db);
}else{
$parent = $parentcheck;
}
$menu = filter($_POST['menu'], $db);
$content = $db->escape_string($_POST['content']);
$pk = intval($_POST['key']);
if($pk == -1 || (isset($_POST['submit']) && $_POST['submit']=='ok')){
$result = $db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$menu')")
or die($db->error);
$new_id = $db->insert_id;
$result2 = $db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', '$title', '$content')")
or die($db->error);
$pk = $db->insert_id;
echo "{\"key\": ${pk}}";
// header("location:".$wsurl."admin/?page=add");
}else if($pk > 0){
$result2 = $db->query("UPDATE pages SET content='$content' WHERE id='$pk')")
or die($db->error);
echo "{\"key\": ${pk}}";
}
答案 1 :(得分:0)
对于AJAX,您可以使用jQuery's ajax API。这是非常好的,是跨浏览器。 对于保存和自动保存:您可以使用临时表来存储数据。当用户按下保存按钮或自动保存数据时,使用AJAX将数据保存到表中,并为新创建的行返回一个键。在将来的自动保存/保存按钮事件时,您使用AJAX更新临时表。
一句建议,使用PHP和Javascript框架。我个人使用Symfony和Backbone.js。 Symfony会自动检查CSRF和XSS,并且使用Doctrine也可以防止SQL注入。还有其他可用的框架(例如CodeIgniter,CakePHP等),但我认为Symfony是最好的。
编辑:对于自动保存功能,当页面第一次加载时,您可以使用Javascript SetTimeout调用您的AJAX保存功能。
答案 2 :(得分:0)
关于安全问题:
您的silver bullet
功能存在根本缺陷,无法正常工作,无法正常工作,无法正常工作。
SQL具有与hmtl不同的转义需求
您使用的功能相互抵消。 escape_string添加\
,stripslashes删除它们
不用担心功能的顺序,您需要使用专用转义功能,只有一个目的。
最重要的是,您正在使用折旧函数。
对于MySQL,这是mysql_real_escape_string
。 请注意, on mysqli escape_string
(没有真实的)是折旧的,因为它不够彻底。请改用real_escape_string
。escape_string
是real_escape_string
的别名。
请参阅:
How does the SQL injection from the "Bobby Tables" XKCD comic work?
The ultimate clean/secure function