[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
07/05/2012 16:00:01 (+0700) | #31 | 262655 |
|
chiro8x
Member
|
0 |
|
|
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
|
|
WinDak wrote:
Nhìn vào "blacklist" này dễ thấy ngay 1 cách bypass để chèn các truy vấn sql. Xin hỏi anh em nào nhìn thấy không ?
Code:
Dùng "+" thay cho kí tự [space] 0x20 (32 dec).
Sửa cái này lại đã.
Code:
$kiemtra = str_replace($tukhoa, '*',strtolower($cautruyvan));
Nếu là MS SQL thì có thể dùng:
Code:
|
|
while(1){} |
|
|
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
07/05/2012 17:25:43 (+0700) | #32 | 262664 |
|
WinDak
Researcher
|
Joined: 27/01/2002 11:15:00
Messages: 223
Offline
|
|
@chiro8x:
chính xác, đây mình cho rằng là điểm yếu của 'blacklist' tự tạo, nếu không "rành" thì dễ dàng bypass được.
chiro8x có giải pháp gì không ? |
|
-- w~ -- |
|
|
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
07/05/2012 17:45:37 (+0700) | #33 | 262667 |
|
chiro8x
Member
|
0 |
|
|
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
|
|
Lúc trước mình suy nghĩ về việc dùng hàm preg_match(); ( http://www.pcre.org/ ) để cản, mình chú ý vào các truy vấn SQL chứa SELECT.
Trong một bài mình đã từng đề cập:
/hvaonline/posts/list/39497.html
Vì thiếu hiểu biết nên luật được mình tìm ra chưa chuẩn xác trong quá trình tìm hiểu thêm mình đã bỏ sót khi người ta kết thúc query string bằng %00 hoặc #. Mình đang tính viết lại bằng pre_match(); , khuyết điểm của nó là hơi tốn tài nguyên, nhưng cản truy vấn trước khi gọi mysql_query().
Mình không tin tưởng cái mysql_real_escape_string(); lắm, tại mình sợ là có những phương pháp khác có thể vượt qua nó nhưng lại ngoài tầm hiểu biết của mình, và sợ là nó làm dị biến dữ liệu.
Mã kiểm tra mình làm như sau:
Code:
<?php
if(!function_exists("sqlj")){
function sqlj($data){
//Check here
}
}
if(!function_exists("sqlj_check")){
function sqlj_check($data){
$key = NULL;
$value = NULL;
foreach($data as $key => $value){
if(sqlj($value))exit();
}
}
}
sqlj_check($_GET);
sqlj_check($_POST);
sqlj_check($_COOKIE);
?>
Không biết có noob quá không . |
|
while(1){} |
|
|
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
07/05/2012 18:12:27 (+0700) | #34 | 262670 |
|
WinDak
Researcher
|
Joined: 27/01/2002 11:15:00
Messages: 223
Offline
|
|
=P chiro8x có thể viết hết cái
//Check Here
được không ? chứ nhìn thế này thì không biết có gì khác cái cũ.
|
|
-- w~ -- |
|
|
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
07/05/2012 18:29:07 (+0700) | #35 | 262673 |
|
chiro8x
Member
|
0 |
|
|
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
|
|
Code:
return preg_match("/^([\'\)\"a-zA-Z0-9])+([0-255[:ascii:]])+select+([0-255[:ascii:]])+([\-])+([0-255[:ascii:]])+$/",strtolower($data))?true:false;
Vẫn là cái củ mà ! chưa fix được mấy bửa nay máy tớ cháy main board mang đi sửa . |
|
while(1){} |
|
|
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
08/05/2012 03:35:15 (+0700) | #36 | 262689 |
|
WinDak
Researcher
|
Joined: 27/01/2002 11:15:00
Messages: 223
Offline
|
|
Thế thì có lẽ cái hàm check của chiro8x còn yếu hơn cái trong bài này =P
Thay vì kiểm tra dữ liệu đầu vào có phải sql injection / xss / lfi / lrf không sẽ tốt hơn nhiều nếu kiểm tra điều ngược lại !! ( và tốt hơn nữa nếu sử dụng cả 2).
Còn riêng về sql injection thì cách an toàn nhất là sử dụng câu truy vấn có chuẩn bị - "prepared statements" và sử dụng một cách chính xác. |
|
-- w~ -- |
|
|
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
08/05/2012 06:10:47 (+0700) | #37 | 262693 |
|
chiro8x
Member
|
0 |
|
|
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
|
|
Mình cũng tính sử dụng một hàm đánh giá dựa trên tần số xuất hiện, chẳng hạn như tính các từ, các kí tự hay được dùng trong SQL injection/XSS/Remote file inclusion/Local file inclusion. Đếm số từ trong dữ liệu gửi lên và tính tần số của nó và có block hay không, dựa trên tần số xuất hiện, và số lần xuất hiện ở lần kế tiếp.
Nghe bạn nói vậy mình thấy đáng lo ngại thật, chắc phải mổ xẽ mấy cái open source xem người ta làm ăn thế nào, hôm bữa mỗ xẽ cái opencart thấy nó vẫn dùng str_replace(); lọc path traversal attack.
@Cách trên có khuyết điểm là cũng cần có dictionary, và khi dữ liệu lớn viết truy vấn kiểu gì cũng đc. |
|
while(1){} |
|
|
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
08/05/2012 06:17:09 (+0700) | #38 | 262694 |
|
chiro8x
Member
|
0 |
|
|
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
|
|
Cái OpenCart tớ nói nó thay đổi và tạo một class sử dụng str_replace(); cũng với hàm phân tách chuổi explode();
Nhưng lại bypass bằng cái Unicode / UTF-8 encoded directory traversal. |
|
while(1){} |
|
[Question] Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản |
23/05/2012 15:03:50 (+0700) | #39 | 263873 |
hachoa59
Member
|
0 |
|
|
Joined: 11/09/2011 23:49:01
Messages: 9
Offline
|
|
Dic trên vẫn chưa được bạn à vì có thế câu truy xuất hoặc .. dạng hex thì chương trình bó tay |
|
|
|