Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用_string()是否可以很好地防御SQL注入?_Php_Mysql_Sql Injection - Fatal编程技术网

Php 使用_string()是否可以很好地防御SQL注入?

Php 使用_string()是否可以很好地防御SQL注入?,php,mysql,sql-injection,Php,Mysql,Sql Injection,我试图寻找针对基于PHP和MySQL的web应用程序的SQL注入的缓解措施。第一条规则是清理查询;因此,我使用了mysql\u real\u escape\u string()函数来实现这一点 下面是我的代码片段的样子 if (is_string($string)) { return $mysqli->real_escape_string($string); } else { return ""; } 这里,$string将包含用户输入。在这个过滤和转义之后,我将使用IN

我试图寻找针对基于PHP和MySQL的web应用程序的SQL注入的缓解措施。第一条规则是清理查询;因此,我使用了
mysql\u real\u escape\u string()
函数来实现这一点

下面是我的代码片段的样子

if (is_string($string)) {
    return $mysqli->real_escape_string($string);
} else {
    return "";
}
这里,
$string
将包含用户输入。在这个过滤和转义之后,我将使用
INSERT-INTO
query插入数据库

此过滤器将阻止任何恶意用户输入,如
haha'
inj'
等,因为
是字符串()
将检测这些字符串,并应用
real\u escape\u string()
来转义这些恶意字符。我认为攻击者可以做的唯一可能性是使用数字负载进行SQL注入,但我不知道到目前为止有任何数字负载本身导致了注入

那么,这个过滤器会远离坏人还是可以绕过

编辑: 我知道在生产中启动应用程序时,准备好的语句要好得多,而且是一种很好的编码实践。但对于这个问题,我特别寻找答案,任何人都可以阻止这个过滤器本身,因为它似乎对我来说很强大

否: 此过滤器将阻止任何恶意用户输入,如haha',inj''

你的想法绝不是一种保护。在用户输入中也没有什么“恶意”的东西,比如haha',inj''

这就是说,任何用户输入都是一个字符串,因此您将创建一个对臭名昭著、备受鄙视且长期远离该语言的语言的嘲弄

去准备好的陈述

没有
is_string()
不会防止SQL注入,数值负载无论如何都不会导致任何表损坏或不必要的访问,并且字符串清理不会防止所有SQL注入

我应该告诉你为什么准备好的陈述令人惊讶,诸如此类,但你自己表示,问题的重点是指出卫生处理方面的缺陷

为什么你应该使用事先准备好的陈述而不是消毒
  • 在某些情况下,您希望数据库中有未初始化的数据,例如特殊格式的文本(如LaTeX、XML或JSON),您需要对数据进行反清理,这并不能保证100%的准确性(例如,包含HTML实体的XML文件,如
    将更改为”,更改数据)

  • 准备好的语句可以用很少的行重新绑定和执行

  • 从理论上讲,如果您有下面这样的查询,清理将不会拯救您

    $iId=mysql\u real\u escape\u字符串(“1或1=1”)
    $sSql=“从id=$iId的表格中选择*”


  • 你为什么不能用事先准备好的陈述呢@特里:谢谢你的建议。我肯定会的,但我正在寻找与我提到的过滤器相关的响应。使用
    is\u string
    和不使用有什么区别?没有任何东西…@AbraCadaver
    是字符串
    将查看用户输入是否是字符串,如
    你好
    你好
    你好“
    等,攻击者可使用这些信息进行注射。所以它返回true并对其应用escape_string函数。听起来很合理,为什么不直接转义它,不管它是否是字符串?第一个没有意义,因为转义不会改变数据。第二个几乎不是一个好处。只有最后一个是真实的thing@YourCommonSense如果转义纯文本的格式对用户的意义超过纯文本显示,则转义纯文本可以更改其含义。e、 g.清理可以防止JSON和XML数据被正确解析,如果清理,LaTeX可能会显示不正确。我知道你在谈论一些HTML内容。不知道从哪里得到的,但是这里讨论的真正的_escape_string永远不会做类似