วิธีหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยวใน MySQL


100

ฉันจะแทรกค่าใน MySQL ที่ประกอบด้วยอัญประกาศเดี่ยวหรือคู่ได้อย่างไร กล่าวคือ

This is Ashok's Pen.

การอ้างเพียงครั้งเดียวจะสร้างปัญหา อาจมีอักขระ Escape อื่น ๆ

คุณใส่ข้อมูลอย่างถูกต้องได้อย่างไร?


นี่อาจเป็นการหลอกล่อตอกลงในฉันจะป้องกันการฉีด SQL ใน PHP ได้อย่างไร ...
Peter Mortensen

คำตอบ:


129

ใส่ค่อนข้างง่าย:

SELECT 'This is Ashok''s Pen.';

ดังนั้นภายในสตริงให้แทนที่เครื่องหมายคำพูดเดี่ยวแต่ละรายการด้วยสองคำพูด

หรือ:

SELECT 'This is Ashok\'s Pen.'

หนีมัน =)


9
คุณอาจต้องการอัปเดตโพสต์ของคุณเพื่อรวม mysql_real_escape_string () หรือ addlashes () เป็นวิธีแก้ปัญหาที่เป็นไปได้ ... ดังที่หนึ่งในความคิดเห็นด้านล่าง OP ระบุว่าพวกเขากำลังอ่านจากไฟล์และแทรก
James B

3
วิธีการ mysql_ * ไม่แนะนำให้ใช้ในอนาคตขณะที่มันถูกเลิกใช้
hd1

นั่นคือคำตอบที่ถูกต้องแม้ว่าวันนี้ทางเลือกที่ดีที่สุดคือการใช้
Ryan

นี่ใช้ได้สำหรับฉัน ขอบคุณมาก
Ariful Islam

10

'คืออักขระหลบหนี ดังนั้นสตริงของคุณควรเป็น:

นี่คือปากกาของ Ashok

หากคุณกำลังใช้โค้ดส่วนหน้าคุณต้องทำการแทนที่สตริงก่อนที่จะส่งข้อมูลไปยังโพรซีเดอร์ที่เก็บไว้

ตัวอย่างเช่นใน C # คุณสามารถทำได้

value = value.Replace("'", "''");

จากนั้นส่งค่าไปยังกระบวนงานที่เก็บไว้


ฉันไม่ได้ใส่ข้อมูลด้วยตนเองฉันดึงข้อมูลจากไฟล์และจะมี vaklues: ปากกาของ Ashok วิธีการใส่ creaetd ขั้นตอนการทำ.. วิธีทำให้ถูกต้อง
Ashok Gupta

FWIW minor nit: แบ็กสแลชคือ "อักขระหลีก"; ''(เครื่องหมายคำพูดเดี่ยวสองคำ) เป็นทางเลือกพิเศษที่อนุญาตสำหรับ "การหลีกเลี่ยง" อักขระอัญประกาศเดี่ยว
ToolmakerSteve

9

ดูคำตอบของฉันสำหรับ"วิธีการหลีกเลี่ยงอักขระใน MySQL"

ไม่ว่าคุณจะใช้ไลบรารีใดเพื่อพูดคุยกับ MySQL จะมีฟังก์ชัน Escape ในตัวเช่นใน PHP คุณสามารถใช้mysqli_real_escape_stringหรือPDO :: quote


1
ฉันไม่ได้แทรกข้อมูลด้วยตนเองฉันดึงข้อมูลจากไฟล์และจะมีค่า: ปากกาของ Ashok จะใส่ยังไง. สร้างขั้นตอนในการทำ.. วิธีทำให้ถูกต้อง.
Ashok Gupta

เพียงแค่ทราบ, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

7

