【发布时间】:2015-04-29 18:51:39
【问题描述】:
使用 Postgresql 9.3 得到错误:
select 'hjhjjjhjh'mnmnmnm'mn'
错误:
ERRO:“'mn'”中或旁边的语法错误
SQL 状态:42601
字符:26
我尝试将文本中的单引号替换为:
select REGEXP_REPLACE('hjhjjjhjh'mnmnmnm'mn', '\\''+', '''', 'g')
和
select '$$hjhjjjhjh'mnmnmnm'mn$$'
但它不起作用。
下面是真正的代码:
CREATE OR REPLACE FUNCTION generate_mallet_input2() RETURNS VOID AS $$
DECLARE
sch name;
r record;
BEGIN
FOR sch IN
select schema_name from information_schema.schemata where schema_name not in ('test','summary','public','pg_toast','pg_temp_1','pg_toast_temp_1','pg_catalog','information_schema')
LOOP
FOR r IN EXECUTE 'SELECT rp.id as id,g.classified as classif, concat(rp.summary,rp.description,string_agg(c.message, ''. '')) as mess
FROM ' || sch || '.report rp
INNER JOIN ' || sch || '.report_comment rc ON rp.id=rc.report_id
INNER JOIN ' || sch || '.comment c ON rc.comments_generatedid=c.generatedid
INNER JOIN ' || sch || '.gold_set g ON rp.id=g.key
WHERE g.classified = any (values(''BUG''),(''IMPROVEMENT''),(''REFACTORING''))
GROUP BY g.classified,rp.summary,rp.description,rp.id'
LOOP
IF r.classif = 'BUG' THEN
EXECUTE format('Copy( select REPLACE(''%s'', '''', '''''''') as m ) To ''/tmp/csv-temp/BUG/'|| quote_ident(sch) || '-' || r.id::text || '.txt ''',r.mess);
ELSIF r.classif = 'IMPROVEMENT' THEN
EXECUTE format('Copy( select REPLACE(''%s'', '''', '''''''') as m ) To ''/tmp/csv-temp/IMPROVEMENT/'|| quote_ident(sch) || '-' || r.id || '.txt '' ',r.mess);
ELSIF r.classif = 'REFACTORING' THEN
EXECUTE format('Copy( select REPLACE(''%s'', '''', '''''''') as m ) To ''/tmp/csv-temp/REFACTORING/'|| quote_ident(sch) || '-' || r.id || '.txt '' ',r.mess);
END IF;
END LOOP;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql STRICT;
select * FROM generate_mallet_input2();
错误:
错误:erro de sintaxe em ou próximo a "mailto" LINHA 1: ...e.http.impl.conn.SingleClientConnManager$
HTTPCLIENT-803)。
新的 SSLSocketFactory.connectSocket 方法使用 InetSocketAddress.getHostName() 参数调用 X509HostnameVerifier。当所选的IP地址具有反向查找名称时,将使用已解析的名称调用验证者,因此IP检查失败。
4.0版本检查原始IP /主机名,但无法使用新的ConnectSocket()完成。方法。
TestHostnameVerifier.java 仅检查 127.0.0.1/.2 并因此掩盖了问题,因为匹配的证书同时具有“localhost”和“127.0.0.1”,但实际上只有“localhost”匹配。使用 8.8.8.8 的测试用例会更好。我为不需要反向 DNS 查找的问题提交了一个稍微更好的解决方法。
Oleg。我不得不求助于一个相当丑陋的黑客来解决这个问题。更好的解决方案需要更改 X509HostnameVerifier API。我觉得 X509HostnameVerifier 接口的弃用是没有保证的,因为在证书中使用 CN 的 IP 地址本身就是一种黑客攻击。
请查看。
Oleg 。即使是第二个也需要服务器提供受信任的证书。我认为这两种情况没有太大区别。测试错误。尝试连接到https://93.62.162.60:8443/。证书的 CN=93.62.162.60,但检查的是 93-62-162-60.ip23.fastwebnet.it。嗯,我的评论并不是要恢复补丁。第一种情况已经可以利用,现在仍然可以利用。您的补丁是不破坏 API 的“正确”解决方案。
但为了避免任何安全问题(包括已经存在的问题),必须更改 API。我无法重现该问题。与远程对等方的 SSL 连接通过默认主机名验证。
---
执行 requestGET https://www.verisign.com/ HTTP/1.1
[DEBUG] SingleClientConnManager - 获取路由 HttpRoute 的连接[{ s}->https://www.verisign.com]
[DEBUG] DefaultClientConnectionOperator - 连接到www.verisign.com/69.58.181.89:443
[DEBUG] RequestAddCookies - 已选择 CookieSpec:最佳匹配
[DEBUG] DefaultHttpClient - 尝试执行 1 request
[DEBUG] DefaultClientConnection - 发送请求:GET / HTTP/1.1
[DEBUG] headers - >> GET / HTTP/1.1
[DEBUG] headers - >> Host: www.verisign.com
[DEBUG] 标头 - >> 连接:Keep-Alive
[DEBUG] 标头 - >> 用户代理:Apache-HttpClient/4.1 (java 1.5)
[DEBUG] DefaultClientConnection - 接收响应:HTTP/1.1 200 OK
[DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG] 标头 - [DEBUG ] ResponseProcessCookies - Cookie 接受:“[版本:0][名称:v1st][值:D732270AE4FC9F76][域:.verisign.com][路径:/][到期:2 月 19 日星期三 15:28:00 GMT+01: 00 2020]”。
[DEBUG] ResponseProcessCookies - Cookie 已接受:“[版本:0][名称:v1st][值:D732270AE4FC9F76][域:.verisign.com][路径:/][到期时间:2 月 19 日星期三 15:28: 00 GMT+01:00 2020]”。
[DEBUG] DefaultHttpClient - 连接可以保持活动 5000 MILLISECONDS
------------------------------- ---------
HTTP/1.1 200 OK
响应内容长度:-1
[DEBUG] SingleClientConnManager - 释放连接 org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter@ 15ad5c6
[调试] DefaultClientConnection - 连接关闭
---
您是否有机会使用自定义 SSL 套接字工厂?它是否实现了 LayeredSchemeSocketFactory 接口?
Oleg。很好的工作,很好的补丁,谢谢!嗯,我看了一下补丁。它应该可以解决问题(尽管不完全,因为反向查找可能会给出错误/无法解析的主机名),但正如您所说,这是一个粗略的黑客攻击,这会引发其他安全问题。不幸的是,干净的修复需要修改 API。
您说使用 IP 地址作为 CN 是一种黑客行为,但实际上将其用作 ipAddress SubjectAlternativeName 是完全有效的。
安全问题来自事实上,httpclient 尝试匹配 dns 生成的数据(反向查找,现在还解析了主机名),而不是用户实际键入的内容,从而导致 DNS 中毒或连接重定向攻击。
第一种情况:
- 用户想要连接到 1.2.3.4
- DNS 反向查找是 xxx.yyy.zzz
- 恶意代理将连接重定向到服务器 4.3.2.1
- 服务器证书包含设置为 xxx.yyy 的 CN 或 SAN。 zzz
- 一切正常(但不应该)
第二种情况:
- 用户想要连接到 xxx.yyy.zzz
- 被黑客入侵的 DNS 错误地将其解析为 1.2.3.4- 服务器证书的 CN 或 SAN 设置为 1.2.3.4
- 连接建立正常(但显然不应该)
。很公平。我将恢复补丁并以 WONTFIX
Oleg 的身份关闭问题。您描述的第一个场景还需要来自火星的绿人以及发送客户端信任的证书的恶意 4.3.2.1 服务器的参与才能实用。
Oleg', '', '''') as m) 到 '/tmp/csv-temp/BUG/httpclient-HTTPCLIENT-1051.txt' 上下文:函数 PL/pgSQL generate_mallet_input2() linha 31 em comando EXECUTE ********** 错误**********ERRO: erro de sintaxe em ou próximo a "mailto" SQL 状态:42601 上下文:函数 PL/pgSQL generate_mallet_input2() linha 31 em comando EXECUTE
检索到的内容是软件仓库中关于项目问题的长文本,该文本中可以有html。导致问题的原因是 HTML 引号。
【问题讨论】:
标签: sql database postgresql postgresql-9.3