V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  h0099  ›  全部回复第 7 页 / 共 9 页
回复总数  166
1  2  3  4  5  6  7  8  9  
2023-01-12 20:13:27 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
另外对于搜索标签这种类似 https://www.v2ex.com/t/900089 的场景
我合理怀疑您现在是直接把每个 item 所具有的 tags 直接序列化后存在 item record 的某个 field 中
就好比 item1 有 3 个 tags:a 和 b 和 c ,那么您直接把这仨 abc 拼在一起变成`a,b,c`然后作为这个 item 在数据库行( record )中的一个列( field )的值

从关系代数的角度看,这是违反 1NF https://en.wikipedia.org/wiki/First_normal_form 的,因为您没有将符合一对多关系的 item->tags 关系给拆出单独的 item-tag 中间表

而为了 1NF 您需要建立 `表述所有可能存在的 tag 表` 和 `表述所有 item 与 tag 的一对多关系的表`
前者我假设您已经有了

后者就是一个只有两个字段的表:itemId 和 tagId ,同时 UNIQUE 约束建立在这两个字段上(因为对于单个 item 不应该具有多个完全相同的 tags ,除非这也是您的需求)
把关系数据填充进这个表之后
想要查询某个 item 有哪些 tag 只需要`SELECT tagId FROM 这个表 WHERE itemId = 您要查的 item`
想要查询某个 tag 下有哪些 item 只需要`SELECT itemId FROM 这个表 WHERE tagId = 您要查的 tag`
2023-01-12 20:01:59 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#41 @yezheyu 阁下又凭什么假定浏览器内部实现这些 dom event 时写的是 js 代码用的是 js object ?
什么又叫“区别于一般的任务”?什么是您所说任务?

我已于#38 解释
> 那为啥 button 点击事件的回调函数中 this 会指向事件的触发对象 button 呢?而不是 window ?

您可以理解为有一个`buttonClickCallback.call(buttomElement, clickEvent)`的 js 被执行
您也可以自己执行这个`.call(buttomElement)`,同样会改变回调(只要不是用 arrow fun 语法声明的)的 this 为 button
2023-01-12 19:59:54 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#40 @Al0rid4l 不过也不是什么很难的东西, 规则就一句话的事
一句话解释 js 的奇妙深刻 this:
函数的闭包作用域是在声明时从声明处的词法作用域向上捕获所有会被函数引用到以及不论是否用到都捕获的 this 的上下文符号集合。对于使用 function()语法声明的函数,允许使用.bind/apply/call(thisArg)来重新定义该函数闭包作用域中的 this 指向,但对于 arrow fun 语法() => {}则不允许(因此 arrow fun 的 this 指向是 immutable 的)

这就像一句话解释 monad:
单子是自函子范畴上的幺半群
一样的正确但又令萌新完全听不懂
如同 https://www.v2ex.com/t/900380
2023-01-12 19:56:22 +08:00
回复了 horou 创建的主题 程序员 关于 sql 拼接和 sql 注入的问题
#10 @wtfedc ASCII 0x39 不是`9`吗,纯数字有啥风险?
#12 @IvanLi127 prepared statement 也不是银弹:
https://www.v2ex.com/t/908249#reply15
> phppdo/jdbc/dbdriver 层提供的 prepated statment 不是银弹,无脑 escape 掉用户输入中的所有 sql 语法所使用的特殊字符也不是银弹:phpdelusions.net/pdo/sql_injection_example#escaping

`请不要在每一个回复中都包括外链,这看起来像是在 spamming`
2023-01-12 19:55:01 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
让我康康您的
- 表结构( SHOW CREATE TABLE )
- 执行的 SQL
- `EXPLAIN SQL`结果
不然您说这么多也都是模糊的
2023-01-12 19:52:31 +08:00
回复了 horou 创建的主题 程序员 关于 sql 拼接和 sql 注入的问题
@ragnaroks 这是使用大多数 orm 附带的 query builder 来构造您要查询的各个 clause 组成,最后由 query builder 来把他们变成 rawsql ,只要您不给 query builder 传入 raw 部分( query builder 通常会把所有是字符串的都作为 prepared statement 的插值参数),如`selectRaw(用户输入)`那就是安全的
2023-01-12 19:49:45 +08:00
回复了 horou 创建的主题 程序员 关于 sql 拼接和 sql 注入的问题
#8 @xuanbg 对于 ORDER BY `{用户输入}`
提供 someExistingField`; SELECT *, otherFieldExistsInSecretTable FROM `secretTable
执行 ORDER BY `someExistingField`; SELECT *, otherFieldExistsInSecretTable FROM `secretTable`
您的 secretTable 又被读出来了
2023-01-12 19:46:32 +08:00
回复了 Jamy 创建的主题 Linux 如何给 sh -c "echo $1,$2" 传递参数。
那您 c 写的 shc 解密程序里不也有 aes 加密时的密钥吗?您在同一个机器上加密又解密一坨 bash 字符串有啥意义?
除非您是在执行别人发给您的 bash ,而为了信任对方发送的 bash 的确是他亲自发的所以套了层 GPG
2023-01-12 18:05:51 +08:00
回复了 GGGG430 创建的主题 MySQL sql 中包含特殊字符问题
#11 @bjhc 回顾经典之把 UGC 图片的 blob 二进制全塞数据库里存然后每次获取图片都去查表

