把逗号变成 html 实体?可能吗?
Posted
技术标签:
【中文标题】把逗号变成 html 实体?可能吗?【英文标题】:turning commas into html entities? is it possible? 【发布时间】:2011-10-11 09:11:44 【问题描述】:我想知道是否可以获取一段文本,获取所有逗号并将它们转换为相应的 html 实体。类似于 htmlentities($var, ENTQUOTES) 所做的事情,但用于逗号。
这可能是我把问题复杂化了。我想要完成的是从可能包含逗号的用户那里获取 textarea 值,从而弄乱以下代码:
$sql = "INSERT INTO blog (title, date, author, article, category)
VALUES (".$title.", ".$date.", ".$author.", ".$article.", ".$category.")";
其中的逗号会使查询混乱。我想我可以想出一些其他的插入方式。 (我是n00b)。任何帮助是极大的赞赏。提前致谢。
*编辑: 感谢您的快速回复!自动保护代码免受注入攻击(codeigniter 框架)。
错误信息是这样的:
发生数据库错误错误号:1064
您的 SQL 语法有错误;检查手册 对应于您的 mysql 服务器版本,以便使用正确的语法 靠近 'a test post, 07/22/2011, 1, '
这是一个测试帖 第 2 行有点酷”
INSERT INTO 博客(标题、日期、作者、文章、类别)VALUES(此 是一个测试帖,07/22/2011, 1, '
这是一个包含各种测试的帖子 在这里输入的很酷的东西,就好像真实的文章一样, 一切,但它不是,它是假的。最后的哈哈哈哈哈哈 重复:
',新闻)
我认为这是因为逗号,尽管我现在可以看到,如果它们在引号中,那应该没关系。我想我在这里有一个不同的问题。感谢您指出这一点。
*编辑#2: 我在所有变量上使用了 codeigniter 的 $this->db->escape() 并且它起作用了。这不是我想的那样。很抱歉造成混乱,并感谢所有建议。 sql 注入链接已添加书签。
【问题讨论】:
逗号给你带来这个麻烦是没有意义的——你能给我们一个$article
的值吗?
我不使用 Code Igniter,但我认为您的查询不会受到 SQL 注入的保护——至少不是它当前的格式。参见Does Code Igniter automatically prevent SQL injection? 和SQL Injection and Codeigniter——不要只是假设你的框架会保护你。
【参考方案1】:
神圣的 SQL 注入,蝙蝠侠!
您需要清理您的输入,或使用参数化查询(请参阅 PDO)。当有人输入 "; DROP TABLE blog; --
的标题时会发生什么?
阅读the php documentation on this topic,您会立即发现您问错了问题。如果您使用参数化查询,则无需转义任何内容,并且消除了攻击向量。
【讨论】:
好吧,非常清楚,如果底层机制是mysql_query
,他会没事的,因为mysql_query
不允许一次发送多个查询。但是,您当然是完全正确的。【参考方案2】:
如果您使用的是 CodeIgniter,您仍然必须确保对查询中的所有内容进行转义。 您必须在每个变量周围添加 $this->db->escape():
$sql = "INSERT INTO blog (title, date, author, article, category)
VALUES (".$this->db->escape($title).", ".$this->db->escape($date).", ".$this->db->escape($author).", ".$this->db->escape($article).", ".$this->db->escape($category).")";
当您使用Active Records 时,CodeIgniter 会自动转义所有内容。 你可以使用这样的东西:
$data = array(
'title' => $title,
'date' => $date,
'author' => $author,
'article' => $article,
'category' => $category
);
$this->db->insert('blog', $data);
【讨论】:
【参考方案3】:您必须对要插入 SQL 查询的任何字符串数据进行转义,并用引号将其括起来。简单地将,
更改为&#x2c
(或等效项)不会阻止其他内容(例如引号)破坏查询。换句话说,去了解Little Bobby Tables
【讨论】:
【参考方案4】:您可以通过函数replace删除逗号
$date = str_replace(',', ' ', $date);
或在查询中添加引号:
$sql = "INSERT INTO blog (title, date, author, article, category)
VALUES ('".$title."', '".$date."', '".$author."', '".$this->db->escape($article)."', '".$category."')";
但是不要忘记使用mysql_escape_string函数来保护mysql注入的变量。
$title = mysql_escape_string($title);
【讨论】:
【参考方案5】:请不要做你正在做的事!你让自己对 SQL 注入敞开心扉。考虑改用prepared statements,也许用PDO。这是一种方法,但也请务必阅读文档:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$sql = "INSERT INTO blog (title, date, author, article, category) " .
"VALUES (?, ?, ?, ?, ?)"
$stmt = $dbh->prepare();
$stmt->execute( array($title, $date, $author, $article, $category) );
有关 SQL 注入的更多信息,请参阅 Bill Karwin's Sql 注入神话和谬误 talk 和 slides。另请参阅他对What is SQL injection? 的回答。
我还提供了一个使用 mysql API here 在 PHP 中进行 SQL 注入的示例。
【讨论】:
以上是关于把逗号变成 html 实体?可能吗?的主要内容,如果未能解决你的问题,请参考以下文章