Compartilhar via


Introdução

A maioria dos locatários do SharePoint Online manuseia a experiência de abertura de arquivos usando o modelo estrito. Como resultado, todos os arquivos com potencial de causar danos (por exemplo, um arquivo html com script inserido) não serão executados no navegador, mas baixados ou mostrados como conteúdo bruto (visualização html na experiência moderna de usuário). Se o locatário estiver configurado para usar o modelo permissivo, então a experiência de abertura de arquivo executará o arquivo, por exemplo, um arquivo html em uma biblioteca de documentos é executado e a página é exibida no navegador. No modo estrito, esse arquivo seria baixado.

Atualmente a configuração padrão é a estrita e você ainda não pode mudar seu locatário para o modelo permissivo. Para locatários que mudaram para o modelo permissivo, as coisas vão mudar: o modelo permissivo de locatário será substituído no final de 2018, ponto em que todos os locatários serão alterados para o modelo estrito.

Importante

Em 31 de dezembro de 2018, todos os locatários que ainda estiverem usando o modelo permissivo serão alterados para o modelo estrito.

Meu locatário será afetado?

A abordagem recomendada é verificar a configuração PermissiveBrowserFileHandlingOverride usando o PowerShell do Office 365 para SharePoint Online:

Connect-SPOService -url https://contoso-admin.sharepoint.com
$tenant = get-spotenant
$tenant.PermissiveBrowserFileHandlingOverride

Se o resultado for Falso, então o seu locatário não será afetado, mas se ele estiver configurado como Verdadeiro, então você precisa se preparar para a substituição futura.

Como posso preparar para alterar do modelo permissivo para o estrito?

mostra o modelo permissivo para o estrito

Etapa 1: avaliar o impacto

Entender quais arquivos serão afetados é a primeira etapa e você pode fazer isso por meio do scanner de arquivos permissivos. Confira o Scanner Permissivo do SharePoint para saber mais sobre o scanner e como usá-lo. Na configuração padrão, este scanner pesquisa os arquivos html/html, mas se você usar as opções de linha de comando, poderá solicitar ao scanner para procurar tipos de arquivos adicionais.

O resultado do scanner é um arquivo CSV que lista todos os arquivos afetados (html/htm + outros tipos de arquivos opcionais), incluindo informações sobre os arquivos html/htm (número de links e scripts usados, última alteração de dados, número de visualizações).

Etapa 2: analisar os resultados da verificação

Após obter a lista de arquivos afetados, você precisa avaliar quais desses arquivos e os sites que mantêm esses arquivos ainda são relevantes para os negócios. O arquivo e/ou site podem estar desatualizados, assim será possível ignorar a correção de tais arquivos/sites. Para ajudá-lo a entender o que os negócios precisam, o relatório contém os administradores dos conjuntos de sites e os proprietários de sites, fornecendo as informações necessárias para contatá-los.

Etapa 3: corrigir os arquivos

Se os arquivos forem importantes e se você quiser continuar a conseguir executar os arquivos quando o locatário passar para as configurações estritas, será necessário corrigir os arquivos, como explicado nos próximos capítulos.

Processo de correção de arquivos html/htm

O principal motivo para clientes aderirem ao modelo permissivo é porque eles desejam usar arquivos html de dentro de uma biblioteca de documentos. Como mencionado anteriormente, depois de mover esses arquivos para o modelo estrito, eles serão simplesmente baixados e não vão mais abrir automaticamente. Para esses arquivos html/html, a correção é simples: um aplicativo/usuário com permissões de administrador de conjunto de sites ou proprietário de site deve renomear os arquivos html/htm como arquivos ASPX para que eles sejam abertos novamente. O PowerShell do SharePoint Online PnP abaixo mostra como fazer isso. Digamos que você tem um arquivo html com a seguinte url: https://contoso.sharepoint.com/sites/permissive/html/newfile.html.

Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/permissive -Verbose
Rename-PnPFile -ServerRelativeUrl /sites/permissive/html/newfile.html -TargetFileName newfile.aspx -OverwriteIfAlreadyExists

Observação

O PnP PowerShell é uma solução de software livre com uma comunidade ativa de suporte. Não há nenhuma SLA para o suporte da ferramenta de software livre por parte da Microsoft.

Mais para a frente neste artigo será exibido um script que pode executar a "correção" total de um conjunto de sites.

Quem pode realizar a renomeação?

