把逗号变成 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->e​​scape() 并且它起作用了。这不是我想的那样。很抱歉造成混乱,并感谢所有建议。 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->e​​scape():

$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 实体?可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

x, = ... - 这个尾随逗号是逗号运算符吗?

sql 把一个用逗号分隔的多个数据字符串变成一个表的一列

jQuery可以在用户输入数字时添加逗号吗?

用逗号运算符做 while ( , ) ,这可能吗?

如何将逗号分隔的字符串转换为数组? [复制]

编写一个sql语句,把b列中的数据用逗号分隔开,变成很多?谢谢