我在这里需要一些帮助。 我已经使用"登录"系统编写了某种站点,并试图防止SQL注入。一切都很完美,没有那个转义绳的东西。当我添加mysql_real_escape_string()时,我无法再登录我的网站,这很烦人。
我不知道应该出什么问题,试图用谷歌搜索问题,但没有找到任何东西。所以我有一个表格,它通过 $_POST['user'] 和 $_POST['pass'] 发送有关用户的信息.php。在检查中.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(字符串$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
的返回值,那么您正在比较的内容也应该是一个等效的"转义"值。
例如,请考虑:
$bar = mysql_real_escape_string($foo);
if ( $bar == $foo ) {
根据$foo
的值,存储在$bar
中的字符串可能不相等。
从mysql_real_escape_string
返回的值是"转义的",因此可以包含在 SQL 文本中。
附加说明:
以纯文本形式存储密码是一个非常糟糕的主意。
不检查从mysql_query
返回的错误是一个坏主意。
当有两个合适的替代品(mysqli
和PDO
)可用时,使用已弃用的mysql
接口是一个坏主意。特别是当两个替换都支持带有绑定占位符的预准备语句时。
在 SELECT 列表中使用 *
,然后按列在结果集中的位置引用返回的列也是一个坏主意。最佳做法是列出要返回的特定列。