A renomeação deve ser executada por usuários com a permissão AddAndCustomizePages (ACP), concedida por padrão a administradores de conjuntos de sites ou a proprietários de sites. Se a renomeação for feita por um usuário com nível de permissão de Edição (portanto, membros do site), então a renomeação será feita, mas o arquivo .aspx resultante não estará marcado para execução, assim ele será baixado e não executado.

Quando você quiser fazer uma renomeação em massa, provavelmente usará uma entidade de aplicativo em vez de uma conta de usuário e o mesmo se aplica: a entidade de aplicativo precisa da permissão ACP (ou seja, nível de permissão com Controle total) para que isso funcione.

Meus arquivos html/htm têm links para outros arquivos html/htm na mesma pasta ou em uma subpasta. Esses links deixarão de funcionar se os arquivos forem renomeados como aspx? Se a renomeação subjacente for executada usando a chamada da API MoveTo, então a maioria dos links relativos de dentro do arquivo html será corrigida automaticamente para serem links de arquivos aspx. Basicamente, a renomeação de uma estrutura de arquivos html/htm aninhados com vínculos entre si pode ser feita apenas renomeando os arquivos reais, todos os links dentro de documentos serão processados pela renomeação.

Observação

A renomeação automática não funciona quando o documento html tem links que apontam para outros arquivos em outra coleção de site ou quando os links são gerados dinamicamente usando JavaScript. Nesses casos, as ações manuais são necessárias para corrigir os links.

E sobre os arquivos html/html mencionados em uma web part do editor de conteúdo?

Um padrão comum ao trabalhar com a web part do editor de conteúdo é quando ela menciona um arquivo html/htm. Quando o arquivo html/htm mencionado é renomeado como um arquivo .aspx, automaticamente o SharePoint também atualiza a referência na web part do editor de conteúdo, o que significa que, a partir desse momento, a web part do editor de conteúdo carrega o arquivo .aspx em vez do arquivo html/htm. Assim, os arquivos usados pela web part do editor de conteúdo podem ser renomeados com todos os outros arquivos html/htm.

E os sites com o recurso "noscript" habilitado?

Todos os sites "modernos" (o site moderno da equipe ou de comunicação) têm o recurso "noscript" ativado por padrão. Assim, ninguém tem permissão AddAndCustomizePages (ACP), assim, ninguém pode executar uma renomeação bem-sucedida de html/htm para aspx. Normalmente os arquivos html/htm ficam em sites de equipe clássicos (migrados), então esse problema não ocorre. Caso você esteja trabalhando em um site "noscript", você precisará primeiro desativar o recurso "noscript", executar a renomeação e depois reativar o "noscript". Como resultado, os arquivos html/htm podem ser executados novamente, mas observe que cada alteração nesses arquivos vai marcá-los novamente como não executáveis. Desative novamente o "noscript" e atualize o arquivo para resolver isso.

Na experiência moderna de biblioteca de documentos, por que o arquivo aspx inicialmente parece não abrir?

A experiência moderna de biblioteca de documentos "pressupõe" um determinado tipo de arquivo quando o arquivo foi adicionado e, ao acessar o arquivo pela primeira vez, você verá que os arquivos aspx são abertos incorretamente. No entanto, a segunda tentativa executa o arquivo. Para evitar esse problema, é recomendável suspender programaticamente uma vez cada arquivo renomeado, o que oferece ao SharePoint a oportunidade de definir corretamente o tipo de arquivo. O PowerShell do SharePoint Online PnP abaixo mostra como fazer isso:

Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/permissive -Verbose
Get-PnPFile -Url /sites/permissive/html/newfile.aspx -Path c:\temp -Filename newfile.aspx -AsFile

Observação

Essa etapa de "download" é incluída no script que pode executar a "correção" total de um conjunto de sites.

Correção de outros tipos de arquivo

Arquivos html/htm são o principal motivo para os clientes usarem o modo permissivo, mas e os outros tipos de arquivos? Para os formatos de arquivo mais comuns, o SharePoint Online oferece um recurso de visualização, como explicado nesse blog. O SharePoint Online pode visualizar os seguintes formatos:

Documentos

csv, doc, docm, docx, dotx, eml, msg, odp, ods, odt, pdf, pot, potm, potx, pps, ppsx, ppt, pptm, pptx, rtf, vsd, vsdx, xls, xlsb, xlsm, xlsx

Imagens

ai, arw, bmp, cr2, eps, erf, gif, ico, icon, jpeg, jpg, mrw, nef, orf, pict, png, psd, tif, tiff

Vídeos

3gp, m4v, mov, mp4, wmv

3D

3mf, fbx, obj, ply, stl

Médicos

