Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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
使用MongoDB PHP驱动程序时的安全问题_Php_Security_Mongodb - Fatal编程技术网

使用MongoDB PHP驱动程序时的安全问题

使用MongoDB PHP驱动程序时的安全问题,php,security,mongodb,Php,Security,Mongodb,我有在MYSQL上保护sql注入的经验,但在使用php驱动程序的MongoDB上我应该注意什么?在大多数页面中,我通过get/POST和搜索/插入系统获取数据。我通过UDID/其他字段进行搜索,可以插入任何字符串值。我还通过javascript获取用户的cookies 所以当GET/POST时,我向每个变量添加htmlentities函数 什么将取代mysql\u real\u escape\u字符串?我应该用它吗 比如说,当你 $download = array( 'url' => $_

我有在MYSQL上保护sql注入的经验,但在使用php驱动程序的MongoDB上我应该注意什么?在大多数页面中,我通过get/POST和搜索/插入系统获取数据。我通过UDID/其他字段进行搜索,可以插入任何字符串值。我还通过javascript获取用户的cookies

  • 所以当GET/POST时,我向每个变量添加htmlentities函数

  • 什么将取代mysql\u real\u escape\u字符串?我应该用它吗

  • 比如说,当你

    $download = array( 'url' => $_GET['url'] );
    
    $downloads->insert($download); 
    
    这样行吗

  • 有没有办法检查字符串是否真的是UID

  • 您认为在使用MongoDB和PHP时,我还应该注意什么?我确实使用javascript获取cookies,并使用cookies在数据库中搜索。那怎么办

  • 所以当GET/POST时,我向每个变量添加htmlentities函数

    没必要。但是,在将用户生成的数据输出到浏览器时,应使用
    htmlentities
    ,以防止XSS攻击

    什么将取代mysql\u real\u escape\u字符串?我应该用它吗

    你不应该像mysql那样使用
    mysql\u real\u escape\u string
    。在MongoDB上没有任何东西可以替代它,驱动程序负责为您转义数据

    有没有办法检查字符串是否真的是UID

    唯一的验证方法是使用该字符串查询MongoDB并检查它是否存在

    但是,您可以验证格式是否正确:

    您认为在使用MongoDB和PHP时,我还应该注意什么?我确实使用javascript获取cookies,并使用cookies在数据库中搜索。那怎么办


    不多。对于任何web应用程序,都不鼓励您将敏感数据存储在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']
    ] );
    ?>
    
    这将通过登录
    您必须将GET/POST值转换为字符串。
    不需要转义引号等

    在您的情况下,要防止数组作为“url”:

    $download = array( 'url' => (string)$_GET['url'] );
    $downloads->insert($download); 
    

    在此处和您的问题中都已修复。:)非常感谢你!听起来真不错。因此,例如,在执行$download=array('url'=>$\u GET['url'])时$下载->插入($download);这可以吗?@EiTkoCaT:可以。这是非常安全的,因为MongoDB驱动程序将自动退出用户输入。但出于数据完整性的考虑,您仍然应该进行验证,以确保
    $\u GET['url']
    是实际的url。您确实需要转义。见下面我的答案。
    https://example.com/login?uid=3&password[$neq]=xxx
    
    $download = array( 'url' => (string)$_GET['url'] );
    $downloads->insert($download);