나는 문자열 연결이 SQL 삽입에 취약하다는 것을 배웠다. 슬프게도 나는 대부분 내 코드에 이미 적용했다. 매개 변수화 된 쿼리를 통합하려고하지만 어떻게 든 온라인 예제가 내 문제에 대답하지 않습니다. 내가 본 대부분의 예는 이것이다 :asp.net에서 매개 변수화 된 쿼리를 만드는 방법은 무엇입니까?
string query = "SELECT * FROM Products WHERE ProductID = @Id";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@Id", Request.QueryString["Id"]);
그러나 나는이 같은 SQL 문을 경우 : 또한
public static void CreateLingerieBrandsDatabase(string brand)
{
SqlConnection createBrandData = new SqlConnection(@"Data Source=Y560\SQLEXPRESS;Initial Catalog=LingerieItemsDB;Integrated Security=True");
createBrandData.Open();
SqlCommand cmdBrandData = new SqlCommand("CREATE TABLE lingerieItem" + brand + "(id int,type char(50),model char(50),price float,image1 char(255),image2 char(255),description text, [neck type], [color] char(50)); ", createBrandData);
cmdBrandData.ExecuteNonQuery();
createBrandData.Close();
}
를, 내가하는 것입니다, 텍스트 상자에 문자열 브랜드의 가치를 얻고있다 CreateLingerieBrandsDatabase 메서드에 전달 될 수 있습니다. 문자열 연결로 넘어갑니다. 그건 그렇고, 내가 왜 lingerieItemGlamory, lingerieItemEvgenia 및 lingerieItemVictoria 같은 각 브랜드에 대한 3 개의 별도의 테이블을 만들었 기 때문에 내가 테이블 이름에 문자열 연결을 사용하는 이유입니다. 관리자가 텍스트 상자에 Glamory를 입력 한 다음 제출을 클릭하면 액세스 할 데이터베이스 테이블을 알게됩니다.
EDITED : 위의 예에서 언급 한 3 개의 이전 브랜드 (연결된 부분 제외)와 동일한 테이블 이름을 가진 새 데이터베이스가 생성됩니다. 따라서 액세스 할 시간이되면 액세스 할 수있는 브랜드를 알 수 있습니다.
내 코드가 지저분하고 아직 초보자 인 것을 알고 있습니다. 여러분이 저에게 더 나은 솔루션을 제안하고 코드를 향상 시키길 바랍니다. 실제 사례를 제공하는 것도 매우 높이 평가됩니다. 와!
을 방지하기 위해이 목록에 대해
brand
변수 값을 확인합니다. 즉, ddl 문에서 매개 변수를 사용할 수 없습니다. 그러나 테이블을 만드는 것은 디자인 타임 작업이며 런타임 작업이 아닙니다. 사용자가 데이터베이스 구조를 처리하게하는 것은 거의 좋은 생각이 아닙니다. 또한 여러 브랜드에 대해 동일한 구조의 여러 테이블을 유지하지 말고 하나의 테이블을 만들고 브랜드를 나타내는 열을 추가하십시오. –@ZoharPeled - 알겠습니다. 좋아, 나는 그 변화에 대해 명확하게 브레인 스토밍을 할 것이다. –
일반적으로 데이터 모델이 손상되었다는 것을 인식하면이를 해결할 수 있습니다. * 데이터 * (브랜드 이름)를 데이터로 모델링하지 않고 * 메타 데이터 * (테이블 이름)에 포함시킵니다. 'brand' 컬럼을 포함하는 * single *'lingerieItems' 테이블을 가지고 있다면이 쿼리는 갑자기 * 쉽게 * 작성되어 기본 매개 변수화에 열리게 될 것입니다. –