PHP中该怎样防止SQL注入?_PHP
SQL注入
问题描述:
如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子:
<ol class="dp-sql"> <li class="alt"><span><span>$unsafe_variable = <h2 id="问题描述">问题描述:</h2> <p>如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子:</p> <pre class="brush:php;toolbar:false">___FCKpd___0
因为用户的输入可能是这样的:
<ol class="dp-sql"><li class="alt"><span><span>value'); </span><span class="keyword">DROP</span><span> </span><span class="keyword">TABLE</span><span> </span><span class="keyword">table</span><span>;</span><span class="comment">--</span><span> </span></span></li></ol>
那么SQL查询将变成如下:
<ol class="dp-sql"><li class="alt"><span><span class="keyword">INSERT</span><span> </span><span class="keyword">INTO</span><span> `</span><span class="keyword">table</span><span>` (`</span><span class="keyword">column</span><span>`) </span><span class="keyword">VALUES</span><span>(</span><span class="string">'value'</span><span>); </span><span class="keyword">DROP</span><span> </span><span class="keyword">TABLE</span><span> </span><span class="keyword">table</span><span>;</span><span class="comment">--')</span><span> </span></span></li></ol>
应该采取哪些有效的方法来防止SQL注入?
最佳回答(来自Theo):
使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。 你有两种选择来实现该方法:
1、使用PDO:
<ol class="dp-sql"> <li class="alt"><span><span>$stmt = $pdo-></span><span class="keyword">prepare</span><span>(</span><span class="string">'SELECT * FROM employees WHERE name = :name'</span><span>); </span></span></li> <li><span> </span></li> <li class="alt"> <span>$stmt-></span><span class="keyword">execute</span><span>(array(</span><span class="string">'name'</span><span> => $</span><span class="keyword">name</span><span>)); </span> </li> <li><span> </span></li> <li class="alt"> <span>foreach ($stmt </span><span class="keyword">as</span><span> $row) { </span> </li> <li> <span> // do something </span><span class="keyword">with</span><span> $row </span> </li> <li class="alt"><span>} </span></li> </ol>
2、使用mysqli:
<ol class="dp-sql"> <li class="alt"><span><span>$stmt = $dbConnection-></span><span class="keyword">prepare</span><span>(</span><span class="string">'SELECT * FROM employees WHERE name = ?'</span><span>); </span></span></li> <li> <span>$stmt->bind_param(</span><span class="string">'s'</span><span>, $</span><span class="keyword">name</span><span>); </span> </li> <li class="alt"><span> </span></li> <li> <span>$stmt-></span><span class="keyword">execute</span><span>(); </span> </li> <li class="alt"><span> </span></li> <li><span>$result = $stmt->get_result(); </span></li> <li class="alt"><span>while ($row = $result->fetch_assoc()) { </span></li> <li> <span> // do something </span><span class="keyword">with</span><span> $row </span> </li> <li class="alt"><span>} </span></li> </ol>
PDO
注意,在默认情况使用PDO并没有让MySQL数据库执行真正的预处理语句(原因见下文)。为了解决这个问题,你应该禁止PDO模拟预处理语句。一个正确使用PDO创建数据库连接的例子如下:
<ol class="dp-sql"> <li class="alt"><span><span>$dbConnection = new PDO(</span><span class="string">'mysql:dbname=dbtest;host=127.0.0.1;charset=utf8'</span><span>, </span><span class="string">'user'</span><span>, </span><span class="string">'pass'</span><span>); </span></span></li> <li><span> </span></li> <li class="alt"> <span>$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, </span><span class="keyword">false</span><span>); </span> </li> <li><span>$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); </span></li> </ol>
在上面的例子中,报错模式(ATTR_ERRMODE)并不是必须的,但建议加上它。这样,当发生致命错误(Fatal Error)时,脚本就不会停止运行,而是给了程序员一个捕获PDOExceptions的机会,以便对错误进行妥善处理。 然而,第一个setAttribute()调用是必须的,它禁止PDO模拟预处理语句,而使用真正的预处理语句,即有MySQL执行预处理语句。这能确保语句和参数在发送给MySQL之前没有被PHP处理过,这将使得攻击者无法注入恶意SQL。了解原因,可参考这篇博文:PDO防注入原理分析以及使用PDO的注意事项。 注意在老版本的PHP(silently ignored the charset parameter。
解析
当你将SQL语句发送给数据库服务器进行预处理和解析时发生了什么?通过指定占位符(一个?或者一个上面例子中命名的 :name),告诉数据库引擎你想在哪里进行过滤。当你调用execute的时候,预处理语句将会与你指定的参数值结合。 关键点就在这里:参数的值是和经过解析的SQL语句结合到一起,而不是SQL字符串。SQL注入是通过触发脚本在构造SQL语句时包含恶意的字符串。所以,通过将SQL语句和参数分开,你防止了SQL注入的风险。任何你发送的参数的值都将被当作普通字符串,而不会被数据库服务器解析。回到上面的例子,如果$name变量的值为 ’Sarah’; DELETE FROM employees ,那么实际的查询将是在 employees 中查找 name 字段值为 ’Sarah’; DELETE FROM employees 的记录。 另一个使用预处理语句的好处是:如果你在同一次数据库连接会话中执行同样的语句许多次,它将只被解析一次,这可以提升一点执行速度。 如果你想问插入该如何做,请看下面这个例子(使用PDO):
<ol class="dp-sql"> <li class="alt"><span><span>$preparedStatement = $db-></span><span class="keyword">prepare</span><span>(</span><span class="string">'INSERT INTO table (column) VALUES (:column)'</span><span>); </span></span></li> <li><span> </span></li> <li class="alt"> <span>$preparedStatement-></span><span class="keyword">execute</span><span>(array(</span><span class="string">'column'</span><span> => $unsafeValue)); </span> </li> </ol>
因为用户的输入可能是这样的:
___FCKpd___1
那么SQL查询将变成如下:
___FCKpd___2
应该采取哪些有效的方法来防止SQL注入?
最佳回答(来自Theo):
使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。 你有两种选择来实现该方法:
1、使用PDO:
___FCKpd___3
2、使用mysqli:
___FCKpd___4
PDO
注意,在默认情况使用PDO并没有让MySQL数据库执行真正的预处理语句(原因见下文)。为了解决这个问题,你应该禁止PDO模拟预处理语句。一个正确使用PDO创建数据库连接的例子如下:
___FCKpd___5
在上面的例子中,报错模式(ATTR_ERRMODE)并不是必须的,但建议加上它。这样,当发生致命错误(Fatal Error)时,脚本就不会停止运行,而是给了程序员一个捕获PDOExceptions的机会,以便对错误进行妥善处理。 然而,第一个setAttribute()调用是必须的,它禁止PDO模拟预处理语句,而使用真正的预处理语句,即有MySQL执行预处理语句。这能确保语句和参数在发送给MySQL之前没有被PHP处理过,这将使得攻击者无法注入恶意SQL。了解原因,可参考这篇博文:PDO防注入原理分析以及使用PDO的注意事项。 注意在老版本的PHP(silently ignored the charset parameter。
解析
当你将SQL语句发送给数据库服务器进行预处理和解析时发生了什么?通过指定占位符(一个?或者一个上面例子中命名的 :name),告诉数据库引擎你想在哪里进行过滤。当你调用execute的时候,预处理语句将会与你指定的参数值结合。 关键点就在这里:参数的值是和经过解析的SQL语句结合到一起,而不是SQL字符串。SQL注入是通过触发脚本在构造SQL语句时包含恶意的字符串。所以,通过将SQL语句和参数分开,你防止了SQL注入的风险。任何你发送的参数的值都将被当作普通字符串,而不会被数据库服务器解析。回到上面的例子,如果$name变量的值为 ’Sarah’; DELETE FROM employees ,那么实际的查询将是在 employees 中查找 name 字段值为 ’Sarah’; DELETE FROM employees 的记录。 另一个使用预处理语句的好处是:如果你在同一次数据库连接会话中执行同样的语句许多次,它将只被解析一次,这可以提升一点执行速度。 如果你想问插入该如何做,请看下面这个例子(使用PDO):
___FCKpd___6

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Gambaran Keseluruhan Prakata 0x01 Editor menemui satu lagi limpahan data Berganda dalam MySQL. Apabila kita mendapat fungsi dalam MySQL, editor lebih berminat dengan fungsi matematik Ia juga harus mengandungi beberapa jenis data untuk menyimpan nilai. Jadi editor berlari untuk menguji untuk melihat fungsi mana yang akan menyebabkan ralat limpahan. Kemudian editor mendapati bahawa apabila nilai yang lebih besar daripada 709 diluluskan, fungsi exp() akan menyebabkan ralat limpahan. mysql>selectexp(709);+----------------------+|exp(709)|+---------- - -----------+|8.218407461554972

Nginx ialah pelayan web yang pantas, berprestasi tinggi, berskala, dan keselamatannya merupakan isu yang tidak boleh diabaikan dalam pembangunan aplikasi web. Terutamanya serangan suntikan SQL, yang boleh menyebabkan kerosakan besar pada aplikasi web. Dalam artikel ini, kami akan membincangkan cara menggunakan Nginx untuk menghalang serangan suntikan SQL untuk melindungi keselamatan aplikasi web. Apakah serangan suntikan SQL? Serangan suntikan SQL ialah kaedah serangan yang mengeksploitasi kelemahan dalam aplikasi web. Penyerang boleh menyuntik kod hasad ke dalam aplikasi web

Petua Pengaturcaraan PHP: Cara Mencegah Serangan Suntikan SQL Keselamatan adalah penting apabila melakukan operasi pangkalan data. Serangan suntikan SQL ialah serangan rangkaian biasa yang mengeksploitasi pengendalian input pengguna yang tidak betul oleh aplikasi, mengakibatkan kod SQL berniat jahat dimasukkan dan dilaksanakan. Untuk melindungi aplikasi kami daripada serangan suntikan SQL, kami perlu mengambil beberapa langkah berjaga-jaga. Gunakan pertanyaan berparameter Pertanyaan berparameter ialah cara paling asas dan paling berkesan untuk menghalang serangan suntikan SQL. Ia berfungsi dengan membandingkan nilai yang dimasukkan pengguna dengan pertanyaan SQL

Gambaran keseluruhan pengesanan dan pembaikan kelemahan suntikan SQL PHP: Suntikan SQL merujuk kepada kaedah serangan di mana penyerang menggunakan aplikasi web untuk menyuntik kod SQL secara berniat jahat ke dalam input. PHP, sebagai bahasa skrip yang digunakan secara meluas dalam pembangunan web, digunakan secara meluas untuk membangunkan laman web dan aplikasi dinamik. Walau bagaimanapun, disebabkan fleksibiliti dan kemudahan penggunaan PHP, pembangun sering mengabaikan keselamatan, mengakibatkan kewujudan kelemahan suntikan SQL. Artikel ini akan memperkenalkan cara untuk mengesan dan membetulkan kelemahan suntikan SQL dalam PHP dan memberikan contoh kod yang berkaitan. semak

Dalam bidang keselamatan rangkaian, serangan suntikan SQL adalah kaedah serangan biasa. Ia mengeksploitasi kod berniat jahat yang diserahkan oleh pengguna berniat jahat untuk mengubah tingkah laku aplikasi untuk melaksanakan operasi yang tidak selamat. Serangan suntikan SQL biasa termasuk operasi pertanyaan, operasi sisipan dan operasi padam. Antaranya, operasi pertanyaan adalah yang paling kerap diserang, dan kaedah biasa untuk menghalang serangan suntikan SQL ialah menggunakan PHP. PHP ialah bahasa skrip sebelah pelayan yang biasa digunakan yang digunakan secara meluas dalam aplikasi web. PHP boleh dikaitkan dengan MySQL dll.

Nota Pembangunan Laravel: Kaedah dan Teknik untuk Mencegah SQL Injection Dengan perkembangan Internet dan kemajuan teknologi komputer yang berterusan, pembangunan aplikasi web telah menjadi semakin biasa. Semasa proses pembangunan, keselamatan sentiasa menjadi isu penting yang tidak boleh diabaikan oleh pembangun. Antaranya, mencegah serangan suntikan SQL adalah salah satu isu keselamatan yang memerlukan perhatian khusus semasa proses pembangunan. Artikel ini akan memperkenalkan beberapa kaedah dan teknik yang biasa digunakan dalam pembangunan Laravel untuk membantu pembangun mencegah suntikan SQL dengan berkesan. Menggunakan pengikatan parameter Pengikatan parameter ialah Lar

Penapisan bentuk PHP: Pencegahan dan penapisan suntikan SQL Pengenalan: Dengan perkembangan pesat Internet, pembangunan aplikasi Web telah menjadi semakin biasa. Dalam pembangunan web, borang adalah salah satu cara interaksi pengguna yang paling biasa. Walau bagaimanapun, terdapat risiko keselamatan dalam pemprosesan data penyerahan borang. Antaranya, salah satu risiko yang paling biasa ialah serangan suntikan SQL. Serangan suntikan SQL ialah kaedah serangan yang menggunakan aplikasi web untuk mengendalikan data input pengguna secara tidak betul, membolehkan penyerang melakukan pertanyaan pangkalan data yang tidak dibenarkan. Penyerang melepasi

Suntikan SQL ialah kaedah serangan rangkaian biasa yang menggunakan pemprosesan data input aplikasi yang tidak sempurna untuk berjaya menyuntik pernyataan SQL yang berniat jahat ke dalam pangkalan data. Kaedah serangan ini amat biasa dalam aplikasi yang dibangunkan menggunakan bahasa PHP, kerana pengendalian PHP terhadap input pengguna biasanya agak lemah. Artikel ini akan memperkenalkan beberapa strategi untuk menangani kelemahan suntikan SQL dan memberikan contoh kod PHP. Menggunakan kenyataan yang disediakan Kenyataan yang disediakan ialah cara yang disyorkan untuk mempertahankan diri daripada suntikan SQL. Ia menggunakan parameter mengikat untuk menggabungkan data input dengan
