在PHP中发布MySQL加密


Posting MySQL encrypt in PHP

嗨,我正试图将页面中的值发布到MySQL数据库中,但密码字段必须通过encrypt命令加密。

到目前为止,我有这个-

$sql="INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) 
VALUES
('$_POST[userid]', encrypt(".$_POST['passwd']."),'$_POST[uid]','$_POST[gid]','$_POST[homedir]','$_POST[shell]','$_POST[count]','$_POST[accessed]','$_POST[modified]')";

脚本连接到DB fine,但输出为"错误:字段列表中的未知列'test34'"

谢谢。

此语句:

encrypt(".$_POST['passwd'].")

该值周围没有任何引号,因此mysql将其作为列名。例如,如果您的密码是test123,那么查询的这一部分看起来像:

encrypt(test123)

而你真正需要的是

encrypt('test123')

所以,你可以通过添加单引号来解决这个问题

$sql="INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) 
VALUES
('$_POST[userid]', encrypt('".$_POST['passwd']."'),'$_POST[uid]','$_POST[gid]','$_POST[homedir]','$_POST[shell]','$_POST[count]','$_POST[accessed]','$_POST[modified]')"

然而,在这段代码中还有更大的问题。您无法转义这些值,因此请打开SQL注入。想想如果你的密码包含一个引号会发生什么,比如test'123:

encode('test'123')

这显然是一个语法错误。事实上,它允许任何人通过在$_POST中创建特殊参数来执行任意SQL表达式。

所以,您真正应该做的是要么转义您放入查询的所有内容,要么使用带有占位符的PDO。例如,查看本教程http://www.phpeveryday.com/articles/PDO-Positional-and-Named-Placeholders-P551.html