# Writing

## Injection Warning

When opening a CSV in an external program, a formula in a field could be ran that contains a vulnerability. Read more here: CSV Injection. Due to this issue, there is a setting `InjectionOptions` that can be configured.

The list of injection characters to detect are configurable in `CsvConfiguration.InjectionCharacters` and default to `=`, `@`, `+`, `-`, `\t`, `\r`. An injection character can be the first character of a field or quoted field. i.e. `=foo` or `"=foo"`

The `InjectionOptions` values are `None` (default), `Escape`, `Strip`, and `Exception`.

###### None

No injection protection is taken.

###### Exception

If an injection character is detected, a `CsvWriterException` is thrown.

###### Strip

All injection characters at the start of a field will be removed. `===foo` will be stripped to `foo`.

###### Escape

If an injection character is detected, the field will be prepended with the `InjectionEscapeCharacter` that defaults to `'`. The field will be quoted if it is not already.

`=one` -> `"'=one"`

`"=one"` -> `"'=one"`

`=one"two` -> `"'=one""two"`

This option is disabled by default because the primary goal if this library is to read and write CSV files. If you are storing user entered data that you haven't sanitized yourself and you're letting it be accessed by people that may open in Excel/Sheets/etc, you might consider enabling this feature. The `InjectionEscapeCharacter` is not removed when reading.

When writing, you can throw an enumerable of class objects, dynamic objects, anonymous type objects, or pretty much anything else, and it will get written.

Topics |
--- | ---
Write Class Objects |
Write Dynamic Objects |
Write Anonymous Type Objects |
Appending to an Existing File |