如何使这三个语句对SQL注入更安全?

时间:2011-04-04 21:40:05

标签: c# php

1

$con = mysql_connect("localhost","","");
if (!$con)
  {
      die('Could not connect: ' . mysql_error());
  }

mysql_select_db("jbell2", $con);

$sql="INSERT INTO Profile (username, Date, Height, Weight, WaistSize, WeightforHeight, Blood_Pressure, Medication, Total_Cholesterol, Bad_Cholesterol, Good_Cholesterol, Triglycerides,KidneyFunctionTest)
VALUES 

('$_Post[username]', '$_POST[Date]', '$_POST[Height]', '$_POST[Weight]', '$_POST[WaistSize]','$_POST[WeightforHeight]', '$_POST[Blood_Pressure]','$_POST[Medication]' ,'$_POST[Total_Cholesterol]' ,'$_POST[Bad_Cholesterol]' ,'$_POST[Good_Cholesterol]','$_POST[Triglycerides]','$_POST[KidneyFunctionTest]' )";

2

          MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";");
            con.Open();
            MySqlCommand cmd = new MySqlCommand("INSERT INTO Patients(username, password, FirstName, SecondName, DiabetesType, Email,Phone, Phone2, Question1, Question2,TreatmentPlan)"
+ "values" + "('" + uname.Text + "','" + password.Text + "','" + fname.Text + "','" + lname.Text + "','" + Dtype.Text + "','" + email.Text + "','" + phone.Text + "','" + phone2.Text + "','" + q1.Text + "','" + q2.Text + "','" + treatment.Text + "')");
            cmd.Connection = con;
            cmd.ExecuteNonQuery();
            con.Close();

4 个答案:

答案 0 :(得分:3)

关于PHP的Dunno,但在C#中你可以使用参数而不是直接注入值。

using (MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";"))
{
    con.Open();
    string strSQL = "INSERT INTO Patients(username, password, FirstName, SecondName, DiabetesType, Email,Phone, Phone2, Question1, Question2,TreatmentPlan) values (?name, ?password, .....)";
    using (MySqlCommand cmd = new MySqlCommand(strSQL, con))
    {
        cmd.Parametrs.AddWithValue("?name", fname.Text);
        cmd.Parametrs.AddWithValue("?password", lname.Text);
        ..........
        cmd.ExecuteNonQuery();
    }
}

只需要?后跟一些标识符来标记您添加参数,然后使用AddWithValue插入实际值。
还展示了如何使用using正确处理对象。

答案 1 :(得分:3)

在C#部分:

MySqlCommand cmd = new MySqlCommand("INSERT INTO Patients (username, password, FirstName, 
//...
+ "values" + "('" + uname.Text + "','" + password.Text + "','" + fname.Text + "','" +  
//...
+ "')");

这些值应作为参数传递。您的命令文本应该像这样构建:

MySqlCommand cmd = new MySqlCommand("INSERT INTO Patients (username, password, FirstName, 
//...
+ "values (@username, @password, @FirstName, 
//...
+ "')");

在此之下,你应该有这样的东西:

cmd.Parameters.AddWithValue("username", uname.Text);
cmd.Parameters.AddWithValue("password", password.Text);
cmd.Parameters.AddWithValue("FirstName", fname.Text);
//...

如果你不这样做,那你就会遇到很多麻烦。

答案 2 :(得分:2)

首先,您没有SQL语言中的任何字词。

在2和3中你通过串联字符串创建SQL Query,这是错误的;在2中你可以使用PDO来准备PDOStatement对象并执行它安全地传递参数,其次你可以准备这个查询并传递参数但是必须阅读文档如何做到这一点。

阅读本文:http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html

答案 3 :(得分:2)

对于选项2,

在使用mysql_real_escape_string()插入数据库之前,你应该最终真正地转义字符串。

并且在插入db之前应始终验证数据。检查您是否获得了所需的数据,并替换了您应该获得的任何字符。