这个PHP代码是否容易受到SQL注入攻击?

时间:2012-04-28 17:31:04

标签: php mysql

我有一个网站,我在服务器端使用PHP,mysql作为数据库。我使用以下脚本从数据库中检索数据。有人能让我知道这段代码是否容易受到注入攻击?如果是这样,请你提出解决方案吗?

<?php
// PHP script 

$usrname=$_POST['usrname'];
$_SESSION['usremail']=$usrname;
$usrpassword=$_POST['passwd']; 
$db=mysql_select_db('mydb',$connection);
$result=mysql_query("select usrfname,usrlname from userinformation where usremail='$usrname' and usrpassword='$usrpassword'") or die('failed to login');

非常感谢任何帮助。

由于

5 个答案:

答案 0 :(得分:6)

是的,它很脆弱。您直接从用户输入中查询值并将其放入查询中。

您应该查看mysql_real_escape_string,或者(最好)使用提供参数化查询的MySQLi。 SQL注入是由用户数据作为SQL代码而不是数据注入引起的。保护查询的唯一真正方法是使用参数化查询,它在协议级别分离数据和查询文本。

此外,您的密码以纯文本格式存储。您应该使用盐渍哈希函数作为绝对最小值。

您还应该看看这些令人敬畏的问题:

答案 1 :(得分:4)

当然它很脆弱。你永远不会消毒你的输入。虽然不推荐使用mysql_ *函数,但您仍然可以使用mysql_real_escape_string函数。只需将其应用于您的变量即可。

$usrname = mysql_real_escape_string($_POST['usrname']);
$usrpassword = mysql_real_escape_string($_POST['passwd']);

答案 2 :(得分:2)

是的,它是..

请改为:

$usrname=$_POST['usrname'];
$_SESSION['usremail']=$usrname;
$usrname=mysql_real_escape_string($usrname);
$usrpassword=mysql_real_escape_string($_POST['passwd']); 
$db=mysql_select_db('mydb',$connection);
$result=mysql_query("select usrfname,usrlname from userinformation where usremail='$usrname' and usrpassword='$usrpassword'") or die('failed to login');`

您还应该查看准备好的陈述。

答案 3 :(得分:1)

对要在查询中使用的用户生成的字符串使用mysql_real_escape_string()

$usrname     = mysql_real_escape_string($_POST['usrname']);
$usrpassword = mysql_real_escape_string($_POST['passwd']); 

$db=mysql_select_db('mydb',$connection);
$result = mysql_query("SELECT usrfname, usrlname FROM userinformation WHERE usremail='$usrname' AND usrpassword='$usrpassword'") or die('failed to login');

// Set session data only if login is successful 
$_SESSION['usremail']=$usrname;

答案 4 :(得分:0)

是的,您永远不应该接受用户输入(来自表单(POST数据),作为网址的一部分(GET数据),甚至不首先检查它是您期望的cookie。例如,您的用户名可能包含可能带有一个点的a到z。因此,在将输入文本放在数据库附近之前,你会检查它是否包含它.Google preg_match。

你需要在服务器端这样做,只是在浏览器上使用javascript是不够的。

我还会将密码存储为用户在注册时输入的md5哈希值,因此您在注册时获得$ password,检查它是否包含有限的字符范围,请执行$ hass_pw = md5($ password)并将$ hash_pw存储在d / b中。然后,当用户登录时,您再次对其进行哈希并在查询中使用它。 (为了清楚起见,我省略了$ _POST)。

例如:

if preg_match(/"[^a-z]/i", $_POST['usrname'])
    print "bad username format)
else    
    {
    // good format username, safe to use in query
    }