如何在Node.js中进行URL编码?

448

我想对这个进行URL编码:

SELECT name FROM user WHERE uid = me() 

我需要下载一个模块才能实现这个功能吗?我已经有了request模块。


10
实际上,这是一条很滑的路,应该尽量避免。 - Alfred
29
你是否试图将SQL语句放入你的URL中?要小心SQL注入攻击! 将SQL暴露给用户通常是一个不好的想法,非常危险。 - Leonmax
5
看起来像是一个 FQL 查询。 - nikc.org
3
@Demi:不行吗?那会怎么样呢?即使每个 Stack Overflow 用户都有自己的数据库帐户,DBMS 权限也不够细粒度。告诉我在 Stack Overflow 的哪里可以看到直接传递 SQL 查询?唯一的例外是数据探索器,但那只是所有只读视图,而且肯定不会放在 URL 中。 - Lightness Races in Orbit
33
这个人可能在制作一个SQL验证工具,在这种情况下传递SQL命令是没有问题的。过于关注不回答问题和不给出好建议(最受欢迎的评论没有给出好建议,只是嘲笑了提问者)。 - Rafael Eyng
显示剩余3条评论
6个回答

803

你可以使用JavaScript的encodeURIComponent函数:

encodeURIComponent('select * from table where i()')

提供

'select%20*%20from%20table%20where%20i()'

102
为了方便访问者,是的... decodeURIComponent 是用来解码已编码的URI的。不客气。 - KyleFarris
3
谢谢!它帮助我使用NodeJS进行孟加拉语查询。 - Abid

150

你要找的是内置模块querystring

var querystring = require("querystring");
var result = querystring.stringify({query: "SELECT name FROM user WHERE uid = me()"});
console.log(result);
#prints 'query=SELECT%20name%20FROM%20user%20WHERE%20uid%20%3D%20me()'

5
在这种情况下,我们只能传递一个地图而不是一个字符串,因此如果参数是一个字符串,则在结果中将看不到任何内容。所以如果您有要编码的字符串,请使用encodeURIComponent()函数。 - Ankit Patial
4
这种方式更适合编码JSON对象并通过POST提交它们。 - Alex W
不包含单引号或双引号字符的字符串 - Jkarttunen

52

使用 querystringescape 函数,它会生成一个安全的 URL 字符串。

var escaped_str = require('querystring').escape('Photo on 30-11-12 at 8.09 AM #2.jpg');
console.log(escaped_str);
// prints 'Photo%20on%2030-11-12%20at%208.09%20AM%20%232.jpg'

1
这绝对是正确的函数;querystring.stringify()(在Nicolas的回答中)现在似乎返回一个空字符串。 - brandonscript
7
https://nodejs.org/api/querystring.html#querystring_querystring_escape_str 中写道:"querystring.escape() 方法被 querystring.stringify() 使用,通常不建议直接使用。" - Simon Hänisch

32

请注意,URI编码适用于查询部分,但不适用于域名。域名使用punycode进行编码。您需要使用类似URI.js这样的库在URI和IRI(国际化资源标识符)之间进行转换。

如果您计划稍后将字符串用作查询字符串,则此说明是正确的:

> encodeURIComponent("http://examplé.org/rosé?rosé=rosé")
'http%3A%2F%2Fexampl%C3%A9.org%2Fros%C3%A9%3Fros%C3%A9%3Dros%C3%A9'

如果您不想对ASCII字符如/:?进行转义,请使用encodeURI

> encodeURI("http://examplé.org/rosé?rosé=rosé")
'http://exampl%C3%A9.org/ros%C3%A9?ros%C3%A9=ros%C3%A9'

然而,对于其他用例,你可能需要使用uri-js代替:

> var URI = require("uri-js");
undefined
> URI.serialize(URI.parse("http://examplé.org/rosé?rosé=rosé"))
'http://xn--exampl-gva.org/ros%C3%A9?ros%C3%A9=ros%C3%A9'

我不明白为什么第二个例子中添加了“xn--”。它不能作为URL使用,还是我漏掉了什么? - TOPKAT
1
请注意 http://examplé.org 中的第二个 "e" 不是 ASCII 字符,应该以 punnycode 的形式呈现。 - Jan aka uptech

19

encodeURIComponent(string) 就可以了:

encodeURIComponent("Robert'); DROP TABLE Students;--")
//>> "Robert')%3B%20DROP%20TABLE%20Students%3B--"

⚠️ 将 SQL 作为查询字符串传递可能并不是一个好计划:请看这个


4
我们称他为小博比·泰布尔斯 :-P - Jpnh

0

encodeURI

encodeURI() 方法用于编码完整的 URL。该方法会编码特殊字符,但不包括 ~!$&@#*()=:/,;?+

encodeURIComponent

如果要编码 URI 组件中的特殊字符,应使用 encodeURIComponent() 方法。该方法适用于编码 URL 组件,如查询字符串参数,而不是完整的 URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接