Jump to content
php.lv forumi

Bināru datu sūtīšana no Ajax POST


usver

Recommended Posts

Kā no klienta puses skripta var nosūtīt binārus datus uz serveri, izmantojot xmlhttprequest.send() vai analogu metodi?

Mēģinu nosūtīt binārus datus uz serveri, un tas daļēji arī sanāk - sūtīšana uzsākas ļoti veiksmīgi. Tikai sūtījums apraujas pie pirmā "\x00" simbola un ~50 baitu vietā tiek nosūtīti 17 baiti.

valīdam pieprasījumam būtu jāizskatās aptuveni šādi: http://217.199.116.182/bin.png

 

Tā kā serveris (https://tsa.e-me.lv/responder.eme) pieņem tikai un vienīgi bināru tekstu, tad diemžēl atkrīt tādi varianti kā base64_encode(), multipart/form-data un, iespējams, arī JSon, kas datus pa vidu pārveido. Tad nu meklēju metodi/bibliotēku, kas klienta pusē darbināmu Javascript/VBscript/JScript vai ActiveX kontrolu, lai varētu sūtīt binārus datus bez zudumiem. Iesakiet, lūdzu, risinājumu - tas var būt arī IE-only, pagaidām ar to pietiktu. :)

 

kods ir aptuveni šāds:

var url = "get_data.php";
var params = base64_decode(encoded); // te rodas bināri dati, kas tiešām arī ir bināri un nelasāmi
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/timestamp-query");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "Keep-alive");

http.onreadystatechange = function() {//Call a function when the state changes.
if(http.readyState == 4 && http.status == 200) {
	alert(http.responseText);
}
}
http.send(params);

Link to comment
Share on other sites

būs jāmēģina caur VBScript noteikt garumu stringam, jo piem alert( params ) izvada vienkārši īsu stringu, nevis garu 50burtīgu - apraujas javascript,domājot, ka pie pirmā \x00 jābeidzas saturam un uzskata, ka tālāk nekā nav. JS pusē laikam problēma līdz ar to.

Par parakstu - e-me vienkārši ir izdomājuši, ka pie viņiem drīkst vērsties tikai, autentificējoties ar e-paraksta smārtkarti un tikai tas cilvēks, kas grib kaut ko parakstīt. es nezinu iespēju, kā var piemānīt serveri, autentificējoties 3. personas vārdā, ja jāizmanto ar paroli aizsargāta privātā atslēga. līdz ar to PHP serveri, ko tādu mēģinot, sūta dillēs - "vai nu rādi šurp reālu e-parakstu, un mēs tevi atpazīsim, vai arī tinies!".

vot, tāda jocīga sistēma tur - tikai baitus gan varēja netaupīt un base64_encoded datu pieņemšanu uztaisīt - lai arī papildus mazliet slodze atkodējot, tomēr vismaz no visurienes tas pakalpojums izmantojams un datu zudumi novēršas.

Link to comment
Share on other sites

marcis: ar PHP protu nosūtīt - vienalga, ar curl, fsockopen() vai kaut vai wget izmantojot. tikpat labi varu sūtīt arī no Javas, to pastarpināti saucot ar PHP. Bet e-me visu sviež atpakaļ, ja vien HTTPS nav nodibināts ar derīgu Latvijas Pasta izdotu e-paraksta autentifikācijas sertifikātu. kuri glabājas tikai uz kartiņām un tikai klienta pusē.

 

normāli LP serveris un parastais klients apmainās ar publiskajām atslēgām + lietotājs paraksta datus ar savu privāto atslēgu. ja kaut kas no tā iztrūkst, tad LP serveris sūta dillēs.

Ja nebūtu šitās ņemtnes ar PIN aizsargātām atslēgām un HTTPS un viss ietu pa taisno no PHP, būtu kruta ;> bet viss ir sekjūri sataisīts, tik no Javaskripta tas ierobežojums, ka binārus datus no tā sūtīt kā stringu nav paredzēts :> skaic - tātad turpinu mēģināties ar VBscript izvirtībām.

Link to comment
Share on other sites

Bik patestējos. Ar trešo Firefoxi var šādi:

 

if (window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if (window.ActiveXObject)
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

xmlhttp.open("POST", 'ajax.test.get.php', true);
xmlhttp.onreadystatechange = ajax_status;
var data = String.fromCharCode(13) + String.fromCharCode(27) + String.fromCharCode(0) + String.fromCharCode(1) + String.fromCharCode(2);
xmlhttp.sendAsBinary(data);

 

Parasts send arī darbotos, ja norādītu

xmlhttp.setRequestHeader('Content-Length', data.length); // data.length=5

un tas suns (browseris), nepārrakstītu to Content-Length uz 2 (līdz String.fromCharCode(0))

Link to comment
Share on other sites

  • 3 weeks later...
×
×
  • Create New...