#12 @sadfQED2 phppdo/jdbc/dbdriver 层提供的 prepated statment 不是银弹,无脑 escape 掉用户输入中的所有 sql 语法所使用的特殊字符也不是银弹: https://phpdelusions.net/pdo/sql_injection_example#escaping
2023-01-12 18:02:01 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
#11 @shendaowu 既然阁下能够修改您要跑的程序的源码,那为什么不打开 https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html 看看哪些 sql 超级耗时然后 EXPLAIN https://dev.mysql.com/doc/refman/8.0/en/using-explain.html 他看看如何针对这个 sql 优化?
当然这样一个个去 tuning 可能太慢了
最省事也不需要改数据库表结构的方法就是#6 @Features 所说的单独开 replicate mysqld 从而实现您的`分三档,不太消耗资源的这类 SQL 语句立即同步执行,中等的异步限制资源执行,太消耗资源的就只能下半夜不限制资源执行`
但这仍然知道到底哪些 sql 查起来耗时,然后修改源码让这些 sql 去优先级低被各种限制使用系统资源了的 replicate mysqld 上执行
#3 @chnwillliu > 安卓系统自带的 webview 都是可以单独更新的
需要翻墙去 google play 才能获取更新
有些国产 ROM 偶尔也会推送 android webview 的更新,但您敢安装吗?
2023-01-12 17:55:13 +08:00
回复了 bronana 创建的主题 NGINX 想请教大家 nginx 如何判断 server_name
#5 @bronana 您忘了配置 https 版本以及监听 443 端口的 default listen ,我猜您现在执行
`curl -v -I 'Host: example.com' https://您的服务器 ip`
又会进入最初的`return 301 https://$host$request_uri`

#4 对此早有预言
> 一个常见错误是只设置了 port80 的 default server ,导致使用 http 或 https 协议请求 443 (或其他)端口时仍然会绕过 default server (因为 default 是针对单个 listen 端口的)
2023-01-12 17:52:40 +08:00
回复了 bronana 创建的主题 NGINX 想请教大家 nginx 如何判断 server_name
#4 @ETiV listen directive 必须加 default 修饰,不然按照 nginx 的脑瘫逻辑,他只会将他读到的所有 conf 文件中第一个出现的 listen 作为 default

#3
如果您所有的 nginx.conf 文件中只有这一个 server block 那么文档
http://nginx.org/en/docs/http/request_processing.html 对此早有预言
> If its value does not match any server name, or the request does not contain this header field at all, then nginx will route the request to the default server for this port. In the configuration above, the default server is the first one — which is nginx’s standard default behaviour
2023-01-12 17:50:41 +08:00
回复了 KC35 创建的主题 程序员 突然好奇,消除歌曲中的人声技术上是怎么实现的?
2023-01-12 17:46:31 +08:00
回复了 horou 创建的主题 程序员 关于 sql 拼接和 sql 注入的问题
#5 @xuanbg 允许用户输入'和`意味着他可以逃出您亲自写的'和`包裹
例如执行 sql "SELECT `{用户输入}` FROM table"
这里的用户输入可以是"someFieldExistsInTable`, (SELECT * FROM secretTable), `anotherFieldExistsInTable"
导致实际执行的是"SELECT `someFieldExistsInTable`, (SELECT * FROM secretTable), `anotherFieldExistsInTable` FROM table",于是 secretTable 就也被读出来了

'同理
2023-01-12 17:35:56 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
https://stackoverflow.com/questions/33308121/can-you-bind-this-in-an-arrow-function 的第一个回答进一步指出:
> You cannot rebind this in an arrow function. It will always be defined as the context in which it was defined. If you require this to be meaningful you should use a normal function.
> From the ECMAScript 2015 Spec: http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions-runtime-semantics-evaluation
> > Any reference to arguments, super, this, or new.target within an ArrowFunction must resolve to a binding in a lexically enclosing environment. Typically this will be the Function Environment of an immediately enclosing function.

如果您能解释下图中的所有行为,那您就已经理解 js 的两种函数声明语法所带来的截然不同的 this 上下文作用域捕获进闭包罪恶行径了
https://i.imgur.com/LADQMDz.png
2023-01-12 17:28:26 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#36 @yezheyu this 到底指向什么恶俗玩意跟异步同步毫无关系,他完完全全是由显式的.bind/apply/call 或隐式的闭包上下文捕获决定的

