我正在编辑其他人的PHP,他们有一个'身份验证'系统,他们直接在条件代码中使用帖子数据,如下所示:
if($database_password == $_POST['password']){
//access granted
}else{
//access denied
}
这看起来不正确,首先,密码以明文形式存储,但我想知道$ _POST ['password']部分是否安全。我不知道是否有可能,但是不能有人简单地写''OR 1 == 1或者某些东西来获取访问该网站的东西?我问,因为我必须花费大量时间才能说服他们我需要引入密码规则并强制内网上的每个用户更改密码以遵循新规则,尤其是当我的任务不是应该涉及编辑这部分代码或数据库。
谢谢!
答案 0 :(得分:2)
由于我们无法看到您的其余代码,我所能做的就是猜测。如果要将任何类型的用户生成内容放入查询(在本例中为$_POST['password']
或用户名),请始终使用mysql_real_escape_string()
。这将逃避报价,因此您的输入是安全的。
如果您要比较if()
语句中的变量,则无需转义输入。
您应始终加密密码。 始终。除了在某些地方违法,这是非常不安全的。如果你不想做很多PHP,你甚至可以在MySQL查询中使用SHA1。
答案 1 :(得分:1)
不,这是不可能的。变量是一个原子单元,与例如在SQL中不同,它不会被计算为String然后执行。
您的示例将简单地评估为以下(在大多数情况下)为false
:
if ($database_password == " OR 1==1")
答案 2 :(得分:1)
极端不安全......
错误的人可以通过以下方式进行身份验证:布尔值为TRUE或整数为0 资料来源:http://php.net/manual/en/types.comparisons.php
答案 3 :(得分:0)
不,通过字符串比较,没有注射的危险。但“安全”系统显然是要改写的。
答案 4 :(得分:0)
ok ,因为它是字符串比较。但一般情况下,它只是可怕。
<?php
if($database_password == true){
echo "ACCESS";
}else{
//access denied
}
返回 true 。
使用===
运算符来改进该代码。
if("rd" === true){
echo 3;
}else{
//access denied
}
这是错误的。
答案 5 :(得分:0)
它是安全的,密码只传递给条件if-else,不包括在Query中。 如果你这样做会有危险
mysql_query("SELECT user_id FROM table WHERE password='".$_POST['password']."'");
答案 6 :(得分:0)
就像人们所说的那样,这里没有SQL注入的余地,因为这段代码中没有SQL。对于密码,我之前做过的一种方法是在存储到DB之前使用md5()
函数转换为md5哈希值,然后在登录期间将密码转换为md5并比较两个哈希值。可能不是最好的方式,但肯定比这个更安全。