2011-11-10 84 views
2

我想在the last question I asked中的一些建议之后保护我的脚本。什么是保护数据进出数据库的正确方法?

我需要使用mysql_real_escape_string函数来保护像$row['page_name']这样的东西吗?例如:

$pagename = mysql_real_escape_string($row['page_name']); 

我问,主要是因为当我做保证每一行,我得到了一些错误试图number_format()时,它抛出number_format() expects parameter 1 to be double, string given而当它不与mysql_real_escape_string确保它的工作原理等。

有人可以帮我清楚吗?我只需要保证COOKIE的行或行取得?

我得到了这个职位的建议:你倒着做HERE(看选择的答案)

+1

你能显示错误代码,而不仅仅是一行吗? – SergeS

+0

请告诉我你想看到什么代码,我宁愿不要发布整个脚本,因为它很长时间以来与很多不相关的东西。 – Ricardo

回答

4

。推测$row是这个数据库中出来的一行。你没有mysql_real_escape_string的途径出了的数据库,你用它把数据转到转成这个数据库来防止SQL注入。它可以防止人们提交包含可执行SQL代码的数据。

一旦数据安全地在数据库中,您就完成了mysql_real_escape_string(直到您尝试更新该数据)。用户数据到达数据库需要通过htmlspecialchars运行,然后才到达页面以防止脚本注入。

基本上,在前往数据库的途中,就在插入/更新之前运行,您需要转义潜在的可执行SQL。在前往浏览器的途中,就在字符串离开您的应用程序浏览器之前,您需要转义潜在的可执行JavaScript和/或可解释的HTML。在应用程序离开浏览器或数据库之前,转义应该是您对一段数据所做的最后一件事。

+0

1)所以我不能定义一个变量的担保价值? 2)当从数据库中提取数据时,我需要使用'html_special_chars'而不是'mysql_real_escape_string'? – Ricardo

+1

1)你可以在任何地方存储编码值,它只是一个值。把它放在一个变量或数组中。我假设你的变量来自数据库,因为你没有指定。 2)是的,在使用浏览器的数据时使用'mysql_real_escape_string'会产生输出错误和潜在的JS注入漏洞。 – meagar

0

mysql_real_escape_string不“保护”任何东西。它逃脱了可用于sql injection attacks的字符。因此,您应该转义的唯一值是您的用户提供的值。应该没有必要转义出自己数据库中的东西。

+0

我已经编辑了这篇文章,并提供了我之前提出的建议来做我目前正在做的事情,任何关于那里的人的建议的解释? – Ricardo

1

插入/更新值来自不受信任来源的行时,您只需要使用mysql_real_escape_string()

这包括诸如:即来自于浏览器

    • $ _GET
    • $ _ POST
    • $ _COOKIE
    • 什么..]

    你应该只有在将数据放入数据库时​​才使用它,而不是在使用时因为他们应该已经安全了。

    完全一个更安全的方法是使用PDO

  • 1

    如果使用PDO扩展打造干净的请求,您可以创建功能,将做到这(安全串并定义它们的类型):

    个例,其中$文字文本和$数字的字符串是一个整数:

    public function InsertThis($number, $text) { 
        $pdo = $this->getPdo(); 
        $sth = $pdo->prepare("INSERT INTO my_table (number, text) VALUES (:number, :text"); 
        $sth->bindParam('number',$number,PDO::PARAM_INT); 
        $sth->bindParam('text',$text); 
        $sth->execute(); 
    } 
    

    http://php.net/manual/en/book.pdo.php

    3

    这绝不是一个完整的答案。

    在编写任何更多的代码之前,您需要停下来并考虑到你要完成的是什么。

    换句话说,你通过运行mysql_real_escape_string函数获得了什么?

    一般来说,您会转义客户端提交的数据。这是为了帮助防止sql注入。此外,您应该进一步实际验证客户发送的内容是否可接受(即“完整性检查”)。例如,如果您希望输入数字,请不要接受字符串,并且范围检查值。如果您希望字符串数据像名称一样,请不要接受HTML,但再次进行范围检查以验证长度是否可接受。当客户提交数据时,这两种情况都会发生,而不是在您将其写回时。

    进一步说,你的cookies应该被加密并用httponly标记来告诉浏览器它不用于客户端脚本。即使这样,你也不应该相信cookie中的数据;所以继续运行你的理智检查,并仍然在查询中逃避这些值。

    我强烈建议您进入OWASP website并仔细阅读所有问题,以更好地理解攻击是如何工作的以及如何防御攻击。 Web应用程序的安全性太重要,不能在不知道发生了什么事情的情况下开始编码。

    顺便说一句,向您了解这一点,并试图捍卫您的网站。太多的开发人员甚至根本不考虑安全性。

    相关问题