-2

我有一个网站,我在服务器端使用 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');

任何帮助是极大的赞赏。

谢谢

4

5 回答 5

6

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

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

此外,您的密码以明文形式存储。您应该使用盐渍散列函数作为绝对最小值。

你还应该看看这些很棒的问题:

于 2012-04-28T17:33:44.490 回答
4

当然是脆弱的。你永远不会清理你的输入。尽管不推荐使用 mysql_* 函数,但您仍然会发现该mysql_real_escape_string函数的用途。只需将其应用于您的变量。

$usrname = mysql_real_escape_string($_POST['usrname']);
$usrpassword = mysql_real_escape_string($_POST['passwd']);
于 2012-04-28T17:33:09.737 回答
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');`

您还应该查看Prepared Statements。

于 2012-04-28T17:33:46.410 回答
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;
于 2012-04-28T17:38:47.073 回答
0

是的,您永远不应该接受用户输入(来自表单(POST 数据),作为 url(GET 数据)的一部分,甚至是 cookie,而不首先检查它是您所期望的。例如,您的用户名可能包含一个 to 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
    }
于 2012-04-28T17:41:58.603 回答