我在MySQL中有一个名为 comments 的表 -
+-----------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | | 0 | |
| data | varchar(255) | YES | | NULL | |
| createdOn | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------+--------------+------+-----+-------------------+----------------+
我使用CodeIgniter PHP框架。我的PHP代码在上表中插入一行 -
$comment = null;
if (isset($_POST['comment']) {
$comment = $_POST['comment'];
}
$comment = mysql_real_escape_string($comment);
$input = array(
'comment' => $comment,
);
$data = json_encode($input);
$sql = "insert into comments(data, user_id) values ('$data', $user_id)";
log_message("info", "add sql :: $sql");
$this->db->query($sql);
现在,在两台服务器上部署了相同的代码。
当我为评论提供以下输入时,会导致SQL错误 -
hello'
错误 -
Error Number: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '321)' at line 1
insert into comments(data, user_id) values ('{"comment":"hello\\'"', 321)
Filename: /home/hussain/workspace/app/CodeIgniter_2.1.0/models/test_model.php
Line Number: 32
我在server1上遇到上述错误,但在server2上没有。为什么呢?
答案 0 :(得分:3)
1.使用以下功能验证查询
$这 - > DB-> escape_like_str()
$sql = "INSERT INTO comments (user_id,data) VALUES(".$this->db->escape($userid).",".$this->db->escape($userid).")";
2.Query Bindings
$comment = $this->input->post('comment');
$row = array('user_id'=>$userid, 'data'=>$data);
$this->db->insert('comments', $row);
log_message('INFO', "SQL : " . $this->db->last_query());
您可以使用以下语句记录上次执行的查询并验证注入
log_message('INFO', "SQL : " . $this->db->last_query());
答案 1 :(得分:1)
为什么不使用$comment = $this->input->post('comment');
来清理输入。然后使用
$ data = array(' user_id' => $ userid,' data' => $ comment);
$ this-> db-> insert(' comments',$ data);
将数据插入表格。