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