Mar*_*ato 2 php postgresql optimization
考虑到一个项目将工作多个开发人员并且将不断更新和维护,考虑到可读性和安全性,下面两个代码中的哪些代码可以被认为是PHP中的最佳实践?如果我们谈论性能,第二种选择可能会好一点,但有办法解决这一点.
选项1
$user = $_POST['user'];
$pass = $_POST['pass'];
// Prevent SQL Injection and XSS
$user = anti_injection($user);
$pass = anti_injection($pass);
if(strlen($user) <= 8 && strlen($pass) <= 12)
{
// SQL query
$sql = "SELECT id
FROM users
WHERE username = '$user' AND password = '$pass';";
}
Run Code Online (Sandbox Code Playgroud)
选项2
// Retrieve POST variables and prevent SQL Injection and XSS
$_POST['user'] = anti_injection($_POST['user']);
$_POST['pass'] = anti_injection($_POST['pass']);
if(strlen($_POST['user']) <= 8 && strlen($_POST['pass']) <= 12)
{
// SQL query
$sql = "SELECT id
FROM users
WHERE username = '" . $_POST['user']. "' AND password = '" . $_POST['pass'] . "';";
}
Run Code Online (Sandbox Code Playgroud)
编辑1
我没有使用MySQL,我的数据库是PostgreSQL
我只能假设anti_injection某种自定义过滤功能,这是一个坏主意™.如果你真的想采用这些想法,你应该使用mysql_real_escape_string.
编写SQL查询时保持安全的唯一方法是使用参数,例如通过MySQLi.mysql_*无论如何,这些功能都会被弃用,所以你最好尽快走开.
事实上,mysql_real_escape_string这并不是针对注射攻击的万无一失的防御措施.考虑查询中的整数比较,例如WHERE $var > 30.我可以注入1=1 or 100到$var成功,并彻底打破逻辑.
参数将数据与查询语言完全分开,完全降低了注入风险.服务器接收包含参数表示法的查询和要插入的一组值,因此它可以完全不同地处理查询语言和数据.
此外,您似乎以明文形式存储密码.这是 个坏 主意.您应该研究一种强密码存储哈希算法,例如bcrypt,这使得从哈希中获取明文密码变得非常困难.
MD5和SHA1不是密码存储的理想选择,因为它们设计得很快,这意味着攻击者可以快速破解强大的密码.现代GPU每秒可实现50亿MD5哈希值.事实上,有些人使用专用的哈希破解装置,其中一些可以破解MD5,每秒450亿次哈希.
您还应该看看这些令人敬畏的问题,这些问题完全涵盖SQL注入攻击,密码存储以及许多其他安全问题:
更新:你提到你正在使用postgres.您可以使用PDO从PHP运行参数化查询,如此处简要描述.
| 归档时间: |
|
| 查看次数: |
2834 次 |
| 最近记录: |