Ниже приведен код, который я использую в своем проекте Codeigniter
для входа в систему с правами администратора.
public function login()
{
$usename = $this->input->post('username');
$password = $this->input->post('password');
$this->db->where('username', $username);
$this->db->where('password', MD5($password));
$this->db->limit(1);
$query = $this->db->get('user');
if($query->num_rows() == 1)
return true; // login the user
else
return false; // user not found
}
Когда запрос повторяется
echo $this->db->last_query();
он выводит что-то вроде этого:
SELECT * FROM (`user`) WHERE `username` = 'admin'
AND `password` = '5f4dcc3b5aa765d61d8327deb882cf99' LIMIT 1
Теперь, когда я ввожу пароль как value)'; DROP TABLE user;--
, создается запрос: -
SELECT * FROM (`user`) WHERE `username` = 'admin'
AND `password` = 'c0b24ab68e0f79e23ebec36e36a5309f' LIMIT 1
Так что я думаю, что это в значительной степени безопасно от sql injection
, потому что codeigniter
active record
автоматически экранирует входные данные.
Изменить на основе комментария
Теперь имя пользователя вводится с чем-то вроде этого
username'; DROP TABLE user;--
, затем создается запросSELECT * FROM (`user`) WHERE `username` = 'username\'; DROP TABLE user;--' AND `password` = '5f4dcc3b5aa765d61d8327deb882cf99' LIMIT 1
Так что я думаю, что это убегает и в этом случае.
Но мой вопрос заключается в том, действительно ли приведенного выше кода достаточно для предотвращения всех возможных атак путем внедрения SQL?