我正在尝试创建迷你CMS,用户可以在其中创建新页面,然后该页面成为菜单的一部分。将完整页面插入数据库是否很明智?还是有更好的方法吗?我在插入时遇到了标签的一些问题。 现在的代码:
将页面插入db:
public function strana_insert()
{
$this->admin_login_check();
$clear = $this->str->clean_request();
$char = array('\n', '\n');
$strana = str_replace($char, '<br>', $clear['opis']);
$kljucna_rec = str_replace( ' ', '_', mb_convert_case($clear['naziv'], MB_CASE_LOWER, "UTF-8") );
$data = array(
'naziv' => $clear['naziv'],
'strana' => htmlspecialchars($strana, ENT_QUOTES , "UTF-8"),
'kljucna_rec' => $kljucna_rec,
'datum_kreiranja' => date("Y-m-d H:i:s")
);
$this->str->save($data);
$this->save_routes();
redirect('admin');
}
clean_request函数的代码:
public function clean_request()
{
foreach($_POST as $key=>$value) :
$clean[$key]=mysql_real_escape_string(trim($value));
endforeach;
return $clean;
}
当我插入带有标签的页面时,我得到以下结果:
<a href=\"http://www.example.com\" class=\"link_name\">www.example.com</a>
更新页面后,* \ * 之间的所有内容都将被删除。这是怎么回事?
答案 0 :(得分:2)
这是因为逃生功能!! htmlspecialchar将您的代码更改为一个简单的字符串!!
如果你想保存为html,你应该保存代码而不必转义!
BTW,这不是一种创建静态页面的聪明方法,您可能希望创建一个布局并简单地让用户将内容放入其中;)答案 1 :(得分:2)
您可以使用Codeigniter的活动类来插入或使用以下方法。
在将HTML数据插入数据库之前执行以下操作:
$html_for_db = addslashes($html_content);
并将$html_for_db
插入数据库。
在显示此内容时,
echo stripcslashes($data_from_db);
stripcslashes() - 使用addcslashes引用的取消引用字符串
答案 2 :(得分:1)
如果你想在你的数据库中存储html,我建议使用htmlpurifier来清理你的html代码,并删除不需要的html标签。
还有一个助手可以让CodeIgniter中的htmlpurifier非常简单:https://github.com/refringe/codeigniter-htmlpurifier
使用htmlpurifier清理输入字符串后,应使用Codeigniters Active Record类来插入数据(http://ellislab.com/codeigniter/user-guide/database/active_record.html)。这样框架就可以进行转义。
答案 3 :(得分:0)
您必须在此处防止两种类型的攻击:SQL注入和跨侧脚本。您考虑了两者并使用htmlspecialchars()
对XSS和mysql_real_escape_string()
对SQL注入。
但是你以错误的顺序使用它们。首先必须使用htmlspecialchars,因为这是你想要存储/输出的东西。要将其保存到数据库中,您必须将其包装到其mysql_real_escape_string-ized演示文稿中,然后再将其存储或使用参数绑定。