我有在MYSQL上保护sql注入的经验,但在使用php驱动程序的MongoDB上应该注意什么?在大多数页面中,我通过get/POST和搜索/插入系统来获取数据。我通过UDID/其他字段进行搜索,可以插入任何字符串值。此外,我还通过javascript获取用户的cookie。
-
那么,当GET/POST时,我会向每个变量添加htmlentities函数吗?
-
什么将取代mysql_real_sescape_string?我应该用它吗?
例如,在进行时
$download = array( 'url' => $_GET['url'] );
$downloads->insert($download);
这样可以吗?
有没有办法检查字符串是否真的是UID?
在使用MongoDB和PHP时,我还有其他想法吗?我确实使用javascript获取cookie,并使用cookie在数据库中进行搜索。那呢?
那么,当GET/POST时,我会向每个变量添加htmlentities函数吗?
不需要。但是,在将用户生成的数据输出到浏览器时,应该使用htmlentities
,以防止XSS攻击。
什么将取代mysql_real_sescape_string?我应该用它吗?
您不应该像使用MySQL那样使用mysql_real_escape_string
。在MongoDB上,没有什么能取代这一点,驱动程序会为您处理数据的转义。
有没有办法检查字符串是否真的是UID?
验证它的唯一方法是使用该字符串查询MongoDB并检查它是否存在。
但是,您可以验证格式是否正确:
$id = '4f1b166d4931b15415000000';
$a = new MongoId($id);
var_dump($a->{'$id'} == $id); // true
$id = 'foo';
$a = new MongoId($id);
var_dump($a->{'$id'} == $id); // false
在使用MongoDB和PHP时,我还有其他想法吗?我确实使用javascript获取cookie,并使用cookie在数据库中进行搜索。那呢?
不多。对于任何网络应用程序,您都不鼓励将敏感数据存储在cookie中,如用户标识符、密码等,因为它们很容易被篡改并用于访问应用程序中应受到限制的部分,或冒充其他用户。
顺便说一句,我认为遗漏了一些东西,例如
yourdomain.com/login?username=admin&passwd[$ne]=1
在Sql中,这看起来像这个
SELECT * FROM collection
WHERE username="admin",
AND passwd!=1
我知道逃避这种推理的有效方法是知道你期望的数据类型并进行强制转换。希望答案是有用的
是的,你确实需要逃跑
想象一下这样的代码:
<?php
$login = $users->findOne( [
'user_id' => $_GET['uid'],
'password' => $_GET['password']
] );
?>
请求是:
https://example.com/login?uid=3&password[$neq]=xxx
这将通过登录
您必须将GET/POST值转换为字符串
无需转义报价等
在您的情况下,要防止数组为"url":
$download = array( 'url' => (string)$_GET['url'] );
$downloads->insert($download);