我创建了迷你内容管理系统。现在有了一些问题
我正在使用以下功能过滤帖子
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;
}
PHP代码看起来像那样
$name=filter($_POST['name'], $db);
$title=filter($_POST['title'], $db);
$parent=filter($_POST['parent'],$db);
$switch=filter($_POST['switch'], $db);
if($switch=''){
echo "Return back and select an option";
die();
}
$parentcheck=filter($_POST['parentcheck'],$db);
if($parentcheck=='0')
{
$parent=$parentcheck;
}
$purifier = new HTMLPurifier();
$content = $db->real_escape_string( $purifier->purify( $_POST['content']) );
if(isset($_POST['submit'])&&$_POST['submit']=='Ok'){
$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$switch'") or die($db->error);
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('<what?>', '$title', '$content'") or die($db->error);
}
这就是我的表格的样子
表名为“pages”
和“菜单”
我的问题如下:
我正试图从id
表中获取自动增量menu
值
('$parent', '$name', '$switch'")
插入并在id
表格中设置此pages
插入时($ title,$ content)。怎么做?有可能单身
查询?
$content
的值是带有HTML标记的文本。我正在使用html净化器。
我可以在插入db表之前过滤它的值吗?任何
建议/建议?
答案 0 :(得分:1)
应该是
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES (LAST_INSERT_ID(), '$title', '$content'") or die($db->error);
使用real_escape_string()进行过滤应该是安全的。还有其他想要过滤的内容吗?
答案 1 :(得分:1)
看起来您正在使用mysqli
作为数据库库,因此您可以使用$db->insert_id()
来检索由该特定数据库句柄执行的插入操作所创建的最后一个ID。所以你的查询将成为:
$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$switch'") 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);
^^^^^^^
您无法在单个查询中真正执行此操作,因为在查询完成之后,mysql不会使insert_id函数的ID值可用。因此,您必须在3个步骤中执行此操作:插入,获取ID,再次插入。
DB过滤规则(更好地称为转义)是为了逃避用户提供的任何内容。这甚至包括您在其他数据库查询中检索并重新插入的数据。逃避并不是真正存在的安全措施 - 它可以确保您放入查询字符串的任何内容都不会破坏查询。防止SQL注入攻击只是其中一个副作用。