Sut mae MySQL yn atal pigiad sql? Egwyddor pigiad SQL ac atal

MySQLSut i atal pigiad sql? Egwyddor pigiad SQL ac atal

MySQL a chwistrelliad SQL

Os ydych chi'n cymryd y data a gofnodwyd gan y defnyddiwr trwy dudalen we a'i fewnosod yn aCronfa ddata MySQL, yna efallai y bydd problemau diogelwch pigiad SQL.

Bydd y bennod hon yn cyflwyno sut i atal chwistrelliad SQL a hidlo'r cymeriadau sydd wedi'u chwistrellu yn SQL trwy sgriptiau.

Y chwistrelliad SQL fel y'i gelwir yw twyllo'r gweinydd i weithredu gorchmynion SQL maleisus trwy fewnosod gorchmynion SQL i'r ffurflen we i gyflwyno neu fewnbynnu llinyn ymholiad yr enw parth neu gais y dudalen.

Ni ddylem byth ymddiried mewn mewnbwn defnyddwyr, rhaid inni dybio bod data mewnbwn defnyddwyr yn anniogel, ac mae angen i ni i gyd hidlo data mewnbwn defnyddwyr.

Yn yr enghraifft ganlynol, rhaid i'r enw defnyddiwr a gofnodwyd fod yn gyfuniad o lythrennau, rhifau, a thanlinellau, a rhaid i'r enw defnyddiwr fod rhwng 8 ac 20 nod o hyd:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Gadewch i ni edrych ar y sefyllfa SQL sy'n digwydd pan na chaiff nodau arbennig eu hidlo:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Yn y datganiad pigiad uchod, ni wnaethom hidlo'r newidyn o $name, ac mae'r datganiad SQL nad oes ei angen arnom yn cael ei fewnosod yn $name, a fydd yn dileu'r holl ddata yn y tabl defnyddwyr.

mysqli_query() yn PHP ni chaniateir i weithredu datganiadau SQL lluosog, ond yn SQLite a PostgreSQL, gellir gweithredu datganiadau SQL lluosog ar yr un pryd, felly mae angen i ni wirio data'r defnyddwyr hyn yn llym.

Er mwyn atal pigiad SQL, mae angen inni dalu sylw i'r pwyntiau canlynol:

  • 1. Peidiwch byth ag ymddiried mewn mewnbwn defnyddwyr.Gwiriwch fewnbwn y defnyddiwr, gallwch ddefnyddio ymadroddion rheolaidd, neu gyfyngu ar yr hyd; trosi dyfyniadau sengl a dwbl "-", ac ati.
  • 2. Peidiwch byth â defnyddio sql cynulliad deinamig, gallwch ddefnyddio sql parameterized neu ddefnyddio gweithdrefnau storio yn uniongyrchol ar gyfer ymholiad data a mynediad.
  • 3. Peidiwch byth â defnyddio cysylltiadau cronfa ddata â breintiau gweinyddwr, defnyddiwch gysylltiadau cronfa ddata ar wahân gyda breintiau cyfyngedig ar gyfer pob cais.
  • 4. Peidiwch â storio gwybodaeth gyfrinachol yn uniongyrchol, amgryptio neu stwnsio cyfrineiriau a gwybodaeth sensitif.
  • 5. Dylai gwybodaeth eithriad y cais roi cyn lleied o awgrymiadau â phosibl, ac mae'n well defnyddio gwybodaeth gwall arferol i lapio'r wybodaeth wall wreiddiol
  • 6. Mae'r dull canfod chwistrelliad sql yn gyffredinol yn mabwysiadu cynorthwyol软件Neu'r llwyfan gwefan i ganfod, mae'r meddalwedd yn gyffredinol yn defnyddio'r offeryn canfod chwistrelliad sql jsky, ac mae gan lwyfan y wefan offeryn canfod platfform diogelwch gwefan Yisi. MDCSOFT SCAN et al.Gall defnyddio MDCSOFT-IPS amddiffyn yn effeithiol yn erbyn chwistrelliad SQL, ymosodiadau XSS, ac ati.

Atal Chwistrelliad SQL

Mewn ieithoedd sgriptio fel Perl a PHP gallwch ddianc rhag y data a gofnodwyd gan y defnyddiwr i atal chwistrelliad SQL.

Mae'r estyniad MySQL ar gyfer PHP yn darparu'r swyddogaeth mysqli_real_escape_string() i ddianc rhag nodau mewnbwn arbennig.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Chwistrellu mewn Datganiadau Tebyg

Wrth ymholi fel, os yw'r defnyddiwr yn mewnbynnu gwerthoedd gyda "_" a "%", bydd hyn yn digwydd: yn wreiddiol roedd y defnyddiwr eisiau cwestiynu "abcd_", ond mae canlyniadau'r ymholiad yn cynnwys "abcd_", "abcde", ac "abcdf " Etc.; mae'r broblem hefyd yn digwydd pan fo'r defnyddiwr eisiau cwestiynu "30%" (noder: tri deg y cant).

Yn y sgript PHP gallwn ddefnyddio'r swyddogaeth addcslashes() i drin y sefyllfa uchod, fel yn yr enghraifft ganlynol:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Mae'r ffwythiant addcslashes() yn ychwanegu slaes cyn y nod penodedig.

Fformat cystrawen:

addcslashes(string,characters)
参数disgrifiad
llinynAngenrheidiol.Yn pennu'r llinyn i'w wirio.
cymeriadauDewisol.Yn pennu'r nod neu'r ystod o nodau yr effeithir arnynt gan addcslashes().

Blog Chen Weiliang Gobeithio ( https://www.chenweiliang.com/ ) a rennir "Sut mae MySQL yn atal chwistrelliad sql? egwyddor pigiad sql ac atal", bydd yn eich helpu chi.

Croeso i chi rannu dolen yr erthygl hon:https://www.chenweiliang.com/cwl-500.html

Croeso i sianel Telegram o blog Chen Weiliang i gael y diweddariadau diweddaraf!

🔔 Byddwch y cyntaf i gael y "Canllaw Defnydd Offer AI Marchnata Cynnwys ChatGPT" gwerthfawr yng nghyfeiriadur uchaf y sianel! 🌟
📚 Mae'r canllaw hwn yn cynnwys gwerth enfawr, 🌟Mae hwn yn gyfle prin, peidiwch â'i golli! ⏰⌛💨
Rhannwch a hoffwch os hoffech chi!
Eich rhannu a'ch hoff bethau yw ein cymhelliant parhaus!

 

发表 评论

Ni fydd eich cyfeiriad e-bost yn cael ei gyhoeddi. 必填 项 已 用 * Label

sgroliwch i'r brig