Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.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查询中使用Prepard语句/mysql\u real\u escape\u字符串_Php_Mysql - Fatal编程技术网

Php 为什么在SQL查询中使用Prepard语句/mysql\u real\u escape\u字符串

Php 为什么在SQL查询中使用Prepard语句/mysql\u real\u escape\u字符串,php,mysql,Php,Mysql,我读过很多文章,建议在SQL查询中使用Prepared语句,但是由于mysql\u\lib不允许在一个语句中执行两个查询,如果我在执行页面时只需要触发一次查询,并且在某些情况下mysql\u查询似乎也会忽略无效的post数据,那么是否值得使用它们(如“ADMIN”或1--) 现在,如果有人将“用户名”作为 上述查询不获取“Admin”行!这是mysql_查询的一个功能,它忽略了'1'/Special chars之后的注释。在这种情况下,运行mysql 5.5和PHP5.3可能'ADMIN'或1-

我读过很多文章,建议在SQL查询中使用
Prepared语句
,但是由于
mysql\u\lib不允许在一个语句中执行两个查询
,如果我在执行页面时只需要触发一次查询,并且在某些情况下mysql\u查询似乎也会忽略无效的post数据,那么是否值得使用它们(如
“ADMIN”或1--

现在,如果有人将“用户名”作为


上述查询不获取“Admin”行!这是mysql_查询的一个功能,它忽略了
'1'/Special chars
之后的注释。在这种情况下,运行mysql 5.5和PHP5.3

可能
'ADMIN'或1--
不起作用,但是
'ADMIN'或'x'='y'
肯定会起作用,因为它会导致这个SQL查询:

SELECT *
  FROM users
 WHERE username = 'ADMIN'                    -- true
    OR 'x' = 'y' AND password = 'whatever'   -- false, but who cares?
;

总的教训是:为安全性编码是很难的,因为我们不习惯考虑恶意代理积极寻求破坏我们的代码。SQL注入是一个已解决的问题,解决方案是参数化查询,因此您应该使用参数化查询,而不是尝试推出自己尝试的解决方案。

此查询只会在u如果我们使用的是
mysql\u real\u escape\u string()
,那么我们应该使用
mysqli
如果你努力使用
mysql\u real\u escape\u string()
,那么你是安全的。问题是我们是人,有时会忘记(我知道我忘记了).Prepared语句不会犯这个错误。@Barmar:没错,但问题的标题是“为什么在SQL查询中使用Prepared语句/mysql\u real\u escape\u字符串”,所以我认为OP不是在问为什么我们应该使用Prepared语句而不是
mysql\u real\u escape\u字符串
“Prepared语句不会犯这个错误。”这是错误的:$mysqli->prepare(“SELECT*FROM users,其中username='$user')与未准备语句具有相同的SQL注入漏洞。我想指出的一点是,我们不能只是到处说“使用它,不会出错”因为如果他们不理解正确的用法,或者不理解为什么盲目地将用户生成的数据扔进查询是不好的,他们仍然会犯错误。@ruakh我是针对jhonraymos的评论,而不是最初的问题。
'ADMIN' OR 1--
SELECT *
  FROM users
 WHERE username = 'ADMIN'                    -- true
    OR 'x' = 'y' AND password = 'whatever'   -- false, but who cares?
;