把逗号变成html实体?可能吗?

时间:2011-07-22 20:59:10

标签: php mysql

我想知道是否可以获取一段文本,抓取所有逗号并将它们转换为相应的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服务器版本,以便使用正确的语法   在'测试帖子附近,2011年7月22日,1,'

这是一个测试帖子   各种各样很酷的'第2行

     

INSERT INTO博客(标题,日期,作者,文章,类别)VALUES(此   是一个测试帖子,2011年7月22日,1,'

这是一个各种各样的测试帖子   这里输入的很酷的东西好像是真正的文章和   一切,但不是,这是假的。最终等等等等等等   重复:

',新闻)

我认为这是因为逗号,虽然我现在可以看到,如果他们在引号中它应该无关紧要。我想这里有一个不同的问题。谢谢你指出了这一点。

*编辑#2: 我在所有变量上使用了codeigniter的$ this-> db-> escape()并且它有效。这不是我想象的那样。对不起,感谢您的所有建议。 sql注入链接已被加入书签。

5 个答案:

答案 0 :(得分:3)

Holy SQL Injection,蝙蝠侠!

您需要清理输入,或使用参数化查询(请参阅PDO)。当有人输入"; DROP TABLE blog; --的标题时会发生什么?

阅读the PHP documentation on this topic,你会发现错误的问题会立即变得明显。如果使用参数化查询,则无需转义任何内容,并消除攻击向量。

答案 1 :(得分:1)

如果你正在使用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); 

答案 2 :(得分:0)

您必须转义要插入SQL查询的任何字符串数据,并用引号括起来。简单地将,更改为&#x2c(或等效的)不会阻止其他内容如引号破坏查询。换句话说,请阅读Little Bobby Tables

答案 3 :(得分:0)

您可以按功能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);

答案 4 :(得分:0)

请不要做你正在做的事!你将自己留给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注入神话和谬误 talkslides。另请参阅他对What is SQL injection?的回答。

我还在PHP中使用mysql API here提供了一个SQL注入示例。