PHP Codeigniter SQL Injection (MSSQL) [Duplikat]
Ich habe den Bericht erhalten, dass meine Abfrage SQL-Injection enthält. Ich würde Ihre Hilfe benötigen, um ein Problem zu überprüfen:
- Ich habe dies als Einfügeanweisung verwendet
function insert($table_name, $insert_data)
{
$this->db->set($insert_data);
if ($this->db->insert($table_name)) {
return TRUE;
} else {
return FALSE;
}
}
Zum Beispiel:
$name = 'iamklll'; $status = 1;
$insert_data = array( 'name' => $name,
'status' => $status, ); $this->model->insert('table', $insert_data);
Diese Art von Methode kann die SQL-Injection nicht verhindern? Wenn dies nicht verhindern kann, denke ich, sind Abfragebindungen der beste Weg?
Wie verhindere ich die SQL-Injection, wenn das $ POST ['column'] ein Array ist?
Wie werden die Daten so gespeichert, als ob die Person sie einfügt
test"><h1>eee</h1>? Soll ichhtmlspecialcharszum Speichern in der Datenbank verwenden?
Antworten
In Ihrem Fall verwenden Sie den Abfrage-Generator $ this-> db-> insert (). Dadurch wird eine Einfügezeichenfolge basierend auf den von Ihnen angegebenen Daten generiert und die Abfrage ausgeführt. Sie können entweder ein Array oder ein Objekt an die Funktion übergeben. Alle Werte werden automatisch maskiert, was zu sichereren Abfragen führt.
Dies ist meiner Meinung nach die beste Option. Besser als die Verwendung der Abfragebindungen, insbesondere weil Sie auf lange Sicht möglicherweise von MSSQL zu mySQL oder einer anderen Engine wechseln müssen und nichts in Ihrem Code ändern müssen.
Da Sie Codeigniter 3 verwenden, müssen Sie Ihre Daten vor dem Einfügen überprüfen.
Verwenden Sie dazu die Formularvalidierung: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation
Aus Ihrem Beispiel geht hervor, dass Sie sich auch auf xxs-Angriffe beziehen. Wenn dies der Fall ist, haben Sie zwei Möglichkeiten. Sie können dies tun, während Sie Ihre Daten mit der Formularvalidierung mithilfe der XSS-Regel validieren. Oder Sie können dies global in Ihrer Anwendung / config / config.php aktivieren
$config['global_xss_filtering'] = true;
Da es sich um den Schutz Ihrer App handelt, sollten Sie auch die Verwendung der CSRF-Einstellungen in Codeigniter in Betracht ziehen. Dies kann auch in Ihrer Datei config.php erfolgen.
/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
*/
$config['csrf_protection'] = true; $config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true; $config['csrf_exclude_uris'] = array();
In Ihrem Fall ist die Verwendung des Abfrage-Generators in Ordnung, um eine SQL-Injection zu verhindern, nach der Sie tatsächlich suchen.
Sie beziehen sich auf die Active Record-Klasse. Es verfügt über einen eigenen Abfrage-Generator und soll Sie vor SQL-Injektionen aus der Box schützen.
How to store the data as if the person insert test"><h1>eee</h1>
Ich denke, Sie beziehen sich auf einen XSS-Angriff. Ich glaube, dass es die beste Vorgehensweise ist , alle Tags außer den zulässigen Tags zu entfernen . Ich denke htmlspecialchars, dass dies hier nicht viel Sinn macht, wenn Sie die Ausgabe rückwärts konvertieren.