我在想这样的例子:
该请求使用参数点击网址(无论使用哪种方式)上的页面。example.com/api/page?name=bob
。据我了解,您应该准备一个准备好的语句来获取$_POST[name]
参数,并确保它没有任何时髦,但这是通过对表达式进行求值来实现的。
我的第一个问题是:它是如何做到的(评估表达式)?
我的第二个问题是:如果用户沿着“ SELECT * FROM users”或“ DROP TABLE users”的行输入内容并传递给$_POST['name']
参数(最后?name=bob
是the),那该怎么办?
仅作为示例,最终查询将类似于
SELECT name, continent FROM world
WHERE continent IN
(SELECT continent FROM world WHERE name='Brazil')
第二个选择充当用户输入参数-因此$_POST['name']
包含此查询SELECT continent FROM world WHERE name='Brazil'
最后,我要问的第三个问题是如何保护自己免受此类伤害?
我猜想PDO是专门为防止在query(?)中进行查询而设计的,但是经过一番阅读后,我还是很困惑。
我仍在学习所有这些内容,因此,如果我在查询中不清楚或不够具体,请告诉我,我将尝试解决。
编辑:要清除任何混乱,我在做什么是这样的:
$pdo = new PDO('..');
$sql = 'SELECT id FROM users WHERE username = :username';
$statement = $pdo->prepare($sql);
$statement->bindParam(':username', $_POST['username']);
问题是,如果$_POST['username']
包含'SELECT * FROM users'
(或任何其他查询)怎么办?prepare()
工作如何?我所描述的实际上可以存在安全漏洞吗?我需要一些帮助来理解这一点。
为了消除任何混乱,我在做什么:
$pdo = new PDO('..'); $sql = 'SELECT id FROM users WHERE username = :username'; $statement = $pdo->prepare($sql); $statement->bindParam(':username', $_POST['username']);
问题是,如果$ _POST ['username']包含“ SELECT * FROM users”(或任何其他查询)怎么办?
该查询将返回所有用户名为“ SELECT * FROM users”的用户的ID。
通过传递$ _POST ['username']作为参数,数据库知道$ _POST ['username']可能包含的任何字符串都不在查询中。这只是一个字符串。
由于不会执行该参数,因此可以防止SQL注入。这也意味着
SELECT name, continent FROM world WHERE continent IN (SELECT continent FROM world WHERE name='Brazil')
第二个选择充当用户输入参数-因此$ _POST ['name']包含此查询SELECT continent FROM world WHERE name ='Brazil'
将无法正常工作。因为您不能在参数中包含查询。可以,但是它们不会被执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句