SQL 문자열 안에 확인란의 이름을 추가해도 작동하지 않으며 물론 Convert.ToByte도 호출하지 않습니다. 이 방법으로 문자열 안에 컨트롤의 이름과 값을 변환해야하는 함수의 이름을 간단하게 삽입 할 수 있습니다. 물론 이것은 데이터베이스의 SQL 파서에 대한 잘못된 SQL 명령 일뿐입니다.
대신 C# 코드에서 유효한 SQL 명령을 만드는 문제를 해결해야합니다. 이 문제
dt=g1.ExecDB("insert into tbl (check1,check2,check3) values(" +
(check1.Checked ? "1" : "0") + ", " +
(check2.Checked ? "1" : "0") + ", " +
(check3.Checked ? "1" : "0") +
") where loginname='"+Session["log"].ToString()+"'");
에 초기 가능한 해결책이지만 Session["log"]
의 연결에 큰 문제가있다. 에 취약하기 때문에 sql 명령을 형성하기 위해 문자열 값 (아마도 사용자 입력으로 설정)을 연결하는 것은 매우 나쁜 습관입니다. 따라서 매개 변수 목록을 수신하려면 ExecDB
으로 변경해야합니다. 당신이 어디에 코드가있는 경우
나는이
public int ExecDB(string query, List<SqlParameter>parameters = null)
{
using(SqlConnection cn = new SqlConnection(connString))
using(SqlCommand cmd = new SqlCommand(query, cn))
{
cn.Open();
if(parameters != null && parameters.Count > 0)
cmd.Parameters.AddRange(parameters.ToArray());
return cmd.ExecuteNonQuery();
}
}
처럼 뭔가에 ExecDB을 변경하고 ExecDB에 전달
List<SqlParameter> ps = new List<SqlParameter>();
SqlParameter p = new SqlParameter("@login", Session["log"].ToString());
ps.Add(p);
dt=g1.ExecDB("insert into tbl (check1,check2,check3) values(" +
(check1.Checked ? "1" : "0") + ", " +
(check2.Checked ? "1" : "0") + ", " +
(check3.Checked ? "1" : "0") +
") where [email protected]", ps);
List<SqlParameter>
매개 변수를 호출하는 것이 좋습니다, 따라서, 선택 사항입니다 ExecDB를 호출하면 매개 변수 컬렉션이 필요하지 않으므로 코드를 그대로 둘 수 있습니다.
리플 로우 코드입니다. 왼쪽 구문 오류가 손상되지 않았습니다. –
데이터 값을 절대 그런 식으로 연결하지 마십시오. ** 항상 ** 매개 변수화 된 쿼리를 사용하십시오. – Alejandro
SQL이 작동하지 않기 때문에 SQL 명령 프롬프트 (예 : SQL Management Studio)로 이동하여 직접 명령을 입력하십시오. 애플리케이션 코드에서 여분의 레이어를 통과하는 것보다 디버깅하는 것이 훨씬 쉽습니다. 또한 알레한드로가 말한 것을 되풀이합니다. 사용중인 클라이언트 측 기법은 SQL 삽입 공격에 취약합니다. 누군가가 "log"세션 변수의 이름을 다음과 같이 변경하면 어떨까요 : ' '; tbl에서 삭제; - ' – catfood