2011-04-29 72 views
3

可能重复:
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注入?还是完全过度?一切工作正常,没有什么是坏的 - 我的问题确实是,我是否在配对时使用过时的东西?是否只有一个功能可以用来完成这项工作?

谢谢。

+2

切勿将密码进入你的数据库以纯文本...哈希它和盐它...然后你并不需要所有那些花哨的htmlspecialchars和striptags它要么 – 2011-04-29 10:20:41

+0

'mysql_real_escape_string() '这里唯一必要的电话是 – 2011-04-29 10:23:08

回答

2

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

它会被剥离,任何人都可以登录为我。

我认为你应该保存用户名和密码原样,并且只有在显示它们时才执行htmlspecialchars

strip_tags似乎是不必要的,在这里所有的,除非你真的不喜欢的用户名像BlaBla aka Yada-Yada <C00lHax0r>

+0

我不讨厌那些:我只是用strip_tags从用户名中删除html。特殊专家应该修复这个问题吗? – Kyle 2011-04-29 10:32:13

+0

@凯尔:当然。 – Quassnoi 2011-04-29 10:36:00

2

mysql_real_escape_string应该是足够了...你应该检查其他的东西当用户注册自己

1

你没从MySQL注入保护,但你存储的字符串是遥远从原来的格式。 当您拉动字符串OUT并回应时,应使用strip_tags,htmlspecialchars和trim等函数。

原因在于,有时您可能希望将字符串设置为其原始格式,例如,您可以剥去一些标签,而不是所有标签 - 或者您可能希望仅使用htmlspecialchars而不剥离任何标签。关键在于能够轻松地将字符串转换为显示时所需的字符串。 这意味着,您需要保持原始格式的字符串。为了做到这一点 - 你不要strip_tags或htmlspecialchars它。

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

+0

什么是PDO?我从来没有听说过这个。我知道有mysqli,但我还没有真正玩过它。 – Kyle 2011-04-29 10:22:29

+2

PDO或Php数据对象 - www.php.net/PDO - 这是一个轻量级的对象接口,用于与各种数据库系统进行通信。它提供了各种功能,最好的一点是它与PHP捆绑在一起,并且可以像PHP中其他任何类一样扩展它。 – 2011-04-29 10:26:13

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(),所以它可能有点不方便(但很容易解决)。

1

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

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

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

盐必须**不**为固定值。它必须随着每一篇文章而改变。时间戳会产生极好的盐。例如'$ password = md5(date(“m-d”))trim($ _ POST ['password']));'(无论如何,无需转义密码,因为密码无法识别。请记住将该日期存储在密码表中,以便在重新转换输入的密码时可以调用它。 – Johan 2011-04-29 11:13:31

+0

@Johan,我想你完全没有意识到这一点。如果应用程序无法以某种方式知道盐,那么下次他/她登录时如何验证用户?根据您的建议,时间戳也需要存储,而将用户存储在数据库中,否则您将无法验证用户身份。 – Starx 2011-04-29 11:18:27

+0

对不起,但你是谁完全不知道。 @Johan也说过,盐应该和密码一起保存在明文中,你注意到了。通常在数据库的密码字段中存储的是'$ random_salt。哈希($ random_salt。$ user_password)',用已知长度的盐或盐和密码之间的分隔符。 – 2011-04-29 13:20:40

相关问题