我想知道是否可以获取一段文本,抓取所有逗号并将它们转换为相应的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注入链接已被加入书签。
答案 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查询的任何字符串数据,并用引号括起来。简单地将,
更改为,
(或等效的)不会阻止其他内容如引号破坏查询。换句话说,请阅读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注入神话和谬误 talk和slides。另请参阅他对What is SQL injection?的回答。
我还在PHP中使用mysql API here提供了一个SQL注入示例。