启动注入保护的网站

时间:2011-10-28 10:24:10

标签: php security prepared-statement mysql-real-escape-string

我是一名新的php“开发者”,也是SOF网站的新成员。我是第一次推出一个网站,在我的在线研究中,我被告知虽然PHP表面上可能很容易,但开发人员忽视的最重要的事情是注射。

正如SOF声明你在这里问一个问题之前你应该研究一下,我做了,似乎是mysql_real_escape_string();需要转义可能损害数据库的字符。我还发现你准备好了陈述。但是,在SOF和Google上进行搜索时,我发现使用两者中的哪一个更为重要,因为用户输入的数据用于查询/插入数据库。

所以我现在感到非常困惑,因为我发现更多的人支持escape_string语句,还有一些人支持Prepared语句。

这就是我在做的事情:

 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']);

请让我知道你们的想法。

5 个答案:

答案 0 :(得分:1)

我发现总是使用预准备语句更容易记住,而不是确保所有参数都被正确转义。所以我建议准备好的陈述。

相关问题:

mysqli prepared statements and mysqli_real_escape_string

real_escape_string vs. prepared statements

答案 1 :(得分:0)

当您使用占位符

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

但是,它不受程序化mysql扩展支持,原因是什么,为什么许多现有站点保留mysql_(real_)escape_string(),但你可以将它与Mysqli或PDO一起使用。当你刚刚开始开发时,我建议使用预准备语句。

答案 2 :(得分:0)

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

预备语句也可以实现相同的目的,因此如果您发现可能忘记手动转义用户输入,则可以使用预处理语句,但在转换输入一段时间后,它将成为第二天性。

如果您使用的是PHP框架,例如CakePHP或CodeIgniter,它们通常会提供相同的功能。例如,CodeIgniter的Active Records会为您处理所有输入清理。

额外的安全信息:

由于您是网络开发的新手(就像我一样),也要留意另一个漏洞点XSS Injections

最后,防守代码。对于Web开发而言,这一点非常重要,因为您的网站可供公众访问。如果您通过Javascript验证表单数据,也可以在PHP脚本中执行验证。它可能看起来多余,但可以绕过JS(一种方法是在浏览器中简单地禁用JS)。

在散列时

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

有了安全性,这不是如果你会受到损害的问题,而是 时你会受到损害。安全必须是一个持续不断的过程。

答案 3 :(得分:0)

我们认为您的保护理念是完全错误的。

  1. 任何字符都不会损害数据库。但有些字符可能会破坏查询。你不应该这样做。

  2. 因此mysql_real_escape_string();转义可能会破坏字符串的字符。

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

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

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

答案 4 :(得分:0)

我认为这对于SQL注入非常容易:

$ thething = 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之类的开源项目。