Inhaltsverzeichnis
问题描述:
Theo):" >最佳回答(来自Theo):
解析
Heim Backend-Entwicklung PHP-Tutorial PHP中该怎样防止SQL注入?_PHP

PHP中该怎样防止SQL注入?_PHP

Jun 01, 2016 am 11:53 AM
sql注入

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
Nach dem Login kopieren

因为用户的输入可能是这样的:

<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>
Nach dem Login kopieren

那么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>
Nach dem Login kopieren

应该采取哪些有效的方法来防止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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

在上面的例子中,报错模式(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>
Nach dem Login kopieren
POST['user_input'];   
  •    
  • mysql_query("INSERT INTO `table` (`column`) VALUES ('" . $unsafe_variable . "')");   
  • 因为用户的输入可能是这样的:

    ___FCKpd___1
    Nach dem Login kopieren

    那么SQL查询将变成如下:

    ___FCKpd___2
    Nach dem Login kopieren

    应该采取哪些有效的方法来防止SQL注入?

    最佳回答(来自Theo):

    使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。 你有两种选择来实现该方法:

    1、使用PDO:

    ___FCKpd___3
    Nach dem Login kopieren

    2、使用mysqli:

    ___FCKpd___4
    Nach dem Login kopieren

    PDO

    注意,在默认情况使用PDO并没有让MySQL数据库执行真正的预处理语句(原因见下文)。为了解决这个问题,你应该禁止PDO模拟预处理语句。一个正确使用PDO创建数据库连接的例子如下:

    ___FCKpd___5
    Nach dem Login kopieren

    在上面的例子中,报错模式(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
    Nach dem Login kopieren
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Nginx-Grundkenntnisse zur Sicherheit: Verhindern von SQL-Injection-Angriffen Nginx-Grundkenntnisse zur Sicherheit: Verhindern von SQL-Injection-Angriffen Jun 10, 2023 pm 12:31 PM

    Nginx ist ein schneller, leistungsstarker und skalierbarer Webserver, und seine Sicherheit ist ein Problem, das bei der Entwicklung von Webanwendungen nicht ignoriert werden darf. Insbesondere SQL-Injection-Angriffe, die Webanwendungen großen Schaden zufügen können. In diesem Artikel besprechen wir, wie man mit Nginx SQL-Injection-Angriffe verhindert und so die Sicherheit von Webanwendungen schützt. Was ist ein SQL-Injection-Angriff? Der SQL-Injection-Angriff ist eine Angriffsmethode, die Schwachstellen in Webanwendungen ausnutzt. Angreifer können Schadcode in Webanwendungen einschleusen

    So verwenden Sie exp für die SQL-Fehlerinjektion So verwenden Sie exp für die SQL-Fehlerinjektion May 12, 2023 am 10:16 AM

    0x01 Vorwort Übersicht Der Herausgeber hat einen weiteren doppelten Datenüberlauf in MySQL entdeckt. Wenn wir die Funktionen in MySQL erhalten, interessiert sich der Editor mehr für die mathematischen Funktionen. Sie sollten auch einige Datentypen zum Speichern von Werten enthalten. Daher führte der Editor einen Test durch, um festzustellen, welche Funktionen Überlauffehler verursachen würden. Dann stellte der Editor fest, dass die Funktion exp() einen Überlauffehler verursacht, wenn ein Wert größer als 709 übergeben wird. mysql>selectexp(709);+---------+|exp(709)|+---------- - -----------+|8.218407461554972

    PHP-Programmiertipps: So verhindern Sie SQL-Injection-Angriffe PHP-Programmiertipps: So verhindern Sie SQL-Injection-Angriffe Aug 17, 2023 pm 01:49 PM

    PHP-Programmiertipps: So verhindern Sie SQL-Injection-Angriffe Sicherheit ist bei der Durchführung von Datenbankoperationen von entscheidender Bedeutung. SQL-Injection-Angriffe sind ein häufiger Netzwerkangriff, der die unsachgemäße Verarbeitung von Benutzereingaben durch eine Anwendung ausnutzt, was dazu führt, dass bösartiger SQL-Code eingefügt und ausgeführt wird. Um unsere Anwendung vor SQL-Injection-Angriffen zu schützen, müssen wir einige Vorsichtsmaßnahmen treffen. Verwenden Sie parametrisierte Abfragen. Parametrisierte Abfragen sind die einfachste und effektivste Möglichkeit, SQL-Injection-Angriffe zu verhindern. Es funktioniert durch den Vergleich vom Benutzer eingegebener Werte mit einer SQL-Abfrage

    Erkennung und Reparatur von PHP-SQL-Injection-Schwachstellen Erkennung und Reparatur von PHP-SQL-Injection-Schwachstellen Aug 08, 2023 pm 02:04 PM

    Überblick über die Erkennung und Behebung von PHP-SQL-Injection-Schwachstellen: SQL-Injection bezeichnet eine Angriffsmethode, bei der Angreifer Webanwendungen verwenden, um böswillig SQL-Code in die Eingabe einzuschleusen. PHP ist eine in der Webentwicklung weit verbreitete Skriptsprache und wird häufig zur Entwicklung dynamischer Websites und Anwendungen verwendet. Aufgrund der Flexibilität und Benutzerfreundlichkeit von PHP ignorieren Entwickler jedoch häufig die Sicherheit, was zur Entstehung von SQL-Injection-Schwachstellen führt. In diesem Artikel wird beschrieben, wie SQL-Injection-Schwachstellen in PHP erkannt und behoben werden, und es werden relevante Codebeispiele bereitgestellt. überprüfen

    Laravel-Entwicklungshinweise: Methoden und Techniken zur Verhinderung von SQL-Injection Laravel-Entwicklungshinweise: Methoden und Techniken zur Verhinderung von SQL-Injection Nov 22, 2023 pm 04:56 PM

    Hinweise zur Laravel-Entwicklung: Methoden und Techniken zur Verhinderung von SQL-Injection Mit der Entwicklung des Internets und der kontinuierlichen Weiterentwicklung der Computertechnologie ist die Entwicklung von Webanwendungen immer häufiger geworden. Während des Entwicklungsprozesses war Sicherheit schon immer ein wichtiges Thema, das Entwickler nicht ignorieren können. Unter anderem ist die Verhinderung von SQL-Injection-Angriffen eines der Sicherheitsprobleme, das während des Entwicklungsprozesses besondere Aufmerksamkeit erfordert. In diesem Artikel werden verschiedene Methoden und Techniken vorgestellt, die häufig in der Laravel-Entwicklung verwendet werden, um Entwicklern dabei zu helfen, SQL-Injection wirksam zu verhindern. Parameterbindung verwenden Die Parameterbindung ist Lar

    So verhindern Sie SQL-Injection-Angriffe mit PHP So verhindern Sie SQL-Injection-Angriffe mit PHP Jun 24, 2023 am 10:31 AM

    Im Bereich der Netzwerksicherheit sind SQL-Injection-Angriffe eine gängige Angriffsmethode. Es nutzt von böswilligen Benutzern übermittelten Schadcode aus, um das Verhalten einer Anwendung zu ändern und unsichere Vorgänge auszuführen. Zu den gängigen SQL-Injection-Angriffen gehören Abfragevorgänge, Einfügevorgänge und Löschvorgänge. Unter diesen werden Abfrageoperationen am häufigsten angegriffen, und eine gängige Methode zur Verhinderung von SQL-Injection-Angriffen ist die Verwendung von PHP. PHP ist eine häufig verwendete serverseitige Skriptsprache, die häufig in Webanwendungen verwendet wird. PHP kann mit MySQL usw. zusammenhängen.

    PHP-Formularfilterung: Verhinderung und Filterung von SQL-Injections PHP-Formularfilterung: Verhinderung und Filterung von SQL-Injections Aug 07, 2023 pm 03:49 PM

    PHP-Formularfilterung: Verhinderung und Filterung von SQL-Injections Einführung: Mit der rasanten Entwicklung des Internets ist die Entwicklung von Webanwendungen immer häufiger geworden. In der Webentwicklung sind Formulare eine der häufigsten Formen der Benutzerinteraktion. Allerdings bestehen bei der Verarbeitung der Daten zur Formularübermittlung Sicherheitsrisiken. Eines der häufigsten Risiken sind SQL-Injection-Angriffe. Ein SQL-Injection-Angriff ist eine Angriffsmethode, bei der eine Webanwendung dazu verwendet wird, Benutzereingabedaten falsch zu verarbeiten, sodass der Angreifer nicht autorisierte Datenbankabfragen durchführen kann. Der Angreifer passiert die

    Gegenmaßnahmen gegen SQL-Injection-Schwachstellen in PHP Gegenmaßnahmen gegen SQL-Injection-Schwachstellen in PHP Aug 09, 2023 pm 03:09 PM

    SQL-Injection ist eine gängige Netzwerkangriffsmethode, die die unvollständige Verarbeitung von Eingabedaten durch die Anwendung nutzt, um erfolgreich schädliche SQL-Anweisungen in die Datenbank einzuschleusen. Diese Angriffsmethode kommt besonders häufig bei Anwendungen vor, die mit der PHP-Sprache entwickelt wurden, da PHP normalerweise relativ schwach mit Benutzereingaben umgeht. In diesem Artikel werden einige Strategien zum Umgang mit SQL-Injection-Schwachstellen vorgestellt und PHP-Codebeispiele bereitgestellt. Verwendung vorbereiteter Anweisungen Vorbereitete Anweisungen sind eine empfohlene Methode zum Schutz vor SQL-Injection. Es verwendet Bindungsparameter, um Eingabedaten zu kombinieren

    See all articles