我有在MYSQL上保护sql注入的经验,但是在使用php驱动程序的MongoDB上应该注意什么?在大多数页面中,我通过GET / POST和搜索/插入系统获取数据。我通过UDID /其他字段搜索,并可以插入任何字符串值。我也通过javascript获得用户的cookie。
所以当GET / POST时,我正在添加每个变量htmlentities函数?
什么会取代mysql_real_escape_string?我应该用吗?
所以,例如,在做
时$download = array( 'url' => $_GET['url'] );
$downloads->insert($download);
这样可以吗?
有没有办法检查字符串是否真的是UID?
在使用MongoDB和PHP时,我还应该注意什么呢?我确实使用javascript获取我的cookie,并使用cookie在我的数据库中搜索。那怎么样?
答案 0 :(得分:5)
所以当GET / POST时,我正在添加每个变量htmlentities函数?
没必要。但是,在将用户生成的数据输出到浏览器时,应使用htmlentities
来防止XSS攻击。
什么会取代mysql_real_escape_string?我应该用吗?
您不应该像使用mysql_real_escape_string
那样使用MySQL。在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在我的数据库中搜索。那怎么样?
不多。对于任何Web应用程序,您都不鼓励将敏感数据存储在Cookie中,例如用户标识符,密码等,因为它们可以轻松调整并用于访问应受限制的应用程序部分,或冒充其他用户
答案 1 :(得分:1)
顺便说一下,我觉得有些东西错过了
yourdomain.com/login?username=admin&passwd[$ne]=1
在Sql中,这看起来像这样
SELECT * FROM collection
WHERE username="admin",
AND passwd!=1
我所知道的有效逃避这种情况的方法是知道你期望的数据类型并投射它。 希望答案很有用
答案 2 :(得分:0)
是的,你确实需要逃脱!
想象一下这样的代码:
<?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);