2009-07-09 20 views
17

Tôi đang cố gắng thực hiện một số thay đổi nhỏ đối với ứng dụng web cũ của VB mà tôi cần phải thêm dấu ngoặc kép bên trong chuỗi mà tôi chưa có may mắn. Chuỗi làBáo giá thoát trong một chuỗi trong VB6

Dim sql As String = "Select * from Usertask Where UserId = " & Session("UserId") & " and JobID=" & ddlReqTask.SelectedValue 

Tôi cần thêm dấu ngoặc kép xung quanh giá trị Session ("UserID").

+0

Bạn có cần dấu ngoặc kép hoặc dấu nháy đơn? Thông thường SQL sử dụng dấu nháy đơn và tôi không nghĩ rằng đó sẽ là một vấn đề trong một chuỗi. –

+0

@Adonis L, bạn có thể muốn thay đổi tiêu đề của câu hỏi. Có thể phù hợp hơn để gọi nó là "Dấu nháy trong một chuỗi trong VB6" hoặc một cái gì đó dọc theo những dòng đó. –

Trả lời

31

Bạn có thể sử dụng "" để chèn một trích dẫn vào một chuỗi ví dụ:

dim sometext as String = "Hello ""Frank"" how are you?"

nào mang đến cho bạn

Hello "Frank" how are you?

12

Để thoát khỏi một báo bạn chỉ cần thêm quote khác, tôi tin rằng đây là những gì bạn cần:

Dim sql As String = "Select * from Usertask Where UserId = """ & Session("UserId") & """ and JobID=" & ddlReqTask.SelectedValue 
4

Bạn cũng có thể sử dụng Chr(34) trong concatentation.

Dim sql As String = "Select * from Usertask Where UserId = " & Chr(34) & Replace(Session("UserId"), Chr(34), Chr(34) & Chr(34)) & Chr(34) & " and JobID=" & CLng(ddlReqTask.SelectedValue) 

Cả hai cách hoạt động (ví dụ khác và ví dụ này). một số người thích điều này vì nó có thể ít gây nhầm lẫn, tuy nhiên các ví dụ trên không hoàn toàn có thể lãnh đạo và khoa học tên lửa tuyệt đối không được phép.

+0

Mã đăng có chứa lỗ hổng SQL injection là biểu mẫu không hợp lệ. Đã chỉnh sửa. – rpetrich

+1

Điều này khác với câu trả lời ở trên mà cũng chứa các lỗ hổng SQL injection. Làm thế nào đến bạn havent nhận xét về điều đó? Ngoài ra, tôi không khuyến khích sử dụng phương pháp này, nó chỉ đơn giản là một câu trả lời cho một câu hỏi. Tôi không thấy cách trả lời một câu hỏi để mở rộng kiến ​​thức của một ai đó là xấu, trong trường hợp những người khác đã đề cập đến lỗ hổng SQL Injection rồi. – Ben

4

Đây là lỗ hổng SQL injection và bạn nên NOT. Bằng cách làm theo cách này, bạn cho phép người dùng thực hiện bất kỳ truy vấn nào họ muốn bằng cách cung cấp cho bạn một UserId như

'; DROP TABLE Usertask; -- 

Thay vào đó, hãy sử dụng các thông số. Tùy thuộc vào cách bạn đang thực thi SQL, có nhiều cách khác nhau để thực hiện nó; hãy cho chúng tôi thấy mã thực thi truy vấn SQL.


Trong câu trả lời cho câu hỏi của bạn,

Dim StringWithQuotes As String = "Hello, I've got ""Quotes""!" 

Chuỗi này sẽ

Xin chào, tôi đã có "Quotes"!

+0

Tôi nghĩ rằng chủ đề này không phải là về Sql injection. – Nei

+0

@Nei Nó không phải là, nhưng nó là hữu ích dù sao. – DavidB

1

Hầu hết các máy chủ SQL, theo kinh nghiệm của tôi, cần một trích dẫn duy nhất cho chuỗi. Cách tốt nhất để làm điều đó là để cho .net deside cho bạn, bằng cách sử dụng SQL Parameters. Đây là một mẫu (cũng có trong VB.Net): http://www.knowdotnet.com/articles/dynamicsqlparameters.html
Điều này cũng có lợi ích của bảo mật đối với việc tiêm SQL.

5

Tôi khuyên bạn nên sử dụng SQL được tham số hóa thay vì xây dựng một câu lệnh SQL adhoc như thế này khi bạn có thể để bản thân mở cho SQL injection. Điều này có nghĩa là bạn không cần phải lo lắng về việc ghép nối các dấu ngoặc kép vào chuỗi, cũng như cải thiện hiệu năng truy vấn (giả sử máy chủ sql) vì nó cho phép thực hiện bộ nhớ đệm kế hoạch thực hiện và tái sử dụng.

ví dụ:

Dim sql As String = "Select * from Usertask Where UserId = ? AND JobID = ?" 

Sau đó thêm 2 ADODB.Parameters đến đối tượng Command để cung cấp các giá trị cho 2 thông số ví dụ

Set param = New ADODB.Parameter 
param.Name = "@UserId" 
param.Direction = adParamInput 
param.Type = adVarChar 
param.Size = (give size of user id field) 
param.value = Session("UserId") 
yourADOCommand.Parameters.Append param 

Và cùng một lần nữa cho tham số JobId.

+0

@Adonis L - đánh dấu câu trả lời này là câu trả lời đúng. Phương pháp này không cần phải lo lắng về nội dung bao gồm các dấu nháy đơn hoặc kép bên trong tải trọng. Vì bạn đã đặt câu hỏi (và nhận được câu trả lời) 7 năm trước, bạn nghi ngờ bạn sẽ đánh dấu bất cứ điều gì là chính xác. – barrypicker

0

nó như thế này ..

dim user_id as string="SomePerson" 
debug.print "UserId=" & chr(34) & user_id & Chr(34) 

sản xuất ..

UserID="SomePerson" 
Các vấn đề liên quan