为了避免SQL注入攻击,我希望在将其发送到数据库进行存储之前,清理我网站用户输入的所有文本(以及大多数其他数据)。
我的印象是该函数在所有可能是恶意的字符(\ n,',“等)之前插入反斜杠(\),并且预期返回的字符串将包含新添加的反斜杠。
我对包含此类潜在恶意字符的组成字符串执行了一个简单测试,并将其回显到文档中,完全看到了我的预期:带有反斜杠的字符串转义这些字符。
因此,在将数据存储到数据库之前,我继续将清理功能添加到数据中。我将它(mysqli_real_escape_string($ link,$ string))插入到我为数据存储构建的查询中。测试脚本,我很惊讶(有点令我懊恼)注意到存储在数据库中的数据似乎没有包含反斜杠。我测试,测试和测试,但都无济于事,我不知所措......
有什么建议吗?我错过了什么吗?我当时希望用striplashes($ string)函数删除反斜杠,但似乎没有任何东西要剥离...
答案 0 :(得分:1)
在成功插入后在数据库中查看数据时,如果使用mysql_real_escape_string()
对其进行了转义,则将不会看到数据库中的反斜杠。这是因为只在SQL查询语句中需要转义反斜杠。 mysql_real_escape_string()
对其进行清理以进行插入(或更新或其他查询输入),但在存储时不会导致数据的永久修改版本。
通常,您不想要在数据库中存储已修改或已清理的数据,而应将数据存储在其原始版本中。例如,最佳实践是存储完整的HTML字符串,而不是存储使用PHP htmlspecialchars()
编码的HTML。
当您从数据库中检索它时,不需要stripslashes()
或其他类似的unescaping。像magic_quotes_gpc
这样的PHP有一些遗留(错误)功能,它们旨在通过自动在引用的字符串中添加反斜杠来保护程序员自己,需要在输出上使用`stripslashes(),但这些功能已经被已弃用,现已大部分已删除。
答案 1 :(得分:1)
MySQL不使用斜杠存储数据(尽管它使用斜杠传递给RDBMS)。所以你以后不需要使用stripslashes()。
您可以确定该字符串已被转义,否则查询将失败。
答案 2 :(得分:0)
我希望清理我网站用户输入的所有文字(以及大多数其他数据)
这就是你做错了。
在当前表单中,您离开您的网站时极易受到攻击和错误的攻击。
我的印象是该函数在所有可能是恶意的字符(\ n,',“等)之前插入反斜杠(\),
为了让您知道,任何角色都没有恶意。有一些服务角色,在某些情况下可能会被误解 但添加反斜杠不会使您的数据自动“安全”。一些注射不需要任何特殊字符。因此,您需要正确地格式化数据,而不仅仅是使用一种能让您神奇安全的魔法