2011-07-28 33 views
11

Tôi Tring để làm cho PHP của tôi như là an toàn càng tốt, và hai điều chính tôi đang cố gắng để tránh nhữngMột PHP chức năng để ngăn chặn SQL Tiêm và XSS

  • mySQL Tiêm
  • Cross-Side Scripting (XSS)

Đây là kịch bản tôi đã chống lại mySQL tiêm:

function make_safe($variable) { 
$variable = mysql_real_escape_string(trim($variable)); 
return $variable; } 

http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/


chống XSS, tôi thấy điều này:

$username = strip_tags($_POST['username']); 

Bây giờ tôi muốn đoàn kết hai vào một chức năng duy nhất. Đây có phải là cách tốt nhất để làm như vậy không? :

function make_safe($variable) { 
$variable = strip_tags(mysql_real_escape_string(trim($variable))); 
return $variable; } 

Hoặc nào mysql_real_escape_string đã ngăn chặn XSS? Và cuối cùng, có điều gì khác mà tôi có thể thêm vào chức năng này để ngăn chặn các hình thức hack khác không?

+3

Không có cây đũa thần, chỉ cần cảnh giác liên tục. –

+3

Bạn và [PDO] (http://php.net/manual/en/book.pdo.php) sẽ trở thành bạn bè! – Jacob

+0

Tôi không thực sự hiểu những gì hai bạn đang nói;) – LonelyWebCrawler

Trả lời

11

mysql_real_escape_string() không ngăn XSS. Nó sẽ chỉ làm cho không thể làm tiêm SQL.

Để chống lại XSS, bạn cần sử dụng htmlspecialchars() hoặc strip_tags(). Ngày 1 sẽ chuyển đổi các ký tự đặc biệt như < thành &lt; sẽ hiển thị dưới dạng <, nhưng sẽ không được thực thi. Thứ 2 chỉ xóa tất cả các thẻ ra.

Tôi không khuyên bạn nên thực hiện chức năng đặc biệt để làm điều đó hoặc thậm chí làm cho một chức năng để làm tất cả, nhưng ví dụ của bạn sẽ làm việc. Tôi giả sử.

+0

Tại sao không phải là một chức năng? – LonelyWebCrawler

+0

Và tôi không thể sử dụng chỉ strip_tags(), làm cho htmlspecialchars() dư thừa? – LonelyWebCrawler

+0

# 1 câu hỏi - không có gì phù hợp với tất cả. # 2 câu hỏi - đó là đúng. – daGrevis

13

Chức năng này:

function make_safe($variable) 
{ 
    $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
    return $variable; 
} 

Sẽ không làm việc

SQL injection và XSS là hai con thú khác nhau. Vì chúng yêu cầu thoát khác nhau, bạn cần phải sử dụng từng hàm thoát strip_tagsmysql_real_escape_string riêng biệt.
Tham gia cùng họ sẽ đánh bại tính bảo mật của mỗi người.

Sử dụng tiêu chuẩn mysql_real_escape_string() khi nhập dữ liệu vào cơ sở dữ liệu.
Sử dụng strip_tags() khi truy vấn nội dung ra khỏi cơ sở dữ liệu trước khi xuất chúng ra màn hình.

Tại sao kết hợp hai chức năng là nguy hiểm
Từ ngựa miệng: http://php.net/manual/en/function.strip-tags.php

Vì strip_tags() không thực sự xác nhận HTML, các thẻ một phần hoặc bị hỏng có thể dẫn đến việc loại bỏ các văn bản hơn/dữ liệu hơn dự kiến.

Vì vậy, bằng cách nhập html không đúng định dạng vào trường cơ sở dữ liệu, kẻ tấn công thông minh có thể sử dụng triển khai ngây thơ của bạn để đánh bại mysql_real_escape_string() trong combo của bạn.

+0

Vì vậy, tôi sử dụng mysql_real_escape_string() khi thêm dữ liệu vào cơ sở dữ liệu, nhưng không phải khi so sánh đầu vào của người dùng với các mục cơ sở dữ liệu (như khi đăng nhập)? – LonelyWebCrawler

+0

@user, Bạn sử dụng 'mysql_real_escape_string()' ** luôn **, trên mọi truy vấn, có thể chọn, cập nhật xóa hoặc chèn. – Johan

2

Điều bạn thực sự nên xem xét là sử dụng prepared statementsPDO cho cả hai cung cấp lớp trừu tượng đối với cơ sở dữ liệu của bạn cũng như xóa hoàn toàn các cuộc tấn công SQL injection.

Đối với XSS, chỉ cần đảm bảo không bao giờ tin vào đầu vào của người dùng. Hoặc chạy strip_tags hoặc htmlentities khi bạn lưu trữ dữ liệu hoặc khi bạn xuất dữ liệu (không phải cả hai điều này sẽ gây rối với đầu ra của bạn) và bạn sẽ ổn thỏa.

+0

Tôi chưa từng nghe đến PDO. Đó là gì? – LonelyWebCrawler

+0

PDO là một lớp trừu tượng cơ sở dữ liệu đi kèm với PHP. Có một cái nhìn ở đây để giới thiệu: http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ –

Các vấn đề liên quan