有很多方法可以保护我知道的网站,但如果你能评价我的方法在预防 SQL 注入和数据库注入方面的效果如何,我会很高兴,最重要的是,给我关于保护我的网站的其他方法的建议和数据库。
我在我的网站上有什么:(i)JavaScript + PHP 表单验证(双重验证)(ii)sha512 密码散列(iii)mysql_real_escape_string 所有进入 MySQL 查询的 POST 变量
我目前的预防绕过/破解方法有多容易/难?如何改进我当前的方法或添加新方法?
不。
名单还在继续。
(i) JavaScript + PHP 表单验证(双重验证)
Javascript 验证并不安全,因为任何人都可以使用curl或等效工具来设计自己的 HTTP 请求,从而绕过您的 Javascript 验证。
PHP 表单验证很好用,但不适用于许多无法按可预测模式进行过滤的情况。基本上,大多数字符串输入。
(ii) sha512 密码散列
SHA512 比其他 SHA 散列函数具有更多位,但更多位无助于抵御字典攻击或彩虹表或暴力攻击。
您没有提到建议使用盐渍或迭代。加盐是为了防止有人提前搭建彩虹表。迭代是为了减慢密码验证的速度,这样攻击者就无法每秒进行数百万次尝试。查看自动密钥拉伸的密码哈希函数,例如Bcrypt或PBKDF2。
(iii) mysql_real_escape_string
正如其他人评论的那样,ext/mysql API 在 PHP 中已被弃用,并且很快将被删除。建议现在就开始使用 mysqli 或 PDO 编写代码,这样您就不必在移除 ext/mysql 时重新编写所有应用程序(或卡住无法升级到 PHP 的下一个版本)。
我发现如果一个人使用带有参数的准备好的查询而不是转义,那么保持良好的习惯会更容易。如果您始终如一地执行这两种方法,那么这两种方法都很有效,但是许多开发人员希望快速编写代码,并且担心调用正确的转义函数,然后在将变量连接到查询字符串时打开和关闭正确的引号会减慢我们的速度。一旦习惯了,使用 SQL 参数进行编码会非常快速且不易出错。
还有其他一些动态 SQL 的情况,转义和查询参数都没有帮助。这些解决方案只是动态地在 SQL 中包含文字值。但是如果我想动态地选择一个列、一个表达式或整个 SQL 子句怎么办?
SELECT * FROM MyTable ORDER BY $column_to_sort_by $asc_or_desc
为此,您应该准备好使用白名单来允许外部输入选择动态部分,而不必将外部输入直接连接到 SQL 中。有关更多示例,请参阅我的演示文稿SQL 注入神话和谬误。
最后,您所有的方法都集中在保护 SQL 语句上。那么其他代码注入向量eval()
呢?还是其他更微妙的情况(参见StackOverflow 上的线程Exploitable PHP functions? )?
输出未编码的 HTML(也称为跨站点脚本或 XSS)的安全漏洞怎么样?您可以在OWASP Top 10 Project或CWE/SANS Top 25 Most Dangerous Software Errors中找到有关常见漏洞的更多信息。