- 显式的.bind/apply/call:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
的第一个参数 thisArg 就可以改变任何函数的 this 指向

- 隐式的闭包上下文捕获:
完整的 function ()语法`function () {}`(不论匿名还是具名)会从他的声明处寻找 this 指向,然后把自身的 this 指向声明处上级(本级是正在声明的 fun 自身)的 this
从声明处而不是执行处上下文获得 this 捕获进闭包的证明:
https://i.imgur.com/YPkI1r9.png
`b.call({a:1})`将 arrow fun`b`的 this 修改为了一个`{a:1}` object ,但其 return 的会从上下文捕获 this 的 function()语法的回调函数的 this 并没有跟着变成{a:1},而仍然是最初声明 b 时从 b 那捕获的 this=window ( b 又从 global scope 那捕获了 this=window )
即便把 b 改成 function()语法也不影响:
https://i.imgur.com/rFnSyfT.png

而 arrow fun 语法`() => {}`不会进行任何从上下文中捕获 this 的罪恶行径,也无法通过.bind/apply/call 来在声明后再次显式修改他内部的 this 指向,可以说 arrow fun 就根本没有 this
https://i.imgur.com/2yrghsH.png

> 那为啥 button 点击事件的回调函数中 this 会指向事件的触发对象 button 呢?而不是 window ?

您可以理解为有一个`buttonClickCallback.call(buttomElement, clickEvent)`的 js 被执行
您也可以自己执行这个`.call(buttomElement)`,同样会改变回调(只要不是用 arrow fun 语法声明的)的 this 为 button
2023-01-12 17:14:15 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#35 @Al0rid4l 估计他感觉到的`阻塞主线程`是发生在`XHR 下载图片二进制数据`之后的`再自行处理`阶段
#23 @h0099 对此早有预言:
> 对于下载好的资源,你怎么处理,就算只是打印一下,也必须让主线程处理。

如果阁下所说的`打印一下`是指`console.log(await(await fetch('https://www.v2ex.com')).text())`这样的 js 代码,那么 network thread 当然会把 response body 传回给 js thread 从而作为您所调用的的`Response.text()`返回的 promise 的 reslove 值
2023-01-12 04:25:58 +08:00
回复了 bronana 创建的主题 NGINX 想请教大家 nginx 如何判断 server_name
首先 if is evil https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
我想阁下现在遇到的问题是请求任何`非`列出来的这些子域时(例如`curl -I `Host: example.com` -v http://您的服务端 IP`)仍然会匹配这个 block 导致进入`return 301 https://$host$request_uri`
如果您所有的 nginx.conf 文件中只有这一个 server block 那么文档 http://nginx.org/en/docs/http/request_processing.html 对此早有预言
> If its value does not match any server name, or the request does not contain this header field at all, then nginx will route the request to the default server for this port. In the configuration above, the default server is the first one — which is nginx’s standard default behaviour

要想在 80 和 443 上搭建正确的 default http(s) server 您可以参考 https://serverfault.com/questions/847978/best-practice-to-handle-default-server-and-public-ip-in-nginx
一个常见错误是只设置了 port80 的 default server ,导致使用 http 或 https 协议请求 443 (或其他)端口时仍然会绕过 default server (因为 default 是针对单个 listen 端口的)
http://nginx.org/en/docs/http/ngx_http_core_module.html#listen 进一步指出:
> The default_server parameter, if present, will cause the server to become the default server for the specified address:port pair. If none of the directives have the default_server parameter then the first server with the address:port pair will be the default server for this pair.

```nginx
server {
listen 80 fastopen=256 default_server;
listen 443 fastopen=256 ssl default_server;
server_name _ "";
access_log path/to/log/default.access.log;
error_log path/to/log/default.error.log;

ssl_certificate /etc/nginx/snippets/self-signed-ssl.crt; # 使用 openssl 生成的自签名证书 https://stackoverflow.com/questions/10175812/how-to-generate-a-self-signed-ssl-certificate-using-openssl
ssl_certificate_key /etc/nginx/snippets/self-signed-ssl.key;

return 444; # https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return The non-standard code 444 closes a connection without sending a response header. https://www.reddit.com/r/Network/comments/e8aveo/nginx_explain_http_444_like_im_five/
}
2023-01-12 00:53:43 +08:00
回复了 zhengjian 创建的主题 信息安全 请帮忙测试这个帖子中的 XSS 是否有效
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4922 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 20ms · UTC 09:50 · PVG 17:50 · LAX 01:50 · JFK 04:50
Developed with CodeLauncher
♥ Do have faith in what you're doing.