Как мне разобрать этот неформатированный список ответа ша-ключа? - PullRequest
1 голос
/ 14 апреля 2020

Я вызываю API-интерфейс haveibeenpwned для поиска префикса значения sha1 пароля, существующего в базе данных. (отправка формы связана с ajax вызовом скрипта php). Ответом являются все скомпрометированные пароли в sha1 с тем же префиксом, что и у моего пароля, а также их количество случаев.

Ответ выглядит следующим образом, без скобок и кавычек. Вы можете увидеть пример звонка здесь .

0084E2D508D46A4D5FDB509625EE9BE99CE:1
0159EB03D329C98DD0DF294CD5B9CA52854:2
02662E0A92868C8B65DBFC8764C9A54B646:2
03BBAEF4539EA59F8B0784E64323A3B8E9D:2
04B631308CABEB3038D04B0F114D699A022:6
0556B126AA9AF70D83EA0DD7FB6865A6338:1
05B2FBDE67E25293A020855683A12A8AEB6:2
05CCD00B8F9010E60CF6DA4E1E637EF7664:1
069836ADDB456322375224A6D2374D3309D:1
07402605745C387BEF36C2BC54619EC4573:2
07FB36570851A136481E6B8138AC4834484:2
0829F51F120B5F8B99D7AF00602053556BF:2
089BACBDF1C6214D69F1A3BDC20459D57EE:3
08EB1AA8F3C15FC70D6CD4B1F42C9462671:1
09EEFDDA1D7253593138B66DEA14911B7FA:6
0A1359437D05D0A06CA5C840A297A49EE3E:1
0A84D4E8D914D7A782A81838AD57142B352:1
0A9DAA8398558A5448C327E9621446955F1:2
0BA107CFAC7EE7222F7E23E05D2984B38DC:1

. Я могу выполнить поиск пароля в jquery или php. В jquery мне не повезло, когда я пытался преобразовать ответ в строку и использовал response.include (my_password_sha). Кроме того, установка типа контента: json в php, похоже, не нарушает работу сервера.

      curl_setopt($ch, CURLOPT_HTTPHEADER, array(
         'Content-Type: application/json',
     );

Вот javascript Я пытался заставить работать:

            success: function(response) { 
                console.log(response);

                console.log("pw checker responded");                
                var resp_str = response.toString();
                resp_str = resp_str.substring(40)

                var pw_sha = response.toString().substring(0,40);
                pw_sha = pw_sha.substring(7,35);

                if(resp_str.includes(pw_sha))
                { //fails to work
                    console.log("password compromised");
                }


            },

Вот php:

      $service_url = 'https://api.pwnedpasswords.com/range/42331';
      //$service_url = 'https://haveibeenpwned.com/range/aaf4c';


      $ch = curl_init ($service_url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt ($ch, CURLOPT_HTTPGET, true);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      $returndata = curl_exec ($ch);
      $status_code = @curl_getinfo($ch, CURLINFO_HTTP_CODE); 
      //print_r($status_code);

      //send back my key and the response
      echo $pw_sha." ";
      echo $returndata;

1 Ответ

0 голосов
/ 15 апреля 2020

Ответ, который вы получаете с сервера, представлен в виде простого текста, а возвращаемые данные представляют собой последовательность строк в форме

ppp : nnn

, где ppp - это хешированный пароль длиной 40 символов, а nnn - это число случаев.

Вы можете легко превратить этот ответ в ассоциативный массив в PHP, превратить массив в JSON и отправить обратно JSON закодированные данные во внешний интерфейс JavaScript:

$response = explode( "\n", $response );
$out = [];
foreach( $response as $r )
{
    $r = explode( ":", $r );
    $out[] = [ 'sha1' => $r[0], 'count' => $r[1] ];
}
$out = json_encode( $out );
echo $out;

Обратный вызов JavaScript AJAX success() получит декодированный объект, который можно легко проверить:

success: function(response) {
    var found,
        n,
        i;

    found = false;
    n = response.length;
    for( i = 0; i < n; i++ )
    {
        if( pw_sha1_to_check === response[i].sha1 )
        {
            found = true;
            break;
        }
    }

    if( found )
    {
        // `pw_sha1_to_check` was found in the list received as response
    }

Убедитесь, что при выполнении вызова AJAX с jQuery указано, что ожидается ответ JSON:

 $.ajax( {
     dataType: 'json',
     // ...
...