Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/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函数可以防止SQL注入吗?_Php_Sql Injection - Fatal编程技术网

这个PHP函数可以防止SQL注入吗?

这个PHP函数可以防止SQL注入吗?,php,sql-injection,Php,Sql Injection,我正在使用这个函数,我希望确保它能够完全防止SQL注入攻击: function MakeSafeForQuery($string) { // replace all of the quote // chars by their escape sequence $ret = str_replace("\\","\\\\",$string); $ret = str_replace("'","\\'",$ret); $ret = str_replace("\"

我正在使用这个函数,我希望确保它能够完全防止SQL注入攻击:

function MakeSafeForQuery($string)
{
    // replace all of the quote
    // chars by their escape sequence

    $ret = str_replace("\\","\\\\",$string);
    $ret = str_replace("'","\\'",$ret);
    $ret = str_replace("\"","\\\"",$ret);

    return $ret;
}
我错过了什么重要的东西吗

编辑:顺便说一句,我正在使用MySQL。

您不能直接使用MySQL吗?或者您正在尝试在没有数据库连接的情况下使用MySQL吗


(这似乎违背了目的……)

为了防止SQL注入,您不应该使用自己编写的函数

相反,您应该使用数据库驱动程序提供的函数

例如:


正确的字符串转义方法取决于数据库系统及其配置(这就是转义函数通常需要活动数据库连接的原因)——这意味着您的函数可以/将在大多数情况下工作,但不一定总是如此

在GBK中,0xbf27不是有效的多字节字符,但0xbf5c是。被解释为单字节字符,0xbf27是0xbf(
),后跟0x27(
),0xbf5c是0xbf(
),后跟0x5c(
\

这有什么帮助?如果我想尝试对MySQL数据库进行SQL注入攻击,那么使用反斜杠转义单引号是一个麻烦。但是,如果您使用的是
addslashes()
,我就很幸运了。我所需要做的就是注入类似0xbf27的内容,
addslashes()
将其修改为0xbf5c27,一个有效的多字节字符,后跟一个引号。换句话说,我可以成功地注入一个引用,尽管你逃跑了。这是因为0xbf5c被解释为单个字符,而不是两个。哎呀,反斜杠来了

任何字符编码中都可能存在以0x5c结尾的有效多字节字符,这是因为
addslashes()
可以被诱骗创建有效的多字节字符,而不是转义后面的单引号。UTF-8不符合此描述

要避免此类漏洞,请使用
mysql\u real\u escape\u string()


现在,您应该使用,其参数不易受注入攻击,而不是使用消毒功能。支持他们。有关详细信息,请阅读“”

请注意,大多数DB驱动程序只能参数化标量值。复合值(例如在(列表)运算符中的
中使用)和语句的其他部分通常不能参数化。对于这些,您仍然需要在语句中插入值。最好不要将用户输入直接用于值以外的任何内容。

绝对不会。 不是因为一些你在生活中永远不会遇到的异国情调,而是因为一个简单的事实,独自逃离没有任何帮助

添加斜线并不像某些神的干预,可以立即阻止恐怖注射

事实上,它只有在与引号结合使用时才有效。如果你引用了你的转义数据,你可能会认为自己是安全的,即使你自己的家庭逃脱功能(只要你编码一个字节或UTF-8)。然而,有时我们不(甚至不能)在变量周围使用引号,这样的地方会立即成为一个安全漏洞

关于进一步的解释,你可以参考我之前对类似问题的回答:

至于公认的答案,请记住,mysql_real_escape_string()和PDO prepared语句如果单独使用,在没有采取必要预防措施的情况下都具有完全相同的漏洞。您必须正确设置客户端编码以使其按预期工作

所以,事实上,只要
使用mysql\u real\u escape\u string()
就可以帮到你,只不过是你自己的功能。

mysql\u set\u charset()必须与mysql\u real\u escape\u string()一起使用
在PDO中,要么关闭仿真模式,要么在DSN中设置编码

是否使用MySQL?如果是这样,我建议使用PHP的mysql\u real\u escape\u string()函数。我想看看我是否可以编写一些不使用
mysql\u real\u escape\u string
的东西。我所拥有的能保护我免于麻烦吗?为什么,乔治?如果你把车开到汽车修理厂,你会想让修理工自己制造工具,然后增加你的账单吗?不因为你的客户/老板不希望你浪费他们的时间和金钱。不,这不会保护你免受问题的影响。正确的转义是很好的第一步。请注意,准备好的语句对查询标识符没有帮助。也没有任何escaing函数可以这样做。@Col:这是一个重要的观点,因此(无可否认地)使用了“参数不易受攻击”这句话。答案更新为更明确。转义本身不足以保护任何东西