无法使用 mysql_real_escape_string 登录我的站点
Can not login in my site with mysql_real_escape_string
我需要一些帮助。我用 "login" 系统编写了某种站点并试图防止 SQL 注入。没有那个转义字符串,一切都完美无缺。当我添加 mysql_real_escape_string() 时,我无法再登录我的网站,这很烦人。
我不知道哪里出了问题,曾尝试 google 解决问题但没有找到任何问题。所以我有一个表单,它通过 $_POST['user'] 和 $_POST['pass'] 将有关用户的信息发送到 check.php。在 check.php 我有代码来检查用户和传递是否与用户相等并传入 MySQL 数据库。
<?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');
};
};
用户名和密码只包含字母和数字,我知道我输入的用户名和密码是正确的。
如果用户名和密码只包含字母数字字符,请尝试使用
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- 的评论为您提供了调试代码的好方法。
您只需对将要包含在 SQL 文本中的值使用 mysql_real_escape_string
。
例如
$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
的 return 值,那么您要比较的值应该 也 是等效的 "escaped" 值。
例如,考虑:
$bar = mysql_real_escape_string($foo);
if ( $bar == $foo ) {
根据$foo
的值,$bar
中存储的字符串可能不相等。
从 mysql_real_escape_string
编辑的值 return 是 "escaped",因此它可以包含在 SQL 文本中。
补充说明:
以纯文本形式存储密码是一个非常糟糕的主意。
不检查来自 mysql_query
的错误 return 是个坏主意。
当有两个合适的替代品(mysqli
和 PDO
)可用时,使用已弃用的 mysql
界面不是一个好主意。特别是当两个替换都支持 prepared statements with bind placeholders.
在 SELECT 列表中使用 *
,然后按结果集中列的位置引用 return 列也是一个坏主意。最好列出您想要 return.
的特定列
我需要一些帮助。我用 "login" 系统编写了某种站点并试图防止 SQL 注入。没有那个转义字符串,一切都完美无缺。当我添加 mysql_real_escape_string() 时,我无法再登录我的网站,这很烦人。
我不知道哪里出了问题,曾尝试 google 解决问题但没有找到任何问题。所以我有一个表单,它通过 $_POST['user'] 和 $_POST['pass'] 将有关用户的信息发送到 check.php。在 check.php 我有代码来检查用户和传递是否与用户相等并传入 MySQL 数据库。
<?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');
};
};
用户名和密码只包含字母和数字,我知道我输入的用户名和密码是正确的。
如果用户名和密码只包含字母数字字符,请尝试使用 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- 的评论为您提供了调试代码的好方法。
您只需对将要包含在 SQL 文本中的值使用 mysql_real_escape_string
。
例如
$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
的 return 值,那么您要比较的值应该 也 是等效的 "escaped" 值。
例如,考虑:
$bar = mysql_real_escape_string($foo);
if ( $bar == $foo ) {
根据$foo
的值,$bar
中存储的字符串可能不相等。
从 mysql_real_escape_string
编辑的值 return 是 "escaped",因此它可以包含在 SQL 文本中。
补充说明:
以纯文本形式存储密码是一个非常糟糕的主意。
不检查来自 mysql_query
的错误 return 是个坏主意。
当有两个合适的替代品(mysqli
和 PDO
)可用时,使用已弃用的 mysql
界面不是一个好主意。特别是当两个替换都支持 prepared statements with bind placeholders.
在 SELECT 列表中使用 *
,然后按结果集中列的位置引用 return 列也是一个坏主意。最好列出您想要 return.