我需要一些帮助。我用“登录”系统编写了某种类型的网站,并试图阻止SQL注入。一切都很完美,没有逃脱字符串的东西。当我添加mysql_real_escape_string()时,我无法再登录我的网站了,这很烦人。
我不知道应该是什么错误,试图谷歌问题,但没有找到任何东西。所以我有一个表单,通过$ _POST ['user']和$ _POST ['pass']将有关用户的信息发送到check.php。在check.php中,我有代码来检查用户是否与用户等同并传入MySQL DB。
<?php
include ('mysql.php'); // includes mysql connection
if(isset($_POST['user']) && isset($_POST['pass'])) {
$user = mysql_real_escape_string($_POST['user']);
$pass = mysql_real_escape_string($_POST['pass']);
$row = mysql_fetch_row(mysql_query("SELECT * FROM users WHERE username = '$user'"));
if(($user == $row[1]) and ($pass == $row[2])) {
setcookie("user",$user,time() + 3600,"/");
header('location: secret.php');
} else {
header('location: index.php');
};
};
用户名和密码只包含字母和数字,我知道我正在输入用户名和密码。
答案 0 :(得分:2)
如果用户名和密码仅包含字母数字字符,请尝试使用 ctype_alnum ( string $text )所以你只需验证$ user和$ pass是否只是字母数字字符。如果它们(如果它返回真实),那么你就不需要对它们进行消毒。
顺便说一下,你现在应该使用 mysqli_real_escape_string而不是mysql_real_escape_string! 不推荐使用mysql_ *函数。
我希望它会有所帮助
看看这个已经解决的类似问题: http://forums.phpfreaks.com/topic/68338-solved-cant-login-using-mysql-real-escape-string/
编辑:另外,Fred -ii-的评论为您提供了调试代码的好方法。
答案 1 :(得分:1)
您只需要使用mysql_real_escape_string
on将包含在SQL文本中的值。
e.g。
$user = $_POST['user'];
$pass = $_POST['pass'];
$sql = "SELECT * FROM users WHERE username = '" . mysql_real_escape_string($user) . "'";
... mysql_query($sql) ...
稍后在您的代码中,您将$user
的内容与其他内容进行比较。如果$user
包含来自mysql_real_escape_string
的返回值,那么您要比较的内容也是等效的“转义”值。
举个例子,考虑一下:
$bar = mysql_real_escape_string($foo);
if ( $bar == $foo ) {
根据$foo
的值,$bar
中存储的字符串可能不相等。
mysql_real_escape_string
返回的值被“转义”,因此可以包含在SQL文本中。
附加说明:
以纯文本格式存储密码是一个非常糟糕的主意。
不检查mysql_query
返回的错误是个坏主意。
当两个合适的替换(mysql
和mysqli
)可用时,使用已弃用的PDO
接口是一个坏主意。特别是当两个替换都支持准备好的语句与绑定占位符时。
在SELECT列表中使用*
,然后引用结果集中列的位置返回的列也是一个坏主意。列出要返回的特定列是最佳做法。