我是一名新的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']);
请让我知道你们的想法。
答案 0 :(得分:1)
我发现总是使用预准备语句更容易记住,而不是确保所有参数都被正确转义。所以我建议准备好的陈述。
相关问题:
答案 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)
我们认为您的保护理念是完全错误的。
任何字符都不会损害数据库。但有些字符可能会破坏查询。你不应该这样做。
因此mysql_real_escape_string();转义可能会破坏字符串的字符。
因此mysql_real_escape_string();只需要转义字符串。它对查询的任何其他部分都没有帮助。
此外,字符串不仅可以从POST GET和REQUEST查询,还可以从世界上的任何来源查询。你必须逃避进入查询的字符串,而不是来自某些来源。目的地是一个原因,而不是来源。
请参阅评论中的问题以获得进一步的解释
答案 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之类的开源项目。