我有一个网站,我在服务器端使用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');
非常感谢任何帮助。
由于
答案 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
}