形成安全.PHP MYSQL


Form security. PHP MYSQL

好的,我有一个用户表单,它有提交给数据库的值。

我的值如下,

$type = $_POST['type'];
$username = mysql_real_escape_string($_POST['username']);
$gender = $_POST['gender'];
$email = mysql_real_escape_string($_POST['email']);
$password = mysql_real_escape_string($_POST['password']);

然后插入它们,如下所示:

mysql_query("INSERT INTO accounts (username, email, password, gender, type) VALUES ('$username', '$email', '$password', '$gender', '$type')");

现在我对此完全满意,然后我做了一些研究,一些叫做Bobby Tables的东西让我担心安全性,然后我发现mysql_real_escape_string也应该用于单选按钮,然后我发现我需要定义输入值是否为整数并检查它??现在这让我很担心,因为我认为我的网站是安全的,这显然不是,所以在一些帮助下,你能解释bobby表,以及如何比使用标准的真实逃生更安全吗?

谢谢

这是对数据进行消毒的概念,特别是不可预测的面向公众的输入

网络安全规则1:永远不要相信你的输入。

mysql_real_escape_string通常就足够好了。您还可以做其他有趣的事情,例如检查应该是一个数字(这样做比调用mysql_real_escape_string更容易)。

也要记住,如果你使用你的输入的东西,而不是SQL查询,你需要额外的偏执。例如,我有一个脚本,它接受一个名称作为参数,并使用它来查找磁盘上的文件。然而,如果有人做了一些棘手的事情,他们可能能够访问一个文件,他们不应该使用我的脚本。因此,我通过检查正则表达式来确保文件名看起来正确。

转义您的所有参数将达到目的,因为这将确保所有特殊字符将被转义。所以只要相信你的mysql_real_escape_string:-)

你引用的真正问题是所谓的SQL注入,这是一个巨大的交易。

我的建议是使用php PDO来绑定变量,而不是直接运行它们。

这是我写的类来处理我:Database.php.

基本上,你不能相信浏览器的任何东西。让库为您处理安全性

这被称为SQL注入,是编程web输入的重要一课。你不应该相信用户的输入。在处理用户输入时,始终使用mysql_real_escape_stringhtmlspecialchars(后者有助于保护您的站点免受XSS的攻击;如果你确实想要允许HTML,使用像HTMLPurifier这样的库)。每当我处理用户输入时,我总是把它变成一个函数,以使我的工作更轻松。

如果你愿意,你可以创建一个数据库类来直接传递变量,而不是直接在数据库查询中使用它们。

还有XKCD参考。

从表面上看,您的单选按钮定义了一组受约束的输入,用户不能选择您没有预定义的任何选项。所以你知道你的单选按钮输入是安全的。

除了…你不。修改HTML以向服务器端PHP脚本提交一些不同的值是很简单的。您可以在telnet中手动编写输入。

对于你的web脚本是安全的,它应该是安全的作为一个模块;无论在浏览器中执行什么验证,都不应该破解PHP脚本。

这意味着将mysql_real_escape_string应用于所有输入,数字或其他。将它们ALL视为用户提供的字符串。

较好的替代方案包括PDO;这值得一查。

顺便说一句,喜欢关于Bobby Tables的评论。这是对[used-to-be-more]流行网络漫画xkcd版本的参考,其中一个角色被他的父母命名为Bobby Tables,试图在他们孩子学校的数据库系统上执行SQL注入。