【问题标题】:Using mysqli_real_escape_string with other Sanitizing Function [duplicate]将 mysqli_real_escape_string 与其他消毒功能一起使用 [重复]
【发布时间】:2015-10-27 08:54:35
【问题描述】:

我的表单输入消毒功能:

function clean_input($data) 
            {
              $data = trim($data);
              $data = strip_tags($data);
              $data = stripslashes($data);
              $data = htmlspecialchars($data);
              return $data;
            }   

我的 SQL 行:

$q  = "SELECT * FROM users WHERE username = {mysqli_real_escape_string   ('$username')} AND password = {mysqli_real_escape_string('$password')}";
                            $r = mysqli_query($dbc, $q);

这是正确的用法吗?

【问题讨论】:

    标签: php mysql security sql-injection sanitization


    【解决方案1】:

    这是正确的用法吗?

    不,不是。如果您在输入周围使用单引号并且不使用certain multibyte charsets,这将是相当安全的,但这确实不是安全性或可用性/数据完整性的推荐方法。

    防止 SQL 注入

    使用准备好的语句。使用 PHP,您可以使用 mysqliPDO(另请注意 this,这可能是一个问题,具体取决于您的版本/配置)。

    OWASP 是这样说的:

    第二种技术是在将用户输入放入 询问。但是,这种方法 [mysqli_real_escape_string] 与使用 参数化查询,我们不能保证它会阻止所有 SQL 在所有情况下注射。这种技术只应与 谨慎,以具有成本效益的方式改造遗留代码。

    clean_input 函数

    让我们来看看这些函数中的每一个:

    • trim:删除字符串开头和结尾的空格。这在某些情况下可能很有用,并且在太多情况下不会造成伤害。它不会真正影响安全性。
    • strip_tags:删除NULL bytes, HTML and PHP tags。这可能是抵御某些攻击(某些代码注入、某些 XSS、某些 LFI/RFI)的不错的第一道防线,但它可能会破坏您的数据(例如,the smaller sign (<) is interesting 变为 the smaller sign ()。它也不是对任何上述攻击的适当防御,所以我真的不建议这样使用它。
    • stripslashes:顾名思义,它会删除斜线。这仅在魔术引号打开时有用(这是添加斜线的功能),因此您应该首先检查它,否则您可能会损坏您的数据。如果启用了魔术引号(不应该启用),建议使用带斜杠,否则您将损坏数据。
    • htmlspecialchars,这可能会损坏您的数据(例如,您没有将原始数据保存在数据库中,而是更改了数据)。在大多数情况下,这是对 XSS 的适当防御(有关例外情况,请参阅 here,并使用 ENT_QUOTES),但实际上不应该在将数据插入数据库之前发生,原因有两个:1. 损坏的数据 2. 这种方法使得很容易引入 XSS 漏洞。 XSS 是在回显数据时引入的漏洞,因此应该防止它。否则,将很难记住哪些数据是安全的,哪些不是。

    总结一下:您的方法在将输入数据插入数据库之前对其进行了更改,这可能会影响可用性。这甚至不会增加太多的安全性,当然也不会被认为是安全性的最佳实践方法。

    【讨论】:

    • 感谢您的广泛回应和见解。我从你们的 cmets 身上学到了很多东西,并且有了新的学习方向。
    猜你喜欢
    • 2018-12-10
    • 2022-01-16
    • 1970-01-01
    • 2017-03-13
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多