这有点落伍,还是我做对了?

时间:2011-04-29 10:14:34

标签: php mysql

  

可能重复:
  Best way to prevent SQL injection?

登录:

$username = mysql_real_escape_string(htmlspecialchars(strip_tags(trim($_POST['username'])), ENT_QUOTES));
$password = mysql_real_escape_string(htmlspecialchars(strip_tags(trim($_POST['password'])), ENT_QUOTES));

为了插入数据,我重复使用相同的mysql_real_escape_string(htmlspecialchars(strip_tags(trim(...

我觉得这是不好的做法,因为我使用了很多功能......这是防止mysql注入的正确方法吗?防止xss注入?还是完全落水?一切正常,没有什么破坏 - 我的问题是,我是否在使用配对时过时的东西?是否只有一个我应该用于工作的功能?

感谢。

5 个答案:

答案 0 :(得分:2)

mysql_real_escape_string应该足够了......你应该检查用户注册的其他地方

答案 1 :(得分:2)

如果我使用<mysecretpassword>作为密码该怎么办?

它将被删除,任何人都可以像我一样登录。

我认为您应该按原样存储用户名和密码,并且仅在显示时才htmlspecialchars

除非你真的不喜欢像strip_tags

这样的用户名,否则

BlaBla aka Yada-Yada <C00lHax0r>似乎根本不需要

答案 2 :(得分:1)

您确实可以防止MySQL注入,但您存储的字符串与其原始格式不同。 当你拉出字符串OUT并回显它时,应该使用strip_tags,htmlspecialchars和trim等函数。

原因是,有时您可能希望将字符串保留为其原始格式,以便您可以,例如,只删除一些标记,而不是所有标记 - 或者您可能只想使用htmlspecialchars而不剥离任何标记。关键是能够在显示字符串时轻松转换字符串。 这意味着,您需要将字符串保持为原始格式。为了做到这一点 - 你没有strip_tags或htmlspecialchars-it。

另一件事是,每个人和他们的祖父母都在使用PDO,你可能想开始玩它,因为它确实让你免受SQL注入。

答案 3 :(得分:1)

strip_tags没有必要。

为了编码舒适性,您可能需要为此创建一个函数:

function escape_everything($something)
{
    return mysql_real_escape_string(htmlspecialchars(strip_gpc(trim($something)), ENT_QUOTES));
}

function strip_gpc($something)
{
    return get_magic_quotes_gpc() ? stripslashes($something) : $something;
}

但这种方法存在一些问题。它只适用于您发送到数据库的数据,更重要的是,您正在保存数据html编码。如果您将来想要从数据库中保存的数据生成PDF,则首先需要htmlspecialchars_decode(),因此可能有点不方便(但很容易解决)。

答案 4 :(得分:1)

以下是大多数答案的建议。

$username = mysql_real_escape_string(trim($_POST['username']));

$password = md5("mysalt".mysql_real_escape_string(trim($_POST['password'])));