启动一个带有注入保护的网站


Launching a website with injeciton protection

我是一名新的php"开发人员",也是soff网站的新成员。我第一次启动一个网站,在我的在线研究中,我被告知,虽然PHP表面上可能很容易,但开发人员忽略的最重要的事情是注入。

作为sofsofs声明,你应该研究之前,你问这里的问题,我做了,似乎mysql_real_escape_string();用于转义可能损害数据库的字符。然后我还发现你有准备好的报表。然而,在SOF和Google上进行搜索时,我发现使用哪一个并不重要,因为无论哪种方式,用户输入的数据都被用于查询/插入数据库。

所以我现在真的很困惑,因为我发现更多的人支持escape_string语句和一些准备好的语句。

这就是我正在做的:

 For Post variables: 
 $thething = mysql_real_escape_string($_POST['field']);

 For Get variables: 
 $thething = mysql_real_escape_string($_GET['id']);

 For Request variables: 
 $thething = mysql_real_escape_string($_REQUEST['id']);

请让我知道你们的想法。

我发现记住始终使用预处理语句比确保所有参数都得到正确转义更容易。所以我建议使用预处理语句。

相关问题:

mysqli prepared statements and mysqli_real_escape_string

real_escape_string vs. prepared statements

当您使用占位符

时,PreparedStatements将为您转义输入
SELECT * FROM myTable WHERE `id` = ?

然而,它不被过程化的mysql-extension所支持,这是什么原因呢?为什么许多现有的站点仍然使用mysql_(real_)escape_string(),但是你可以将它与Mysqli或PDO一起使用。当您刚刚开始开发时,我建议使用准备好的语句。

我倾向于使用mysql_real_escape_string来逃避可能的恶意用户输入。

Prepared语句也可以实现相同的功能,因此如果您发现可能忘记手动转义用户输入,可以使用Prepared语句,但是转义输入一段时间后,它就变成了第二天性。

如果您正在使用PHP框架,如CakePHP或CodeIgniter,它们通常提供相同的函数。例如,CodeIgniter的活动记录会为您处理所有的输入。

额外的安全信息:

由于你是web开发的新手(和我一样),也要注意XSS注入,这是另一个漏洞点。

最后,防御性编码。这在Web开发中更为重要,因为您的网站是向公众开放的。在通过Javascript验证表单数据的情况下,也可以在PHP脚本中执行验证。这似乎是多余的,但有可能绕过JS(一种方法是简单地在浏览器中禁用JS)。

哈希时使用Salt密码,避免md5哈希。选择sha256, sha512或bcrypt。

对于安全性而言,如果您将受到威胁,则不是的问题,而是您将受到威胁的时间。安全必须是一个持续的、永无止境的过程。

我们认为你们关于保护的想法是完全错误的。

  1. 没有字符会损害数据库。但是有些字符可能会破坏查询。你不应该允许这样。

  2. 因此mysql_real_escape_string ();

  3. 因此mysql_real_escape_string ();只需要转义字符串。它对查询的其他部分没有任何帮助。

  4. 此外,字符串不仅可以来自POST GET和REQUEST,还可以来自世界上任何来源。您必须转义一个进入查询的字符串,而不是来自某个源。目的地是原因,而不是来源。

  5. 请参考评论中的问题以获得进一步的解释

我认为这是相当脆弱的 sql注入:

$要= mysql_real_escape_string ($ _GET [' id ']);Mysql_query ("select * from user where id=".$thething ");

概念证明:http://localhost/index.php?id=sleep (30)

这个页面需要30秒才能加载,因为它容易受到sql注入的攻击。

一个更安全的方法来保护自己免受sql注入是参数化的查询库,如PDO或mysqli。你应该测试一切。我建议使用Sitewatch这样的服务或者像skipfish这样的开源项目。