SQL注入攻击

时间:2011-03-29 06:13:30

标签: php mysql sql sql-injection

如何保护我的网站免受SQL注入攻击?我使用PHP和MySQL。我必须改变我的mysql查询吗?

例如,我有一个这样的查询:

<?php
$q=$_GET["q"];// im getting the Q value from the other form,from drop down box[displaying data using Ajax
$a1=$_POST['hosteladmissionno'];
$a2=$_POST['student_name'];
$a3=$_POST['semester'];
$con = mysql_connect('localhost', 'root', '');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("hostel", $con);

$a1="SELECT  hosteladmissionno,student_name,semester FROM registration 
WHERE mess_type ".$q."' AND  status_flag=1";

$result = mysql_query($a1);

if ($result === false) {

    die(mysql_error());
}
echo "<table border='1' width=80%>
<tr>
 <th width=5%> S.No</th>
<th width=10%>H.Admin No</th>
<th width=10%>Student Name</th>
<th width=5%>No of Days</th>
</tr>";
 $i=0;
while($row = mysql_fetch_array($result))
  {
  $i=$i+1;
  echo "<tr>";
  echo "<td  align=center>" .$i."</td>";
  echo "<td size=10 align=center>" . $row['hosteladmissionno'] . "</td>";
  echo "<td size=35  align=center>" . $row['student_name'] . "</td>";
  echo "<td  align=center>  <input type='text' name='days' size=2> </td> ";
  echo "</tr>";
  }
echo "</table>";

mysql_close($con);
?>

我是否必须在查询中包含任何更改以避免注入攻击?任何建议都会有所帮助。谢谢。干杯!

6 个答案:

答案 0 :(得分:3)

您的查询出现(编辑:在查询的第一个版本中出现)完全是静态的 - 即它不使用任何用户提供的数据。在这种情况下,不存在SQL注入的风险。

SQL注入攻击涉及获取用户输入并将其直接包含在SQL查询中,而不是使用参数化SQL语句并以这种方式包含用户提供的值的首选方法。 (我不知道在PHP中如何完成的细节...我当然希望它是可能的。)

编辑:好的,现在你已经改变了你的代码,包括:

$a1="SELECT  hosteladmissionno,student_name,semester FROM registration 
WHERE mess_type ".$q."' AND  status_flag=1";

从文本框中检索$q的位置。现在我假设你真的意味着第二行:

WHERE mess_type='".$q."' AND  status_flag=1";

但是仍然容易受到SQL注入攻击。假设q的值为:

' OR 'x'='x

您的SQL语句最终会以

结尾
SELECT hosteladmissionno,student_name,semester FROM registration 
WHERE mess_type='' OR 'x'='x' AND  status_flag=1

这显然不是你追求的逻辑。

您应该使用参数作为值,如PHP prepared statement page所示。

答案 1 :(得分:2)

当您从用户获取数据并在查询中使用它而不采取措施阻止它对该查询进行预期更改时,就会发生SQL注入攻击。

由于您在该查询中根本没有使用任何变量,因此您无法这样做,因此它是安全的。

有关详细信息,请参阅http://bobby-tables.com/

答案 2 :(得分:0)

我给出的建议是使用准备好的陈述。在实践中,使用一个优秀的数据库抽象层很容易实现:

答案 3 :(得分:0)

将其置于脚本的mysql_selected_database部分

之上
$qtitle = addcslashes(mysql_real_escape_string($cleantitle),'%_');

其中$ cleantitle是您从表单中检索的原始值

如果您使用的形式是..

答案 4 :(得分:0)

根据维基百科(上帝保佑谷歌):

  

SQL注入是代码注入   利用安全性的技术   漏洞发生在   应用程序的数据库层。该   用户存在漏洞   输入被错误地过滤   用于字符串文字转义字符   嵌入在SQL语句或用户中   输入不是强类型的   从而意外地执行。它是   一个更一般的类的实例   可能发生的漏洞   无论何时编程或编写脚本   语言嵌入另一个语言。   SQL注入攻击也是已知的   作为SQL插入攻击。

http://en.wikipedia.org/wiki/SQL_injection

答案 5 :(得分:0)

虽然你的查询足够安全,但如果你仍然可疑,那么用表格中的整数类型的字段名称键入cast (int)(php方式)或CAST(mysql方式)等...... ..