dcm, dcm30, dic, dicm, dicom

Textos e códigos

abap, ada, adp, ahk, as, as3, asc, ascx, asm, asp, awk, bash, bash_login, bash_logout, bash_profile, bashrc, bat, bib, bsh, build, builder, c, c++, capfile, cc, cfc, cfm, cfml, cl, clj, cls, cmake, cmd, coffee, cpp, cpt, cpy, cs, cshtml, cson, csproj, css, ctp, cxx, d, ddl, di, dif, diff, disco, dml, dtd, dtml, el, emakefile, erb, erl, f, f90, f95, fs, fsi, fsscript, fsx, gemfile, gemspec, gitconfig, go, groovy, gvy, h, h++, haml, handlebars, hbs, hcp, hh, hpp, hrl, hs, htc, hxx, idl, iim, inc, inf, ini, inl, ipp, irbrc, jade, jav, java, js, jsp, jsx, l, less, lhs, lisp, log, lst, ltx, lua, m, make, markdn, markdown, md, mdown, mkdn, ml, mli, mll, mly, mm, mud, nfo, opml, osascript, out, p, pas, patch, php, php2, php3, php4, php5, phtml, pl, plist, pm, pod, pp, profile, properties, ps1, pt, py, pyw, r, rake, rb, rbx, rc, re, readme, reg, rest, resw, resx, rhtml, rjs, rprofile, rpy, rss, rst, rxml, s, sass, scala, scm, sconscript, sconstruct, script, scss, sgml, sh, shtml, sml, sql, sty, tcl, tex, text, textile, tld, tli, tmpl, tpl, txt, vb, vi, vim, wsdl, xhtml, xml, xoml, xsd, xsl, xslt, yaml, yaws, yml, zip, zsh

Script de exemplo que pode corrigir um conjunto completo de sites

Esse script pode ser usado como base inicial para uma correção com escopo de conjunto de sites. O script faz o seguinte:

  • Instala o PowerShell PnP, se ainda não estiver instalado
  • Usa a pesquisa para localizar todos os arquivos html/htm no conjunto de sites
  • Renomeia os arquivos como .aspx
  • Baixa o arquivo renomeado para habilitá-lo para funcionar no primeiro acesso da interface moderna do usuário da biblioteca de documentos
# This script does rename .htm and .html files to .aspx files. Doing so enables these files to be "executed" in SharePoint Online 
# which has it's file handling configured to be strict. See https://learn.microsoft.com/sharepoint/dev/solution-guidance/security-permissivesetting 
# for more details

