php.ini配置文件,get_magic_quotes_gpc函数用来判断是否为用户提供的数据增加斜线,在传递$_GET、$_POST、$_COOKIE时发生作用。
1.测试数据
数据:$data="a'' ''b"; (a和b之间是四个单引号),从以下几方面执行写入数据库操作。
magic_quotes_gpc=off | magic_quotes_gpc=on | |||
---|---|---|---|---|
写入数据库 | 字符串未经过任何过滤处理 | 字符串加函数addlashes()处理 | 字符串未经过任何过滤处理 | 字符串加函数addlashes()处理 |
从数据库读出 | 字符串也未作任何处理 | 字符串未作任何处理 | 字符串也未作任何处理 | 字符串未作任何处理 |
操作结果 | sql语句错误,mysql无法执行sql语句,写入数据库失败 | sql语句顺利执行,数据成功写入数据库 | sql语句顺利执行,数据成功写入数据库 | sql语句顺利执行,数据成功写入数据库 |
数据库保存格式 | 无数据 | a'' ''b(与输入一样) | a'' ''b(与输入一样) | a\'\' \'\'b(添加了转义字符) |
输出数据格式 | 无数据 | a'' ''b(与输入一样) | a'' ''b(与输入一样) | a\'\' \'\'b(添加了转义字符) |
结论 | 对于未经处理的单引号在写入数据库时会使sql语句发生错误 | addslashes()函数将单引号转换为\'的转义字符使sql语句成功执行, 但\'并未作为数据存入数据库,数据库保存的是a'' ''b 而并不是想象的a\'\' \'\'b |
magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行, 但\'并未作为数据入数据库,数据库保存的是a'' ''b 而并不是想象的a\'\' \'\'b |
magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行, addslashes又将即将写入数据库的单引号转换为\',后者的转换被作为数据写入 数据库,数据库保存的是a\'\' \'\'b |
总结 |
magic_quotes_gpc=off 的情况 必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出 因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。 |
magic_quotes_gpc=on的情况, 可不对输入和输出数据库的字符串数据作 addslashes()和stripslashes()的操作,数据也会正常显示。 如果对输入的数据作了addslashes()处理, 那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。 |
2.科学解决方案
$c='"3'; $c=get_magic_quotes_gpc()?$c:addslashes($c);
get_magic_quotes_gpc在php7.4中已废弃,以后均是off情况,就是要加[addslashes() - 使用反斜线引用字符串,stripslashes() - 反引用一个引用字符串]。ini_set('magic_quotes_gpc', 'Off');也只能在低版本中使用。