09/10/2018, 23:22

Bảo mật trong PHP

Xin hỏi các bác Triojan trong request là cái gì vậy ! sao mà nó dính kèm được trong $_REQUEST được ta.
CÒn SQL inject : nếu trong sql mình set kiểu ni "select * form `session` where ip='$ip union delete * from session'; liệu sql của mình có bị inject không.
thienthan36 viết 01:29 ngày 10/10/2018
Sao không có ai cho biết ý kiến vậy ta !
kid08 viết 01:29 ngày 10/10/2018
union mình nhớ chỉ dùng cho các câu lệnh select thôi chứ nhỉ sao mà kết hợp select và delete đc :-?
TheHeTre viết 01:28 ngày 10/10/2018
Vào thấy lượng viewer khá đông như ít câu trả lời, có lẽ vấn đề này cần chuyên sâu hơn. Câu lệnh SQL bạn còn sai nên nói sơ lược thế này nhé:

Bảo mật trong PHP phải chú ý đến 3 nguy hiểm chính:

- Cross site scripting
- SQL injection
- Buffer overflow in Mysql

1. Để khắc phục nên dùng các hàm str_replace , strip_tags , htmlspecialchars , htmlentities ...vvv để tránh việc gọi hoặc chèn các đoạn mã không mong muốn

2. Lỗi này chạy yêu cầu thực thi SQL không mong muốn. Để chống lại tham khảo nhóm hàm addslashes

3. Cái này thường thấy ở PHP site Việt Nam. Dữ liệu được đưa vào không kiểm tra khiến ngập lụt, gây quá tải cho server hoặc thừa chồng chéo trong Database. Hãy dùng Capcha Image để chống hoặc 1 cách tương tự mà bạn phát triển lên.
Dctran viết 01:36 ngày 10/10/2018
Vấn đề bảo mật thì vô cùng, ở đây tôi muốn nói qua cho bạn 1 chút về SQL Injection.

Giả sử bạn có 1 form để kiểm tra đăng nhập dạng như chỉ kiểm tra mỗi password

<form method="post" action="login.php">
<input type="password" name="password">
<input type="submit" value="login">
</form>

Như vậy để kiểm tra đăng nhập bạn sẽ làm như sau

PHP:

$password= $_POST["password"];


MySQL:

Select * From tbl_users Where password='$password'


Nếu kết quả câu truy vấn trên cho ra bản ghi thì ok đăng nhập thành công còn nếu kết quả ra Null thì đăng nhập ko thành công.

Bây giờ hãy xét xem điều gì xảy ra khi người dùng nhập password=a' or '1'='1

Khi đó câu SQL sẽ là

Select * From tbl_users Where password='a' or '1'='1'

Rõ ràng câu SQL trên sẽ cho kết quả khác Null và người dùng có thể dễ dàng đăng nhập thành công.

Đó là 1 ví dụ đơn giản của SQL Injection, để xử lý vấn đề trên cần hết sức lưu ý đến các ký tự nguy hiểm như nháy đơn ('), nháy kép (") các toán tử (and) hoặc (or) ... bằng cách:

- Dùng hàm str_replace để thay thế các ký tự nguy hiểm
- Dùng hàm html_specialchars mã hóa các ký tự đặc biệt HTML
- Dùng hàm addslashes để chèn thêm ký tự \ cho ký tự nháy kép (")
- Truyền tham số theo kiểu parameter (cái này đã có trong class Zend_DB của Zend FrameWork)
.....

Các bài viết liên quan đến SQL Injection các bạn có thể tìm rất nhiều trên mạng.
binhvn viết 01:27 ngày 10/10/2018
Để an toàn thì luôn đưa dữ liệu nhận được qua một bộ lọc
- Đối với các loại dữ liệu dạng số -> sử dụng is_numeric, intval...
- Đối với các loại dữ liệu dạng chuỗi -> sử dụng RegEx để lọc hoặc có thể mã hóa trước khi đưa vào database

Nói chung bạn cần lấy cái gì thì chỉ nhận cái đó
Bài liên quan
0