function PermissiveRemediateASiteCollection
{
    param([string] $siteCollectionUrl, [string] $winCredentialsManagerLabel)
    
    $siteCollectionUrl = $siteCollectionUrl.TrimEnd("/");

    # Gets or Sets the tenant admin credentials.
    $credentials = $null

    if(![String]::IsNullOrEmpty($winCredentialsManagerLabel) -and (Get-PnPStoredCredential -Name $winCredentialsManagerLabel) -ne $null)
    {
        $credentials = $winCredentialsManagerLabel
    }
    else
    {
        # Prompts for credentials, if not found in the Windows Credential Manager.
        $email = Read-Host -Prompt "Please enter admin email"
        $pass = Read-host -AsSecureString "Please enter admin password"
        $credentials = New-Object –TypeName "System.Management.Automation.PSCredential" –ArgumentList $email, $pass
    }

    if($credentials -eq $null) 
    {
        Write-Host "Error: No credentials supplied." -ForegroundColor Red
        exit 1
    }

    Connect-PnPOnline -Url $siteCollectionUrl -Credentials $credentials -Verbose

    Write-Host "Using search to obtain a list of files to remediate..."
    Try
    {
        $searchQuery = "((fileextension=htm OR fileextension=html) AND contentclass=STS_ListItem_DocumentLibrary AND Path:$siteCollectionUrl/*)"
        $htmlFiles = Submit-PnPSearchQuery -Query $searchQuery -TrimDuplicates:$false -All
    }
    Catch [Exception]
    {
       $ErrorMessage = $_.Exception.Message
       Write-Host "Error: Search query to find the files to remediate failed...exiting the script" -ForegroundColor Red 
       Write-Host "Error: $ErrorMessage" -ForegroundColor Red 
       exit 1
    }

    # if no files were found then bail out
    if ($htmlFiles.RowCount -eq 0)
    {
        Write-Host "No files found to remediate...exiting the script" -ForegroundColor Green
        exit 0
    }
    else
    {
        Write-Host "Found" $htmlFiles.RowCount "files to remediate" -ForegroundColor Green
    }

    # Create temp folder if not yet existing
    $path = "$env:TEMP\permissivefix"
    If(!(test-path $path))
    {
          New-Item -ItemType Directory -Force -Path $path
    }

    # iterate over the found files and rename them
    foreach($htmlFile in $htmlFiles.ResultRows)
    {
        Try
        {
            $web = $htmlFile.SPWebUrl
            Write-Host "Connected to $web..."
            Connect-PnPOnline -Url $web -Credentials $credentials

            $fileToRename = $htmlFile.OriginalPath
            Write-Host "Renaming $fileToRename..."

            # Get the server relative path
            $serverRelativePath = $fileToRename.Replace("https://", "")
            $serverRelativePath = $serverRelativePath.Substring($serverRelativePath.IndexOf("/"))
            #Write-Host $serverRelativePath

            # Get new file name and server relative path
            $newFileName = $serverRelativePath.Substring($serverRelativePath.LastIndexOf("/") + 1).ToLower()
            $serverRelativePathNew = $serverRelativePath
            if ($newFileName.EndsWith(".html"))
            {
                $newFileName = $newFileName.Replace(".html", ".aspx")
                $serverRelativePathNew = $serverRelativePathNew.Replace(".html", ".aspx")
            } 
            elseif($newFileName.EndsWith(".htm"))
            {
                $newFileName = $newFileName.Replace(".htm", ".aspx")
                $serverRelativePathNew = $serverRelativePathNew.Replace(".html", ".aspx")
            }
        
            # Perform the file rename
            Rename-PnPFile -ServerRelativeUrl $serverRelativePath -TargetFileName $newFileName -OverwriteIfAlreadyExists -Force
        
            # Download the file once to ensure it works correctly in modern UI
            Get-PnPFile -Url $serverRelativePathNew -Path $path -Filename $newFileName -AsFile -Force
        }
        Catch [Exception]
        {
           $ErrorMessage = $_.Exception.Message
           Write-Host "Error: Rename of file $serverRelativePath failed" -ForegroundColor Red 
           Write-Host "Error: $ErrorMessage" -ForegroundColor Red 
        }
    }

    # Cleanup the temp folder
    Write-Host "Cleaning up the temp folder $path"
    Remove-Item $path -Recurse -ErrorAction Ignore

    Write-Host "Remediation done for site collection $siteCollectionUrl" -BackgroundColor DarkGreen -ForegroundColor White
}

#######################################################
# MAIN section                                        #
#######################################################

# Url of the site collection to remediate
$siteCollectionUrlToRemediate = "https://contoso.sharepoint.com/sites/testsite"
# If you use credential manager then specify the used credential manager entry, if left blank you'll be asked for a user/pwd
$credentialManagerCredentialToUse = "credmandreference"

# Ensure PnP PowerShell is loaded
if (-not (Get-Module -ListAvailable -Name SharePointPnPPowerShellOnline)) 
{
    Install-Module SharePointPnPPowerShellOnline
}

Import-Module SharePointPnPPowerShellOnline

# Remediate the given site collection
PermissiveRemediateASiteCollection $siteCollectionUrlToRemediate $credentialManagerCredentialToUse

O exemplo de saída de script bem-sucedido tem a seguinte aparência:

WARNING: The names of some imported commands from the module 'SharePointPnPPowerShellOnline' include unapproved verbs that might make them less discoverable. To find the commands with unapproved ver
bs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-Verb.
VERBOSE: PnP PowerShell Cmdlets (2.22.1801.0): Connected to https://contoso.sharepoint.com/sites/testsite
Using search to obtain a list of files to remediate...
Found 15 files to remediate


    Directory: C:\Users\demouser\AppData\Local\Temp


Mode                LastWriteTime         Length Name                                                                                                                                                
----                -------------         ------ ----                                                                                                                                                
d-----        7/02/2018     19:48                permissivefix                                                                                                                                       
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/About.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/brol.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/imagetarget.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/sample_html_afternoscript9.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/bla.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/sample_html.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/home2.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/howtouse.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/home.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/team_home.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/imagesource.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/bla2.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/wikipage.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/newfile_html.html...
Connected to https://contoso.sharepoint.com/sites/testsite...
Renaming https://contoso.sharepoint.com/sites/testsite/Shared Documents/Home3.html...
Cleaning up the temp folder C:\Users\demouser\AppData\Local\Temp\permissivefix
Remediation done for site collection https://contoso.sharepoint.com/sites/testsite