回 帖 发 新 帖 刷新版面

主题:一段代码,麻烦各位大虾帮小弟看看。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<script runat="Server">
void Search(Object sender,EventArgs e)
{
SqlConnection Conn=new SqlConnection();
Conn.ConnectionString="server=(local);database=Library;uid=sa;pwd='123456'";
SqlCommand Comm=new SqlCommand("select count(*) from borrow where ReaderID="+ReaderID.Text+"",Conn);
Conn.Open();
int i=Convert.ToInt32(Comm.ExecuteScalar());
if(i>=3){
dg.DataSource=Comm.ExecuteReader();
dg.DataBind();
}
Connn.Close();
</script>
<form name="my form" runat="Server">
<asp:TextBox id="ReaderID" size="20" runat="Server"/>

<asp:DataGrid id="dg" runat="Server"/>
</form>

很简单的一段程序,就是在文本框输入一个读者id,然后程序在数据库根据这个id查询,如果这个读者的记录超过三个就显示出来!可是编译器报错。错误貌似是"where ReaderID="+ReaderID.Text+""因为我交互式的输入而改用静态定义就能运行,譬如"where ReaderID=10000"。我想请教各位大虾原因是什么?怎么解决这个问题?
谢谢咯^_^

回复列表 (共3个回复)

沙发

这个问题我没有遇到过,怎么觉得不可能啊。

不过一般不建议这样使用,特别是要从客户端得到输入数据作为查询的条件时这样用是非常危险的,建议你改为使用参数,即
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<script runat="Server">
void Search(Object sender,EventArgs e)
{
SqlConnection Conn=new SqlConnection();

SqlParameter param=new SqlParameter("@id",int.Parse(ReaderID.Text));

Conn.ConnectionString="server=(local);database=Library;uid=sa;pwd='123456'";
SqlCommand Comm=new SqlCommand("select count(*) from borrow where ReaderID=@id",Conn);
Comm.Parameters.Add(param);
Conn.Open();
int i=Convert.ToInt32(Comm.ExecuteScalar());
if(i>=3){
dg.DataSource=Comm.ExecuteReader();
dg.DataBind();
}
Connn.Close();
</script>
<form name="my form" runat="Server">
<asp:TextBox id="ReaderID" size="20" runat="Server"/>

<asp:DataGrid id="dg" runat="Server"/>
</form>

板凳

解决!非常感谢!!!!为什么“从客户端得到输入数据作为查询的条件时这样用是非常危险的”?

3 楼

你可以搜索sql注入等相关资料。比较明显的是假如你在输入处输入'等字符时能出现什么情况呢?而用参数时这些特殊字符都会被编码的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册