2012-02-19 62 views
-3

我是PHP新手,不确定我的代码是否会阻止它受到任何SQL攻击。而且,我对我为什么不能登录感到困惑。它不会给我任何错误。此代码是否可以防止SQL注入攻击并为何不起作用?

<?php 
$host="localhost"; // Host name 
$username="*****"; // Mysql username 
$password="****"; // Mysql password 
$db_name="***"; // Database name 
$tbl_name="electoral"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// username and password sent from form 
$username=$_POST['username']; 
$password=$_POST['password']; 

// To protect MySQL injection (more detail about MySQL injection) 
$username = stripslashes($username); 
$password = stripslashes($password); 
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 

$sql="SELECT * FROM $tbl_name WHERE username='$username' and password= md5('$password')"; 
$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
// If result matched $myusername and $mypassword, table row must be 1 row 

if($count==1){ 
// Register $myusername, $mypassword and redirect to file "_____" 

session_register("username"); 
session_register("password"); 
header("location:electoralcommission.php"); 
} 

?> 

有什么想法吗?谢谢

+0

你是写这个还是你从某处复制过? – 2012-02-19 23:46:03

+0

复制零碎 – 2012-02-19 23:46:36

+3

你的代码在'<?php'之前是否真的有空格?如果是这样,会话呼叫将失败。 – 2012-02-19 23:48:00

回答

1

stripslahes()是不必要的,真的不是一个好主意使用。 mysql_real_escape_string()是首选的,如果你要逃避字符串,以防止注射。

就我个人而言,我建议您改用参数化查询的PDO。参数化查询远远比要记住是否正确转义字符串要干净得多,再加上它至少与一些数据库&驱动程序组合(特别是不确定PHP)有关,它将允许SQL服务器缓存部分查询,为了更好的性能(加上,我怀疑mysql _...是否接近于快速!)。有关更多信息(或许多其他问题),请参阅this stack overflow page

+0

我并不完全确定,但某些版本的MySQL无法缓存准备好的语句。 – arthurprs 2012-02-20 00:15:05

+0

无论如何PDO模拟默认准备。叹。 – Charles 2012-02-20 15:29:34