1

我想知道为什么这个类不起作用,但是如果这段代码直接写在aspx页面中,它就可以了。我希望在课堂上使用它,因为在多个页面中多次调用以检查用户是否已被计为访问者。这样做的主要想法是计算正在查看我的网站的用户数量。


错误是这样的: ':'附近的语法不正确

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息: System.Data.SqlClient.SqlException:“:”附近的语法不正确。


这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.IO;
using System.Data;
using System.Text;

namespace Project
{
    public class ipAddress
    {
        SQL com = new SQL(); //Class to make SQL connection and do querys
        public void GetPublicIP()
        {
            WebClient web = new WebClient();
            System.IO.Stream stream = web.OpenRead(url);
            string text = "";
            using (System.IO.StreamReader reader = new System.IO.StreamReader(stream))
            {
                text = reader.ReadToEnd();
                reader.Close();
            }
            string results = "";
            try
            {
                foreach (DataRow item in com.Execute("select * from table where ip = '" + text + "' and data = '" + DateTime.Now.ToShortDateString() + "';").Rows)
                {
                    results = item["ip"].ToString();
                }
                if (results == "")
                {
                    com.FazerComando("insert into table (ip, date) values ('" + text + "', '" + DateTime.Now.ToShortDateString() + "');");
                }
            }
            catch { }
        }
    }
 }

问候...

4

2 回答 2

5

好吧,我们不知道这个SQL类是什么,但看起来您正在将值直接注入 SQL,这是一个非常糟糕的主意。它会引发SQL 注入攻击,混合代码和数据,并使围绕数字和日期/时间值的转换比需要的困难得多。(在这种特殊情况下,您很幸运 - 您正在构建的字符串只是无效的 SQL。它不会清除您的数据库。)

相反,您应该使用在 SQL 本身中包含“占位符”的参数化 SQL ,并单独提供值。

假设SQL是你自己的类,你应该给它使用参数化 SQL 的便利。参见SqlCommand.Parameters示例。

于 2012-07-04T17:42:52.280 回答
0

您的“文本”变量中有撇号(或更糟)。您基本上是在自我注入您的 SQL 数据库。非常非常糟糕的juju。

于 2012-07-04T17:45:30.417 回答