2013-11-22 335 views
2

我正在使用以下代码行以保护通过PHP脚本进行登录或类似登录。请让我知道是否足以抵御攻击,或者我需要添加更多的行以使代码更安全。安全PHP登录脚本

// To protect MySQL injection (more detail about MySQL injection) 
$username = stripslashes($username); 
$password = stripslashes($password); 
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 
+3

根本不使用'mysql_ *'是一个开始。 –

+1

PDO:http://php.net/manual/en/book.pdo.php。教程:http://net.tutsplus.com/tutorials/php/php-database-access-are-you-doing-it-correctly/ – ashley

+0

像@BenFortune说,没有'mysql_ *'功能。另外,你是否保存简单的密码? –

回答

1

从理论上讲,应该是足够安全的,但是仍然有一些问题吧。

  1. mysql_real_escape_string已被弃用 - 你不应该使用它们,而是事先准备好的声明。

  2. 您不是散列密码 - 存储纯文本密码并不是一个好主意,就好像数据库被泄露一样,它们都会立即知道。 PHP有一个专用的password_hash函数,您可以使用它。

  3. 你为什么要剥斜线?如果您希望输入的用户名可能包含斜线,那么您在其他地方缺少验证步骤。一般来说,最好使用白名单而不是黑名单 - 即不是试图去除不好的字符,而是要有一个好字符的列表并且只允许这些字符。这样,你可以用一些简单的保护您的用户名/密码,像preg_replace('#[^a-bA-B0-9]#', '', $username)

3

使用任何mysql_*功能不完全是安全的。现在这个功能家族已经被弃用了。

你应该看看使用MySQLiPDO与绝对的安全准备好的发言...

+0

感谢您的快速响应我使用MySQLi,并在将变量发送到我的php SQL查询之前,我使用上面提到的代码行。那么在这种情况下就足够了吗? – user2304394

+1

这里的最佳实践是使用准备好的语句,正如我上面所说的,并且完全避免过时的函数。 – BenM

0

如果你知道你在做什么,mysql_ *功能仍然很好用,虽然他们已被弃用。只要确保你不会陷入注入漏洞。 mysql_ *函数被删除,因为这样的漏洞太容易了。其他函数库(如mysqli_ *和PDO_ *)允许参数化查询,这使得编写安全代码变得更加容易。

注意当然,您绝对不能保证不推荐使用的函数在新版本的PHP中仍然存在。

你说的那些行太多了。只需要mysql_real_escape_string()。您可以删除strip_slashes()

+0

**不建议在新代码中使用弃用的函数**即使有人知道他们在做什么 - 这就是弃用的定义。 – BenM

+0

为什么你说不使用'mysql_ *'函数并且说'mysql_real_escape_string'确定? –

+0

咦?我没有这么说? – BenM