2012-08-14 23 views
6

Tôi cần triển khai tìm kiếm nơi người dùng có thể nhập * dưới dạng thẻ hoang dã. Cơ sở dữ liệu mà họ đang tìm kiếm là một máy chủ SQL. Tôi đã nghĩ đến việc chỉ thay thế * bằng một%:Cách sử dụng * làm thẻ hoang dã trong truy vấn SQL an toàn

userInput = userInput.replace('*', '%'); 

Tôi lo lắng vì tôi đang làm điều này "bằng tay" tôi có thể giới thiệu một số lỗi hoặc lỗ hổng bảo mật. Bạn có thấy có vấn đề gì khi làm như thế này không? Có thư viện nào để làm điều này cho tôi không?

Tôi sử dụng Hibernate làm trình ánh xạ ORM và API tiêu chí để tạo truy vấn nếu nó có câu trả lời.

+1

Nếu bạn đang sử dụng 'like', bạn cũng muốn thoát hiện tại'% ',' _' và '[...]'. Điều này * có thể * là một bản sao của: [Thoát một chuỗi trong SQL Server để nó được an toàn để sử dụng trong biểu thức LIKE] (http://stackoverflow.com/questions/258757/escape-a-string-in-sql- Máy chủ-để-đó-là-an toàn-để-sử dụng-trong-như-biểu hiện) – Kobi

+0

nhưng miễn là bạn đang sử dụng một PreparedStatement, bạn sẽ không gây ra bất kỳ sai sót bảo mật. –

+0

@Kobi Cảm ơn, tôi không biết về _ và []. Phải thử cách những người đó ảnh hưởng đến truy vấn. Hibernate cho phép tôi đặt ký tự Escape để tôi có thể cập nhật câu hỏi này với tôi để cố thoát khỏi những thứ tôi không muốn người dùng sử dụng. – palto

Trả lời

2

Đó chính xác là những gì chúng tôi làm trong công ty của mình. Chúng tôi có hai sản phẩm, một sản phẩm sử dụng một thay thế đơn giản trong mã như ví dụ của bạn. Một trong những khác là rất thủ tục lưu trữ nặng hiện nó trong 'tìm kiếm' lưu trữ proc chính nó.

Dù bằng cách nào, chúng tôi chưa gặp phải bất kỳ sự cố bảo mật hoặc khiếu nại người dùng nào về hệ thống.

Chỉ cần để hiển thị các layout thủ tục lưu trữ, nhưng có lẽ không cần thiết như bạn nói bạn ORM sử dụng:

CREATE PROC [dbo].[p_aaa] 
    @username nvarchar(100) = 'dbo', 
    @rows int = 0, 
    @name nvarchar(100) = '%'  
AS 

SET @name = REPLACE(@name, '*', '%') 
2

Tôi tin rằng thay đổi * đến% sẽ không gây ra bất kỳ vấn đề, nếu tất cả các dữ liệu trong bảng đó là công khai dựa trên giá trị tìm kiếm này. Ngoài ra còn có similar topic có nhiều ví dụ regexp hơn cho sql.

Điều này sẽ làm cho ứng dụng của bạn độc lập hơn sử dụng database vendror-specific regexp matching mechanism.

+0

Đó không phải là cách khác? Nếu tôi chuyển đổi nó trong lớp dịch vụ, tôi sẽ viết mã cứng những gì mà tôi phải thực hiện trong cơ sở dữ liệu cụ thể này. Nếu tôi làm điều đó trong lớp DAO, tôi có thể có các triển khai khác nhau cho các kho lưu trữ khác nhau. Tôi thậm chí có thể có kho dữ liệu NOSQL. – palto

+0

Tôi đoán bạn đúng .. – JMelnik

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