我正在开发一个网站,我正在尝试保护连接部分。
我使用addslashes
上的$login
函数来停止SQL注入,但有些朋友告诉我安全性不够。但是,他们没有告诉我如何利用此漏洞。
我怎么能/你能破坏这段代码? 我该如何保护它?
<?php
if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) )
{
extract($_POST);
$sql = "SELECT pseudo, sex, city, pwd FROM auth WHERE pseudo = '".addslashes($login)."'";
$req = mysql_query($sql) or die('Erreur SQL');
if (mysql_num_rows($req) > 0)
{
$data = mysql_fetch_assoc($req);
if ($password == $data['pwd'])
{
$loginOK = true;
}
}
}
?>
答案 0 :(得分:14)
您应该使用mysql_real_escape_string来转义查询中的字符串输入参数。使用类型转换来清理数字参数和白名单以清理标识符。
在引用的PHP页面中,有一个以登录表单注入SQL的示例。
答案 1 :(得分:5)
您以明文存储密码!如果我看到一个,这是一个重大的安全问题。该怎么办:至少使用密码的(每用户)盐渍哈希,如图所示。 here
答案 2 :(得分:2)
使用:
mysql_real_escape_string($inputToClean);
答案 3 :(得分:2)
还有另一个巨大的安全漏洞 - extract
。它可以避免输入几个字符,但会打开太多无法提及的漏洞,因为它会覆盖任何全局变量。
如果发布此内容会怎样?
$_POST {
'login' => 'Admin',
'loginOK' => 1
}
猜猜看,$ loginOK现在== 1,我将以管理员身份登录。
稍后为自己省去很多悲伤,只使用你想要使用的变量,而不是依赖extract
的可怕黑客。
答案 4 :(得分:2)
除了使用addslashes()
之外,这些是本代码中的一些随机问题:
isset($_POST)
始终为TRUE
,除非您从命令行运行它。您可以删除它。empty()
非常棘手。例如,如果$password = '0'
则empty($password)
为 TRUE 。if( isset($_POST['login']) && $_POST['login']!='' ){}
extract($_POST)
是一个巨大的漏洞:任何人都可以从外部设置代码中的变量。$password == $data['pwd']
表示您将纯文本密码存储在数据库中。那是一种可怕的做法。谷歌的“盐渍密码”。$loginOK = $password == $data['pwd'];
。你明白为什么吗? ; - )答案 5 :(得分:1)
而不是addslashes
您应该使用mysql_real_escape_string
。