หากคุณใช้งบที่เตรียมไว้คนขับจะจัดการกับการหลบหนีใด ๆ ตัวอย่างเช่น (Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();

7

ใช้รหัสนี้:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

วิธีนี้จะช่วยแก้ปัญหาของคุณเนื่องจากฐานข้อมูลไม่สามารถตรวจพบอักขระพิเศษของสตริงได้


1
เพียงแค่ทราบ, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

6

มีอีกวิธีหนึ่งในการดำเนินการนี้ซึ่งอาจปลอดภัยกว่าหรือไม่ก็ได้ขึ้นอยู่กับมุมมองของคุณ มันต้อง MySQL 5.6 FROM_BASE64หรือในภายหลังเนื่องจากการใช้ฟังก์ชั่นสตริงที่เฉพาะเจาะจงไปนี้:

สมมติว่าคุณมีข้อความนี้ที่ต้องการแทรก:

"อ๊ะ" นิคเกือบหัวขาดโบกมืออย่างสง่างาม "ไม่สำคัญเลย ... ... มันไม่เหมือนกับว่าฉันอยากจะเข้าร่วมจริงๆ ... ... คิดว่าจะสมัคร แต่ดูเหมือนว่าฉันไม่ทำตามข้อกำหนด '- "

คำพูดนั้นมีเครื่องหมายคำพูดเดี่ยวและคู่และจะเป็นความเจ็บปวดอย่างแท้จริงที่จะแทรกลงใน MySQL หากคุณกำลังแทรกสิ่งนั้นจากโปรแกรมมันเป็นเรื่องง่ายที่จะหลีกเลี่ยงเครื่องหมายคำพูด ฯลฯ แต่ถ้าคุณต้องใส่ลงในสคริปต์ SQL คุณจะต้องแก้ไขข้อความ (เพื่อหลีกเลี่ยงเครื่องหมายคำพูด) ซึ่งอาจเกิดข้อผิดพลาดได้ง่าย หรือไวต่อการตัดคำ ฯลฯ

คุณสามารถเข้ารหัสข้อความ Base64 แทนได้ดังนั้นคุณจึงมีสตริง "สะอาด":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

หมายเหตุบางประการเกี่ยวกับการเข้ารหัส Base64:

  1. การเข้ารหัส Base64 เป็นการเข้ารหัสไบนารีดังนั้นคุณควรตรวจสอบให้แน่ใจว่าชุดอักขระของคุณถูกต้องเมื่อคุณทำการเข้ารหัสเนื่องจาก MySQL จะถอดรหัสสตริงที่เข้ารหัส Base64 เป็นไบต์จากนั้นจึงแปลความหมายเหล่านั้น ตรวจสอบให้แน่ใจbase64และ MySQL ยอมรับว่าการเข้ารหัสอักขระคืออะไร (ฉันแนะนำ UTF-8)
  2. ฉันได้รวมสตริงไว้ที่ 50 คอลัมน์เพื่อให้สามารถอ่านได้ใน Stack Overflow คุณสามารถรวมเข้ากับคอลัมน์จำนวนเท่าใดก็ได้ที่คุณต้องการ (หรือไม่รวมเลย) และจะยังใช้งานได้

ตอนนี้เพื่อโหลดสิ่งนี้ลงใน MySQL:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

สิ่งนี้จะแทรกโดยไม่มีข้อร้องเรียนใด ๆ และคุณไม่จำเป็นต้องหลีกเลี่ยงข้อความใด ๆ ภายในสตริงด้วยตนเอง


5

คุณควรหลีกเลี่ยงอักขระพิเศษโดยใช้\อักขระ

This is Ashok's Pen.

กลายเป็น:

This is Ashok\'s Pen.


3

ใน PHP ใช้mysqli_real_escape_string

ตัวอย่างจากคู่มือ PHP:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>

3

หากคุณต้องการเก็บ(')เครื่องหมายวรรคตอนในฐานข้อมูลให้ใช้รหัสด้านล่างนี้:

$new_value = str_replace("'","\'", $value); 

$new_value สามารถจัดเก็บในฐานข้อมูล




0

สำหรับการเข้าถึงแบบเป็นโปรแกรมคุณสามารถใช้ตัวยึดตำแหน่งเพื่อหลีกเลี่ยงอักขระที่ไม่ปลอดภัยสำหรับคุณโดยอัตโนมัติ

ตัวอย่างเช่นใน Perl DBI คุณสามารถใช้:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 

0

ใช้ addlahes () หรือ mysql_real_escape_string ()


เพียงแค่ทราบ, This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

ใช่ต้องเพิ่มฉันตอนนี้ mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony

การอัปเดตคำตอบของคุณจะดีกว่า (เช่นความคิดเห็นอาจหายไปเมื่อใดก็ได้)
Peter Mortensen

0

วิธีที่ฉันทำโดยใช้ Delphi:

TheString สู่ "escape":

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

วิธีการแก้:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

ผลลัพธ์:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

ฟังก์ชันนี้จะแทนที่ Char (39) ทั้งหมดด้วย "\ '" เพื่อให้คุณสามารถแทรกหรืออัปเดตช่องข้อความใน MySQL ได้โดยไม่มีปัญหา

ฟังก์ชันที่คล้ายกันพบได้ในภาษาโปรแกรมทั้งหมด!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.