好的我有一个用户表单,其中包含提交给数据库的值。
我的价值观如下,
$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 应该是用于单选按钮,然后我发现我需要定义输入值是否为整数并检查它?现在这让我大家都担心,因为我认为我的网站是安全的,显然不是这样,所以有了一些帮助,你可以解释一下鲍比表以及如何确保比使用标准真正的逃生更加安全吗?
由于
答案 0 :(得分:2)
这是公共面临的sanitizing your data, 尤其 不可预测的输入的概念。
答案 1 :(得分:1)
网络安全规则#1:永远不要相信你的输入。
mysql_real_escape_string通常会足够好。您可以执行其他有趣的操作,例如检查 应该是 的数字<(这样做比调用mysql_real_escape_string更容易)。
请记住,如果您将输入用于SQL查询以外的其他内容,则需要特别偏执。例如,我有一个脚本,它将名称作为参数,并用它来查找磁盘上的文件。但是,如果有人做了一些棘手的事情,他们可能能够访问他们不应该使用我的脚本的文件。因此,我通过检查正则表达式来确保文件名看起来是正确的。
答案 2 :(得分:1)
转义所有参数将起到作用,因为这将确保所有特殊字符都将被转义。所以只要相信你的mysql_real_escape_string: - )
答案 3 :(得分:1)
您引用的真正问题称为SQL injection,这是一笔巨大的交易。
我的转到建议是使用php PDO绑定变量而不是直接运行它们。
以下是我为此处理的课程:Database.php。
基本上,您不能相信浏览器中的任何内容。让图书馆为您处理安全问题。
答案 4 :(得分:1)
这称为SQL注入,是编写Web输入的重要课程。您应该从不信任您的用户输入。在处理用户输入时始终使用mysql_real_escape_string
和htmlspecialchars
(后者有助于保护您的网站免受XSS攻击;如果您 想要允许HTML,请使用像{{{}这样的库3}})。每当我处理用户输入时,我总是将它变成一个函数,以使我的生活更轻松。
如果需要,可以使数据库类直接传递变量,而不是直接在数据库查询中使用它们。
此外,LOL在XKCD参考。
答案 5 :(得分:1)
在表面上,当然,您的单选按钮定义了一组受限制的输入,您的用户无法选择您尚未预定义的任何选项。所以你知道你的单选按钮输入是安全的。
除了......你没有。修改HTML以向服务器端PHP脚本提交一些不同的值是微不足道的。您可以在telnet中手动编写输入。
为了使您的网页脚本安全,它应该是一个安全的作为模块;无论您在浏览器中执行了哪些验证,都应该不可能来破解您的PHP脚本。
这意味着将mysql_real_escape_string
应用于 ALL 您的输入,数字或其他。将 ALL 视为用户提供的字符串。
卓越的替代品包括PDO;这值得一看。
BTW,喜欢关于Bobby Tables的评论。这是对 [used-to-more] 流行的webcomic xkcd版本的引用,其中一个角色被他的父母命名为Bobby Tables,试图执行SQL注入他们孩子的学校的数据库系统。真正的术语是SQL注入。