2011-03-19 3 views
1

저는 사용자가 비교할 항목을 선택할 수 있도록 프로젝트를 진행하고 있습니다. 내 접근 방식은 사용자가 선택한 (쿼리 상자를 사용하여) 쿼리 문자열을 새 페이지 인 compare.aspx로 보내는 것입니다. 나는이 compare.aspx에 대한있는 gridview를 사용하고 여기에 코드입니다 :Visual C#에서 쿼리 문자열을 매개 변수로 사용하여 gridview를 표시합니다.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="compare.aspx.cs" Inherits="AsiaWebShop.compare" %> 

제목 페이지 뒤에

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
     DataKeyNames="item_id" DataSourceID="SqlDataSource1"> 
     <Columns> 
      <asp:BoundField DataField="item_id" HeaderText="item_id" InsertVisible="False" 
       ReadOnly="True" SortExpression="item_id" /> 
      <asp:BoundField DataField="item_name" HeaderText="item_name" 
       SortExpression="item_name" /> 
      <asp:BoundField DataField="category" HeaderText="category" 
       SortExpression="category" /> 
      <asp:BoundField DataField="pic_path" HeaderText="pic_path" 
       SortExpression="pic_path" /> 
      <asp:BoundField DataField="item_description" HeaderText="item_description" 
       SortExpression="item_description" /> 
      <asp:BoundField DataField="regular_price" HeaderText="regular_price" 
       SortExpression="regular_price" /> 
      <asp:BoundField DataField="member_price" HeaderText="member_price" 
       SortExpression="member_price" /> 
      <asp:BoundField DataField="promo_price" HeaderText="promo_price" 
       SortExpression="promo_price" /> 
      <asp:BoundField DataField="stock" HeaderText="stock" SortExpression="stock" /> 
      <asp:BoundField DataField="upc" HeaderText="upc" SortExpression="upc" /> 
     </Columns> 
    </asp:GridView> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:awsdbConnectionString %>" 
     ProviderName="<%$ ConnectionStrings:awsdbConnectionString.ProviderName %>" 
     SelectCommand="SELECT * FROM [item] WHERE ([upc] = ?)"> 
     <SelectParameters> 
      <asp:QueryStringParameter Name="upc" QueryStringField="query" Type="String" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 

</div> 
</form> 

코드 여기에 :

namespace AsiaWebShop 
{ 
    public partial class compare : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     SqlDataSource1.SelectCommand = "SELECT * FROM [item] WHERE [upc] = " +Request.QueryString["query"]; 
     } 
    } 
} 

그러나 "데이터 형식이 일치하지 않습니다"라는 오류가 발생했습니다. 이유는 무엇입니까? 죄송합니다 나는 asp.net 및 C#에 대한 완벽한 초보자입니다. 제발 .. 제발 ...

답변

0

HTTP 문자열을 입력 양식을 사용하여 SQL 문자열을 작성하는 것은 보안 상 위험 할 수 있습니다. 최대 SQL injection attacks까지 열립니다.

코드 숨김없이 코드가 정상적으로 작동하는 것처럼 보입니다. 쿼리 문자열에서 원하는 값을 캡처 할 데이터 소스에 이미 매개 변수를 추가했습니다. 이 목적을 위해 매개 변수를 사용하면 SQL 주입으로부터 안전하게 보호 할 수 있습니다. SQLDataSource 선언의 매개 변수에 기본값을 추가 할 수 있습니다.

확실히 모든 코드를 제거하고 문제가 해결되는지 확인합니다.

(편집) : 원래의 질문에 대답하려면 데이터베이스의 열 upc 문자열 유형 (아마 varchar)이 있기 때문에 당신이 오류은 "조건 식에서 데이터 형식이 일치"를 얻고있는 이유입니다. upc 열과 비교하여 하드 코딩 된 SQL 문자열을 작성하려는 경우 비교를 위해 사용하는 값을 작은 따옴표로 묶습니다 (SQL 쿼리 구문을 생각해보십시오). 따옴표를 포함하지 않았으므로 SQL 인터프리터는 값을 문자열로 인식하지 않습니다.

SQL에서 하드 코딩 된 값을 사용하지 않는 것이 좋습니다. SQL 인젝션의 보안 위험에 유의하십시오.

+0

Re : "쿼리 매개 변수를 사용하여 SQL 문자열을 작성하는 것은 보안상의 위험이 있습니다."- 말하려는 내용은 정확하지만 문구가 혼동 스럽습니다. SQL 매개 변수도 쿼리 매개 변수입니다. –

+0

보안 위험에 대해 생각 나게 해주셔서 대단히 감사합니다. 그러나 이것은 단지 학교 프로젝트이므로, 당분간은 괜찮을 것이라고 생각합니다. – rexcfnghk

+0

내 코드에서 작은 따옴표를 어디에 포함시켜야하는지 구체적으로 인용 해 주시겠습니까? ? 그리고 ASP.net의 작은 따옴표에 대한 특정 구문이 있습니까? 나는 완전히 새로운 asp.net 및 woud 정말 도움을 주셔서 감사합니다. – rexcfnghk

관련 문제