PHP安全用户变量

时间:2010-08-21 17:42:10

标签: php sql mysql security

在我的网站上,我有一个名为$user_data的变量,其中包含来自表单的输入。然后我在用户页面上显示这个变量(通过echo)。

使用此变量避免任何安全风险的最佳方法是什么?我使用strip_tags(),但这还不够。

此变量也会保存到MySQL数据库中。

4 个答案:

答案 0 :(得分:14)

为避免严重的安全问题,您必须做两件非常重要的事情。

  1. 您需要在将用户输入放入SQL查询之前将其转义。转义意味着转义所有特殊字符,例如';幸运的是,有一个功能已经自动完成:mysql_real_escape_string

    如果你不逃避用户输入,可能会发生令人讨厌的事情。想象一下,您的查询是INSERT INTO userdata VALUES ('$user_data')。现在假设用户写了'; DROP DATABASE userdata;

    如果您不撤消它,您的查询将变为:INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')。你可以想象这并不好:如果你启用了多个语句,你可以亲吻你的数据库。这称为 SQL注入攻击。

  2. 当您将变量输出给用户时,您还需要使用HTML实体正确替换HTML特殊字符。幸运的是,还有一个功能:htmlspecialchars()。它会将<等特殊HTML字符转换为&lt;

    这似乎是一个经常被低估的问题,但实际上它是非常严重的。想象一下,$user_data是否包含<script>SomeNastyScript()</script>。它可以利用用户浏览器中的现有漏洞,或者它可以向攻击者发送非HTTPOnly cookie(可能包含已保存的密码),或者它可以欺骗用户在通过操作操作生成的表单上写入密码DOM(可能在javascript中),或许多其他坏事。

    这称为 XSS (跨站点脚本)。


  3. 短版

    1. 在将字符串插入SQL查询之前调用mysql_real_escape_string(但不是在echo之后)。

    2. 在将字符串显示给用户之前调用htmlspecialchars(但不是在将其放入数据库时​​)。

答案 1 :(得分:4)

当您要输出内容时,strip_tagshtmlspecialchars没问题。我更喜欢后者,因为你不会完全破坏<3之类的,而且从来都不是HTML标签。

将值直接放入查询时,mysql_real_escape_string是适当的转义方式,或仅使用PDO和预处理语句。

当然,最好只在您需要它们时才执行这些转义方法,而不是同时应用于所有变量。如果你想在将它放入数据库之前实际使用它,那么必须从MySQL转义的变量中删除斜杠总是很痛苦,而且这并不比PHP4的魔术引号更好。同样,在将某人的“one&lt; two”密码插入数据库之前,您不希望将其密码变为“one&lt; lt; two”。 (显然,你不应该存储明文密码,但通用的例子就是这样。)

答案 2 :(得分:2)

没有一种叫做“安全”的东西 没办法只保护抽象变量。一切都取决于场景 通常用于安全的避孕套。你会用安全套来保护你的钱吗?我想 - 不 同样在这里。 您最好区分这两个问题 - 数据库安全性和显示安全性。

数据库一只比“调用mysql_real_escape_string”复杂一点。我已在 this answer

中全面描述了所有规则

答案 3 :(得分:0)

你也可以这样做:

$way = preg_replace('#[^a-z0-9]#i', '', 
    strip_tags(htmlentities(htmlspecialchars(mysqli_escape_string($db_conx, $_GET['way'])))));