什么是保护数据进入的正确方法;我的数据库外?

时间:2011-11-10 15:17:09

标签: php mysql

我在the last question I asked中的一些建议后尝试保护我的脚本。

我需要使用$row['page_name']函数保护mysql_real_escape_string之类的内容吗?例如:

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

我主要是因为当我确保每一行都安全时,我会遇到一些错误,例如在尝试number_format()时它会抛出number_format() expects parameter 1 to be double, string given,而当它没有mysql_real_escape_string保护时,它会起作用。< / p>

有人可以为我清楚这个吗?我是否只需要保护COOKIE或行提取?

我在这篇文章中得到了建议:HERE(查看所选答案)

5 个答案:

答案 0 :(得分:4)

你正在倒退。据推测,$row是从数据库中出来的行。您没有mysql_real_escape_string在数据库 out 的路上,您将它用于进入数据库的数据,以防止SQL注入。它阻止人们提交包含可执行SQL代码的数据。

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

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

答案 1 :(得分:3)

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

在编写更多代码之前,您需要停下来并仔细考虑您要完成的任务。

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

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

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

我强烈建议您转到OWASP website并阅读所有问题,以便更好地了解攻击的工作原理以及如何防御攻击。 Web App安全性非常重要,只是在不知道发生了什么的情况下开始编码。

顺便说一句,感谢您了解这一点并试图保护您的网站。太多的开发人员根本不考虑安全问题。

答案 2 :(得分:1)

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

这包括:

  • $ _ GET
  • $ _ POST
  • $ _ COOKIE
  • 来自浏览器的任何内容
  • 等。

你应该只在将东西放入数据库时​​使用它,而不是在你拿出东西时使用它,因为它们应该是安全的。

更安全的方法是使用PDO

答案 3 :(得分:1)

如果您使用PDO扩展来构建干净的请求,您可以创建将执行此操作的函数(安全字符串并定义其类型):

一个例子,其中$ text是一个文本字符串,$ number是一个整数:

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

答案 4 :(得分:0)

mysql_real_escape_string不会“保护”任何内容。它会转义可以在sql injection attacks中使用的字符。因此,您应该转义的唯一值是您的用户提供的值。不应该逃避自己数据库中出现的事情。