V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
fkzw
V2EX  ›  JavaScript

求助:有 PHP 函数可以计算出 js 的值吗?

  •  
  •   fkzw · 2017-01-11 17:19:57 +08:00 · 3328 次点击
    这是一个创建于 2875 天前的主题,其中的信息可能已经有所发展或是发生改变。

    var fid = $.sha1(String(((+!![]+[])-(![]+![])))+(((+!![]+[])+(![]+![]))-(+!![]+[]+[]))); js 中的式子,如何使用 php 函数计算出 fid 的值呢?

    22 条回复    2017-02-17 13:41:12 +08:00
    8qwe24657913
        1
    8qwe24657913  
       2017-01-11 17:32:23 +08:00 via Android   ❤️ 2
    bdbai
        2
    bdbai  
       2017-01-11 17:46:34 +08:00 via Android
    目测反爬虫机制,格式不变的话自己写解析器。或者直接用 Node.js , eval 一下就好。
    gouchaoer
        3
    gouchaoer  
       2017-01-11 19:29:27 +08:00 via Android
    v8js 并没有啥用,因为里面没有 dom , js 和 dom 绑定很厉害的
    ck65
        4
    ck65  
       2017-01-11 19:31:41 +08:00 via iPhone
    @gouchaoer 你在说什么。。?😂
    t6attack
        5
    t6attack  
       2017-01-11 19:44:48 +08:00
    @ck65 +1
    @gouchaoer 你在说什么。。?😂
    langmoe
        6
    langmoe  
       2017-01-11 20:28:56 +08:00
    dantegg
        7
    dantegg  
       2017-01-11 20:40:09 +08:00
    @gouchaoer 你在说什么?😂
    mingyun
        8
    mingyun  
       2017-01-11 20:55:04 +08:00 via Android
    这 js 代码。。。
    yzhen123
        9
    yzhen123  
       2017-01-12 04:37:10 +08:00 via Android
    为啥你们都取笑 @gouchaoer 我觉得说的很有可能有道理,$开头的一般就是 jquery ,单独在 node 下可能还真跑不了,虽然有 jsdom 这样的黑科技,但是真用起来还不知道得踩多少坑
    yzhen123
        10
    yzhen123  
       2017-01-12 04:37:50 +08:00 via Android
    推荐 phantomjs 还是王道
    AlloVince
        11
    AlloVince  
       2017-01-12 10:41:45 +08:00
    php -r 'echo sha1(exec("node -e '\''console.log(String(((+!![]+[])-(![]+![])))+(((+!![]+[])+(![]+![]))-(+!![]+[]+[])))'\''"));'
    fkzw
        12
    fkzw  
    OP
       2017-01-12 17:02:19 +08:00
    @bdbai 嗯 你说的对
    fkzw
        13
    fkzw  
    OP
       2017-01-12 17:02:59 +08:00
    @8qwe24657913 这个没研究过,回头看看
    fkzw
        14
    fkzw  
    OP
       2017-01-12 17:05:32 +08:00
    @langmoe 嗯 感谢。
    Balthild
        15
    Balthild  
       2017-01-12 17:16:00 +08:00
    @yzhen123 $.sha1() 換成其他 sha1 的 js 庫就行了,如果願意甚至可以直接用 php 的 sha1()
    fkzw
        16
    fkzw  
    OP
       2017-02-07 20:50:52 +08:00
    @Balthild 这个使用 php sha1 ()库应该怎么搞呢? 求大佬指点下。
    Balthild
        17
    Balthild  
       2017-02-09 12:39:32 +08:00
    @fkzw php 自带 sha1() 函数
    fkzw
        18
    fkzw  
    OP
       2017-02-09 14:29:35 +08:00
    @Balthild 使用 php sha1() 计算出来的结果是不正确的。

    js 的 sha1 函数 计算的结果是正确的, sha1 函数 如下,能否改写成 php 的 sha1 函数吗?

    function sha1 (str) {
    var hash
    try {
    var crypto = require('crypto')
    var sha1sum = crypto.createHash('sha1')
    sha1sum.update(str)
    hash = sha1sum.digest('hex')
    } catch (e) {
    hash = undefined
    }

    if (hash !== undefined) {
    return hash
    }

    var _rotLeft = function (n, s) {
    var t4 = (n << s) | (n >>> (32 - s))
    return t4
    }

    var _cvtHex = function (val) {
    var str = ''
    var i
    var v

    for (i = 7; i >= 0; i--) {
    v = (val >>> (i * 4)) & 0x0f
    str += v.toString(16)
    }
    return str
    }

    var blockstart
    var i, j
    var W = new Array(80)
    var H0 = 0x67452301
    var H1 = 0xEFCDAB89
    var H2 = 0x98BADCFE
    var H3 = 0x10325476
    var H4 = 0xC3D2E1F0
    var A, B, C, D, E
    var temp

    // utf8_encode
    str = unescape(encodeURIComponent(str))
    var strLen = str.length

    var wordArray = []
    for (i = 0; i < strLen - 3; i += 4) {
    j = str.charCodeAt(i) << 24 |
    str.charCodeAt(i + 1) << 16 |
    str.charCodeAt(i + 2) << 8 |
    str.charCodeAt(i + 3)
    wordArray.push(j)
    }

    switch (strLen % 4) {
    case 0:
    i = 0x080000000
    break
    case 1:
    i = str.charCodeAt(strLen - 1) << 24 | 0x0800000
    break
    case 2:
    i = str.charCodeAt(strLen - 2) << 24 | str.charCodeAt(strLen - 1) << 16 | 0x08000
    break
    case 3:
    i = str.charCodeAt(strLen - 3) << 24 |
    str.charCodeAt(strLen - 2) << 16 |
    str.charCodeAt(strLen - 1) <<
    8 | 0x80
    break
    }

    wordArray.push(i)

    while ((wordArray.length % 16) !== 14) {
    wordArray.push(0)
    }

    wordArray.push(strLen >>> 29)
    wordArray.push((strLen << 3) & 0x0ffffffff)

    for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) {
    for (i = 0; i < 16; i++) {
    W[i] = wordArray[blockstart + i]
    }
    for (i = 16; i <= 79; i++) {
    W[i] = _rotLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1)
    }

    A = H0
    B = H1
    C = H2
    D = H3
    E = H4

    for (i = 0; i <= 19; i++) {
    temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff
    E = D
    D = C
    C = _rotLeft(B, 30)
    B = A
    A = temp
    }

    for (i = 20; i <= 39; i++) {
    temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff
    E = D
    D = C
    C = _rotLeft(B, 30)
    B = A
    A = temp
    }

    for (i = 40; i <= 59; i++) {
    temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff
    E = D
    D = C
    C = _rotLeft(B, 30)
    B = A
    A = temp
    }

    for (i = 60; i <= 79; i++) {
    temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff
    E = D
    D = C
    C = _rotLeft(B, 30)
    B = A
    A = temp
    }

    H0 = (H0 + A) & 0x0ffffffff
    H1 = (H1 + B) & 0x0ffffffff
    H2 = (H2 + C) & 0x0ffffffff
    H3 = (H3 + D) & 0x0ffffffff
    H4 = (H4 + E) & 0x0ffffffff
    }

    temp = _cvtHex(H0) + _cvtHex(H1) + _cvtHex(H2) + _cvtHex(H3) + _cvtHex(H4)
    return temp.toLowerCase()
    }
    Balthild
        19
    Balthild  
       2017-02-11 15:17:35 +08:00
    @fkzw 简单地测试了一下:
    取字符串「 333917 」(本帖的 id )
    用 php 计算 sha1 结果为 af4ae87b322f76c430b579fcf8ca54aa886de62a
    用你提供的 js 函数(在 Chrome Console )计算 sha1 结果为 af4ae87b322f76c430b579fcf8ca54aa886de62a
    看不出哪里有错误……
    fkzw
        20
    fkzw  
    OP
       2017-02-17 09:23:36 +08:00
    @Balthild 是的,这两个函数是相等的。
    但是本贴的字符串“ String(((+!![]+[])-(![]+![])))+(((+!![]+[])+(![]+![]))-(+!![]+[]+[]))” 使用 php ,计算的结果,与 js 提供的函数计算的 sha1 值却不同。
    是不是得把 字符串 转换一下,这个地方有点疑问。求指点。
    Balthild
        21
    Balthild  
       2017-02-17 13:40:54 +08:00
    你先别计算 sha1 ,先看看传递给 sha1() 函数的字符串是否相等。
    Balthild
        22
    Balthild  
       2017-02-17 13:41:12 +08:00
    @Balthild #21 忘记 @fkzw
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1242 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:13 · PVG 02:13 · LAX 10:13 · JFK 13:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.