有人可以离线编辑javascript文件来运行恶意代码吗?

Dee*_*lue 6 html javascript php xss jquery

我担心与我的网站的javascript文件有关的事情,我不确定这是否可行.

当有人访问网站时,将下载Js文件,如果有人编辑了下载的js脚本并插入了他自己的代码,然后刷新了网站.在新刷新中,网站将读取已编辑的Js文件并运行恶意代码.恶意代码可能用于以正常方式在服务器上运行某些代码.

例:

用户只能在其页面中发布文章:

HTML

文章表单仅在用户页面中显示.

<?php
if( $user->id == $page->userID )
{
?>    
<form>
<h1>Add new article:</h1><br />
<textarea name="articleText" cols="65" rows="3"></textarea>
<input class="SubmitArticle" id="<?php echo $userPage->id; ?>" name="SubmitArticle" type="button" value="Submit article" />
</form>
<?php
}
?>
Run Code Online (Sandbox Code Playgroud)

使用Javascript

$(".SubmitArticle").click( function(e){
    var targetPage = $(this).attr('id');
    var thisForm = $(this).parent();
    var postData = thisForm.serialize() + "&targetPage=" + targetPage;

    $.post(document.location, postData, function(data) {
        $('#mainDiv').html(data);
    });
});
Run Code Online (Sandbox Code Playgroud)

PHP

if( isset($_POST["SubmitArticle"]) )
{
    $pageID = $_POST["targetPage"];
    $text = $_POST["articleText"];

    PublishArticle( $pageID , $text );
}
Run Code Online (Sandbox Code Playgroud)

恶意代码:

代码插入JS文件以在其他用户页面上写文章(这是不允许的),攻击者使用视图页面源从html元素读取页面ID(比如说page_id = 12):

postData = "SubmitArticle=1&targetPage=12&articleText='Muwhahahah'";
$.post(document.location, postData, function(data) {
});
Run Code Online (Sandbox Code Playgroud)

如果可能的话,解决方案是什么?

Ron*_*Dex 5

我认为您对网络服务器的工作原理存在一些误解。

从客户端的角度来看,服务器发送到客户端的所有内容都是只读的。

假设您从互联网上下载了一个 zip 文件。然后您修改并保存它。保存过程将发生在您的硬盘上,而不是服务器上。当您编辑本地文件(在您的示例中为 javascript 文件)时,它不会在服务器上编辑,只会在本地 PC 上编辑。

因此,您可以按照自己的意愿自由地执行/编辑本地文件。除非您以某种方式将其上传到服务器(例如 FTP),否则它只会位于您的本地 PC 上。

考虑到这一点,您应该始终在服务器端验证数据,因为熟练的用户可以编辑您的 JavaScript 以删除数据验证并将其发送到服务器。

  • @user2007059 我认为你错过了我的帖子的要点:Javascript 文件在客户端运行,每个人都可以编辑它们是的。但是,当他编辑它们时,编辑后的文件只会在他的本地 PC 上运行。他无法更改存储在服务器上并由网页的每个访问者下载的 JavaScript 文件。您应该阅读一些有关网络服务器如何工作的资源,您似乎错过了理解其工作原理的最重要部分 (2认同)
  • @DeepBlue **正如我已经说过3次**:**你必须进行服务器端验证!**。您必须在 PHP 代码中检查是否允许用户写入该页面。如果没有打印出错误消息并且不执行任何操作 (2认同)

小智 4

你的担心是对的,不要相信客户。曾经。

在您的示例中,您应该在发布文章之前验证用户,例如:

if( isset($_POST["SubmitArticle"]) ){
    $pageID = $_POST["targetPage"];
    $text = $_POST["articleText"];

    if( $user->id == $page->userID ){
      PublishArticle( $pageID , $text );
    }
}
Run Code Online (Sandbox Code Playgroud)

不要停在那里

此外,您不应相信客户端会向您发送有效的文章文本和页面 ID。它可能是 SQL 注入、恶意 JavaScript、分页 html 等。您还需要清理您的输入。