PHP codeigniter SQL Injection (MSSQL) [trùng lặp]
Tôi đã nhận được báo cáo cho thấy truy vấn của tôi có chèn SQL, tôi cần sự trợ giúp của bạn để xác minh một số vấn đề:
- Tôi đang sử dụng cái này làm câu lệnh chèn
function insert($table_name, $insert_data)
{
$this->db->set($insert_data);
if ($this->db->insert($table_name)) {
return TRUE;
} else {
return FALSE;
}
}
cho exmaple:
$name = 'iamklll'; $status = 1;
$insert_data = array( 'name' => $name,
'status' => $status, ); $this->model->insert('table', $insert_data);
Loại phương pháp này không thể ngăn chặn việc tiêm SQL? Nếu điều này không thể ngăn cản tôi nghĩ cách tốt nhất là ràng buộc truy vấn?
Làm cách nào để ngăn chặn việc nhập SQL nếu $ POST ['column'] là mảng?
Làm thế nào để lưu trữ dữ liệu khi người ta chèn
test"><h1>eee</h1>? Tôi có nên sử dụnghtmlspecialcharsđể lưu trữ trong cơ sở dữ liệu không?
Trả lời
Trong trường hợp của bạn, bạn đang sử dụng trình tạo truy vấn $ this-> db-> insert (), công cụ này tạo chuỗi chèn dựa trên dữ liệu bạn cung cấp và chạy truy vấn. Bạn có thể truyền một mảng hoặc một đối tượng cho hàm. Tất cả các giá trị được thoát tự động tạo ra các truy vấn an toàn hơn.
Đây thực sự là lựa chọn tốt nhất theo ý kiến của tôi. Tốt hơn là sử dụng các ràng buộc truy vấn, đặc biệt vì về lâu dài, bạn có thể cần phải thay đổi từ MSSQL sang mySQL hoặc bất kỳ công cụ nào khác và bạn sẽ không cần thay đổi bất kỳ điều gì trong mã của mình.
Vì bạn đang sử dụng codeigniter 3, hãy đảm bảo xác thực dữ liệu của bạn trước khi chèn nó.
Sử dụng xác thực biểu mẫu cho điều đó: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation
Từ ví dụ của bạn, tôi nghĩ bạn cũng đang đề cập đến các cuộc tấn công xxs. Nếu vậy, bạn có hai tùy chọn, bạn có thể thực hiện việc này trong khi xác thực dữ liệu của mình bằng xác thực biểu mẫu sử dụng quy tắc XSS. Hoặc bạn có thể kích hoạt điều này trên toàn cầu trong ứng dụng / config / config.php của bạn
$config['global_xss_filtering'] = true;
Vì chúng tôi đang nói về việc bảo vệ ứng dụng của bạn, bạn cũng có thể muốn xem xét sử dụng cài đặt csrf trong codeigniter. Điều này cũng có thể được thực hiện trong tệp config.php của bạn.
/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
*/
$config['csrf_protection'] = true; $config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true; $config['csrf_exclude_uris'] = array();
Vì vậy, trong trường hợp của bạn, sử dụng trình tạo truy vấn là tốt để ngăn chặn việc đưa vào SQL đó là những gì bạn thực sự đang tìm kiếm.
Bạn đang đề cập đến lớp Active Record. Nó có trình tạo truy vấn riêng và nó giả sử để bảo vệ bạn khỏi việc tiêm SQL từ hộp.
How to store the data as if the person insert test"><h1>eee</h1>
Tôi nghĩ rằng bạn đang đề cập đến cuộc tấn công XSS. Tôi tin rằng cách tốt nhất là loại bỏ tất cả các thẻ ngoại trừ các thẻ được phép . Tôi không nghĩ rằng htmlspecialcharssẽ có nhiều ý nghĩa ở đây trong khi bạn sẽ thực hiện chuyển đổi ngược trên đầu ra.